[clang] 24037c3 - Add support for #pragma system_header with -fms-extensions

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 23 04:31:25 PDT 2021


Author: Hans Wennborg
Date: 2021-06-23T13:26:03+02:00
New Revision: 24037c37b6c4043faae7bf396b735e1ba36e46e0

URL: https://github.com/llvm/llvm-project/commit/24037c37b6c4043faae7bf396b735e1ba36e46e0
DIFF: https://github.com/llvm/llvm-project/commit/24037c37b6c4043faae7bf396b735e1ba36e46e0.diff

LOG: Add support for #pragma system_header with -fms-extensions

Clang already supports the pragma prefixed by "GCC" or "clang".

MSVC has more recently added support for the pragma, but without any prefix; see
https://devblogs.microsoft.com/cppblog/broken-warnings-theory/#external-headers

Differential revision: https://reviews.llvm.org/D104770

Added: 
    clang/test/Preprocessor/Inputs/pragma_sysheader.h

Modified: 
    clang/lib/Lex/Pragma.cpp
    clang/test/Lexer/pragma-operators.cpp
    clang/test/Preprocessor/pragma_sysheader.c

Removed: 
    clang/test/Preprocessor/pragma_sysheader.h


################################################################################
diff  --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index 5b42241a32c2e..081b92ac21d9a 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -1955,6 +1955,7 @@ void Preprocessor::RegisterBuiltinPragmas() {
     AddPragmaHandler(new PragmaExecCharsetHandler());
     AddPragmaHandler(new PragmaIncludeAliasHandler());
     AddPragmaHandler(new PragmaHdrstopHandler());
+    AddPragmaHandler(new PragmaSystemHeaderHandler());
   }
 
   // Pragmas added by plugins

diff  --git a/clang/test/Lexer/pragma-operators.cpp b/clang/test/Lexer/pragma-operators.cpp
index 4d288c9372d64..d9c3d36d78704 100644
--- a/clang/test/Lexer/pragma-operators.cpp
+++ b/clang/test/Lexer/pragma-operators.cpp
@@ -19,7 +19,7 @@ B(foo)
 #pragma warning(pop)
 
 #define pragma_L _Pragma(L"GCC diagnostic push")
-#define pragma_u8 _Pragma(u8"system_header")
+#define pragma_u8 _Pragma(u8"pack(1)")
 #define pragma_u _Pragma(u"GCC diagnostic pop")
 #define pragma_U _Pragma(U"comment(lib, \"libfoo\")")
 #define pragma_R _Pragma(R"(clang diagnostic ignored "-Wunused")")
@@ -27,7 +27,7 @@ B(foo)
 #define pragma_hello _Pragma(u8R"x(message R"y("Hello", world!)y")x")
 // CHECK: int n =
 // CHECK: #pragma GCC diagnostic push
-// CHECK: #pragma system_header
+// CHECK: #pragma pack(1)
 // CHECK: #pragma GCC diagnostic pop
 // CHECK: #pragma comment(lib, "libfoo")
 // CHECK: #pragma clang diagnostic ignored "-Wunused"

diff  --git a/clang/test/Preprocessor/Inputs/pragma_sysheader.h b/clang/test/Preprocessor/Inputs/pragma_sysheader.h
new file mode 100644
index 0000000000000..7352370e724b4
--- /dev/null
+++ b/clang/test/Preprocessor/Inputs/pragma_sysheader.h
@@ -0,0 +1,19 @@
+#if defined(CLANG)
+#pragma clang system_header
+// expected-no-diagnostics
+#elif defined(GCC)
+#pragma GCC system_header
+// expected-no-diagnostics
+#elif defined(MS)
+#pragma system_header
+// expected-no-diagnostics
+#else
+// expected-warning at +1{{unknown pragma ignored}}
+#pragma system_header
+
+// expected-note at +4{{previous definition is here}}
+// expected-warning at +4{{redefinition of typedef 'x' is a C11 feature}}
+#endif
+
+typedef int x;
+typedef int x;

diff  --git a/clang/test/Preprocessor/pragma_sysheader.c b/clang/test/Preprocessor/pragma_sysheader.c
index 3c94363152af7..421bfb839ee30 100644
--- a/clang/test/Preprocessor/pragma_sysheader.c
+++ b/clang/test/Preprocessor/pragma_sysheader.c
@@ -1,13 +1,15 @@
-// RUN: %clang_cc1 -verify -pedantic %s -fsyntax-only
-// RUN: %clang_cc1 -E %s | FileCheck %s
-// expected-no-diagnostics
-// rdar://6899937
-#include "pragma_sysheader.h"
+// RUN: %clang_cc1 -verify -std=c99 -Wunknown-pragmas -pedantic %s -fsyntax-only
+// RUN: %clang_cc1 -verify -std=c99 -Wunknown-pragmas -pedantic %s -fsyntax-only -DGCC
+// RUN: %clang_cc1 -verify -std=c99 -Wunknown-pragmas -pedantic %s -fsyntax-only -DCLANG
+// RUN: %clang_cc1 -verify -std=c99 -Wunknown-pragmas -pedantic %s -fsyntax-only -fms-extensions -DMS
 
+// rdar://6899937
+#include "Inputs/pragma_sysheader.h"
 
+// RUN: %clang_cc1 -E %s | FileCheck %s
 // PR9861: Verify that line markers are not messed up in -E mode.
 // CHECK: # 1 "{{.*}}pragma_sysheader.h" 1
-// CHECK-NEXT: # 2 "{{.*}}pragma_sysheader.h" 3
-// CHECK-NEXT: typedef int x;
-// CHECK-NEXT: typedef int x;
-// CHECK-NEXT: # 6 "{{.*}}pragma_sysheader.c" 2
+// CHECK-NEXT: # 12 "{{.*}}pragma_sysheader.h"
+// CHECK: typedef int x;
+// CHECK: typedef int x;
+// CHECK-NEXT: # 8 "{{.*}}pragma_sysheader.c" 2

diff  --git a/clang/test/Preprocessor/pragma_sysheader.h b/clang/test/Preprocessor/pragma_sysheader.h
deleted file mode 100644
index b79bde584a98b..0000000000000
--- a/clang/test/Preprocessor/pragma_sysheader.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma GCC system_header
-typedef int x;
-typedef int x;
-


        


More information about the cfe-commits mailing list