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