Emit final macro diagnostics in system headers
authorChris Bieneman <chris.bieneman@me.com>
Thu, 11 Nov 2021 19:50:49 +0000 (13:50 -0600)
committerChris Bieneman <chris.bieneman@me.com>
Thu, 11 Nov 2021 19:51:26 +0000 (13:51 -0600)
Final macro diagnostics should log from system headers.

As planned, final macros are hard-mode. They always log diagnostics.

clang/include/clang/Basic/DiagnosticLexKinds.td
clang/test/Lexer/Inputs/final-macro-system.h [new file with mode: 0644]
clang/test/Lexer/final-macro.c

index 92c6b0b..805dcab 100644 (file)
@@ -564,7 +564,7 @@ def note_pp_macro_annotation :
 def warn_pragma_final_macro :
   ExtWarn<"macro %0 has been marked as final and should not be "
           "%select{undefined|redefined}1">,
-  InGroup<FinalMacro>;
+  InGroup<FinalMacro>,  ShowInSystemHeader;
 
 // - #pragma execution_character_set(...)
 def warn_pragma_exec_charset_expected :
diff --git a/clang/test/Lexer/Inputs/final-macro-system.h b/clang/test/Lexer/Inputs/final-macro-system.h
new file mode 100644 (file)
index 0000000..f30e5d4
--- /dev/null
@@ -0,0 +1,4 @@
+// expected-warning@+1{{macro 'SYSTEM_MACRO' has been marked as final and should not be undefined}}
+#undef SYSTEM_MACRO
+// expected-warning@+1{{macro 'SYSTEM_MACRO' has been marked as final and should not be redefined}}
+#define SYSTEM_MACRO WoahMoar
index 498773d..2992714 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -Wfinal-macro %s -fsyntax-only -verify
+// RUN: %clang_cc1 -Wfinal-macro %s -fsyntax-only -isystem %S/Inputs -verify
 
 // Test warning production
 #define Foo 1
@@ -43,3 +43,8 @@
 // no diagnostics triggered by these pragmas.
 #pragma clang deprecated(Foo)
 #pragma clang restrict_expansion(Foo)
+
+#define SYSTEM_MACRO Woah
+// expected-note@+1 2{{macro marked 'final' here}}
+#pragma clang final(SYSTEM_MACRO)
+#include <final-macro-system.h>