]> granicus.if.org Git - clang/commitdiff
Parse: Don't crash when an annotation token shows up in a C++11 attr
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 9 Jan 2015 18:09:39 +0000 (18:09 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 9 Jan 2015 18:09:39 +0000 (18:09 +0000)
It's not safe to blindly call getIdentifierInfo without checking the
token is not an annotation token.

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

lib/Parse/ParseDeclCXX.cpp
test/Parser/cxx0x-attributes.cpp

index 1c38979faef9a371003994ade718fea9c454982a..10568b3671b5a2f6837cd91cd585f77b99f356f4 100644 (file)
@@ -3386,9 +3386,11 @@ IdentifierInfo *Parser::TryParseCXX11AttributeIdentifier(SourceLocation &Loc) {
   switch (Tok.getKind()) {
   default:
     // Identifiers and keywords have identifier info attached.
-    if (IdentifierInfo *II = Tok.getIdentifierInfo()) {
-      Loc = ConsumeToken();
-      return II;
+    if (!Tok.isAnnotation()) {
+      if (IdentifierInfo *II = Tok.getIdentifierInfo()) {
+        Loc = ConsumeToken();
+        return II;
+      }
     }
     return nullptr;
 
index 9dbefb0f4830197e13d32f13d297bdd15db1c5be..c68a119fc740831bac6a346aba112094f91e01c0 100644 (file)
@@ -334,3 +334,10 @@ namespace {
   [[deprecated()]] void foo(); // expected-error {{parentheses must be omitted if 'deprecated' attribute's argument list is empty}}
   [[gnu::deprecated()]] void quux();
 }
+
+namespace {
+[[ // expected-error {{expected ']'}}
+#pragma pack(pop)
+deprecated
+]] void bad();
+}