Support for #pragma region/endregion for MSVC compatibility. Patch thanks to pravic!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169028 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Aaron Ballman 2012-11-30 19:52:30 +00:00
parent 87e2cfcec7
commit fafd101e6b
2 changed files with 58 additions and 0 deletions

View File

@ -1203,6 +1203,29 @@ struct PragmaARCCFCodeAuditedHandler : public PragmaHandler {
}
};
/// \brief Handle "\#pragma region [...]"
///
/// The syntax is
/// \code
/// \#pragma region [optional name]
/// \#pragma endregion [optional comment]
/// \endcode
///
/// \note This is
/// <a href="http://msdn.microsoft.com/en-us/library/b6xkz944(v=vs.80).aspx">editor-only</a>
/// pragma, just skipped by compiler.
struct PragmaRegionHandler : public PragmaHandler {
PragmaRegionHandler(const char *pragma) : PragmaHandler(pragma) { }
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
Token &NameTok) {
// #pragma region: endregion matches can be verified
// __pragma(region): no sense, but ignored by msvc
// _Pragma is not valid for MSVC, but there isn't any point
// to handle a _Pragma differently.
}
};
} // end anonymous namespace
@ -1236,5 +1259,7 @@ void Preprocessor::RegisterBuiltinPragmas() {
if (LangOpts.MicrosoftExt) {
AddPragmaHandler(new PragmaCommentHandler());
AddPragmaHandler(new PragmaIncludeAliasHandler());
AddPragmaHandler(new PragmaRegionHandler("region"));
AddPragmaHandler(new PragmaRegionHandler("endregion"));
}
}

View File

@ -0,0 +1,33 @@
/* Test pragma region directive from
http://msdn.microsoft.com/en-us/library/b6xkz944(v=vs.80).aspx */
// Editor-only pragma, just skipped by compiler.
// Syntax:
// #pragma region optional name
// #pragma endregion optional comment
//
// RUN: %clang_cc1 -fsyntax-only -verify -Wall -fms-extensions %s
#pragma region
/* inner space */
#pragma endregion
#pragma region long name
/* inner space */
void foo(void){}
#pragma endregion long comment
void inner();
__pragma(region) // no sense, but ignored
_Pragma("region")// ditto
#pragma region2 // expected-warning {{unknown pragma ignored}}
#pragma region one
#pragma region inner
//#pragma endregion inner
#pragma endregion end
// {{unclosed pragma region}} - region mismatches is not detected yet