From 672edb0a04a5273e3a501f3b196844c125290780 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 22 Feb 2013 09:15:49 +0000 Subject: [PATCH] Don't accidentally and silently accept C++11 attributes in decl-specifier-seqs in C++98. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175879 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseDecl.cpp | 2 +- lib/Parse/ParseDeclCXX.cpp | 2 ++ test/Parser/cxx-decl.cpp | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 8ac3c504e2..6ab1540134 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -2197,7 +2197,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, case tok::l_square: case tok::kw_alignas: - if (!isCXX11AttributeSpecifier()) + if (!getLangOpts().CPlusPlus11 || !isCXX11AttributeSpecifier()) goto DoneWithDeclSpec; ProhibitAttributes(attrs); diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 90926a362b..f040b9bfff 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -3186,6 +3186,8 @@ void Parser::ParseCXX11AttributeSpecifier(ParsedAttributes &attrs, /// attribute-specifier-seq[opt] attribute-specifier void Parser::ParseCXX11Attributes(ParsedAttributesWithRange &attrs, SourceLocation *endLoc) { + assert(getLangOpts().CPlusPlus11); + SourceLocation StartLoc = Tok.getLocation(), Loc; if (!endLoc) endLoc = &Loc; diff --git a/test/Parser/cxx-decl.cpp b/test/Parser/cxx-decl.cpp index 24ba127515..41d305b176 100644 --- a/test/Parser/cxx-decl.cpp +++ b/test/Parser/cxx-decl.cpp @@ -184,6 +184,9 @@ namespace PR15017 { template struct S {}; // expected-error {{'PR15017::X' can not be defined in a type specifier}} } +// Ensure we produce at least some diagnostic for attributes in C++98. +[[]] struct S; // expected-error 2{{}} + // PR8380 extern "" // expected-error {{unknown linkage language}} test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} \ -- 2.40.0