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.

llvm-svn: 225533

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

index 1c38979..10568b3 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 9dbefb0..c68a119 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();
+}