From fafd101e6b557595ffbb5e9e9b47a3fc0385dc19 Mon Sep 17 00:00:00 2001 From: Aaron Ballman <aaron@aaronballman.com> Date: Fri, 30 Nov 2012 19:52:30 +0000 Subject: [PATCH] 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 --- lib/Lex/Pragma.cpp | 25 +++++++++++++++++++++++++ test/Lexer/pragma-region.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 test/Lexer/pragma-region.c diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index 783588e1f7f..c1e90cc21eb 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 00000000000..502db22715a --- /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 -- GitLab