]> granicus.if.org Git - clang/commitdiff
Lex: Don't let annotation tokens get into macro expansion
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 28 Dec 2014 07:42:49 +0000 (07:42 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 28 Dec 2014 07:42:49 +0000 (07:42 +0000)
We'd let annotation tokens from '#pragma pack' and the like get inside a
function-like macro.  This would lead to terror and mayhem; stop the
madness early.

This fixes PR22037.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224896 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticLexKinds.td
lib/Lex/PPDirectives.cpp
test/Preprocessor/macro_arg_directive.c

index b9461c1a8330a8d73a46c841c660f7749fb1f032..93cc7c297813ffac145c8429ddc464cd4c3982bf 100644 (file)
@@ -332,7 +332,7 @@ def warn_cxx98_compat_variadic_macro : Warning<
   InGroup<CXX98CompatPedantic>, DefaultIgnore;
 def ext_named_variadic_macro : Extension<
   "named variadic macros are a GNU extension">, InGroup<VariadicMacros>;
-def err_embedded_include : Error<
+def err_embedded_directive : Error<
   "embedding a #%0 directive within macro arguments is not supported">;
 def ext_embedded_directive : Extension<
   "embedding a directive within macro arguments has undefined behavior">,
index 8f610b4e5d36d06e867c2265032abd43c1e686c7..bf0ce72f66681f23f318970f4dcd1889efd6307f 100644 (file)
@@ -798,7 +798,8 @@ void Preprocessor::HandleDirective(Token &Result) {
       case tok::pp_import:
       case tok::pp_include_next:
       case tok::pp___include_macros:
-        Diag(Result, diag::err_embedded_include) << II->getName();
+      case tok::pp_pragma:
+        Diag(Result, diag::err_embedded_directive) << II->getName();
         DiscardUntilEndOfDirective();
         return;
       default:
index 5bc2236f0c45710b9435fbad804216179ef574ef..21d1b20acf6681e6a508177287f599c8a8c3d8ac 100644 (file)
@@ -7,6 +7,11 @@ a(n =
   a);
 _Static_assert(n == 5, "");
 
+#define M(A)
+M(
+#pragma pack(pop) // expected-error {{embedding a #pragma directive within macro arguments is not supported}}
+)
+
 // header1.h
 void fail(const char *);
 #define MUNCH(...) \