From 86330afd355b8b31ae3b19e6d636dd3ce26d5ad6 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 29 Dec 2014 02:14:26 +0000 Subject: [PATCH] SemaCXX: Don't crash when annotation tokens show up before the tag name Clang has a hack to accept definitions of structs with tag names which have the same name as intrinsics. However, this hack didn't guard against annotation tokens showing up in the token stream. llvm-svn: 224909 --- clang/lib/Parse/ParseDeclCXX.cpp | 3 ++- clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index e2a51ecfca40..14fe9f7cf37f 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -1244,7 +1244,8 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation AttrFixitLoc = Tok.getLocation(); if (TagType == DeclSpec::TST_struct && - !Tok.is(tok::identifier) && + Tok.isNot(tok::identifier) && + !Tok.isAnnotation() && Tok.getIdentifierInfo() && (Tok.is(tok::kw___is_abstract) || Tok.is(tok::kw___is_arithmetic) || diff --git a/clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp b/clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp index 1ba3721c8c2e..8d187124f013 100644 --- a/clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp +++ b/clang/test/SemaCXX/libstdcxx_is_pod_hack.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only %s +// RUN: %clang_cc1 -fsyntax-only -verify %s // This is a test for an egregious hack in Clang that works around // issues with GCC's evolution. libstdc++ 4.2.x uses __is_pod as an @@ -7,7 +7,7 @@ // a keyword *unless* it is introduced following the struct keyword. template -struct __is_pod { +struct __is_pod { // expected-warning {{keyword '__is_pod' will be made available as an identifier}} __is_pod() {} }; @@ -15,7 +15,7 @@ __is_pod ipi; // Ditto for __is_same. template -struct __is_same { +struct __is_same { // expected-warning {{keyword '__is_same' will be made available as an identifier}} }; __is_same isi; @@ -24,7 +24,7 @@ __is_same isi; // trait in Embarcadero's compiler but is used as an identifier in // libstdc++. struct test_is_signed { - static const bool __is_signed = true; + static const bool __is_signed = true; // expected-warning {{keyword '__is_signed' will be made available as an identifier}} }; bool check_signed = test_is_signed::__is_signed; @@ -36,6 +36,13 @@ void foo() { bool b = __is_pod(int); must_be_true<__is_pod(int)> mbt; } + +// expected-warning@+1 {{declaration does not declare anything}} +struct // expected-error {{declaration of anonymous struct must be a definition}} +#pragma pack(pop) + S { +}; + #if !__has_feature(is_pod) # error __is_pod should still be available. #endif