diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index 783588e1f7f79b41dd030687d94f8b5b7b716e8f..c1e90cc21eb0be96f2d140e1b7a7808490b86448 100644 --- a/lib/Lex/Pragma.cpp +++ b/lib/Lex/Pragma.cpp @@ -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")); } } diff --git a/test/Lexer/pragma-region.c b/test/Lexer/pragma-region.c new file mode 100644 index 0000000000000000000000000000000000000000..502db22715a80aad12163d2fd73c452ed5fd5af9 --- /dev/null +++ b/test/Lexer/pragma-region.c @@ -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