forked from OSchip/llvm-project
Fix backwards warning for use of C++17 attributes-on-namespaces-and-enumerators feature.
llvm-svn: 315784
This commit is contained in:
parent
ab3a464482
commit
40e202f7d9
|
@ -558,10 +558,13 @@ def warn_cxx98_compat_noexcept_expr : Warning<
|
|||
def warn_cxx98_compat_nullptr : Warning<
|
||||
"'nullptr' is incompatible with C++98">, InGroup<CXX98Compat>, DefaultIgnore;
|
||||
|
||||
def warn_cxx14_compat_attribute : Warning<
|
||||
def ext_ns_enum_attribute : Extension<
|
||||
"attributes on %select{a namespace|an enumerator}0 declaration are "
|
||||
"a C++17 extension">, InGroup<CXX17>;
|
||||
def warn_cxx14_compat_ns_enum_attribute : Warning<
|
||||
"attributes on %select{a namespace|an enumerator}0 declaration are "
|
||||
"incompatible with C++ standards before C++17">,
|
||||
InGroup<CXXPre17Compat>, DefaultIgnore;
|
||||
InGroup<CXXPre17CompatPedantic>, DefaultIgnore;
|
||||
def warn_cxx98_compat_alignas : Warning<"'alignas' is incompatible with C++98">,
|
||||
InGroup<CXX98Compat>, DefaultIgnore;
|
||||
def warn_cxx98_compat_attribute : Warning<
|
||||
|
|
|
@ -4413,9 +4413,10 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {
|
|||
MaybeParseGNUAttributes(attrs);
|
||||
ProhibitAttributes(attrs); // GNU-style attributes are prohibited.
|
||||
if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
|
||||
if (!getLangOpts().CPlusPlus1z)
|
||||
Diag(Tok.getLocation(), diag::warn_cxx14_compat_attribute)
|
||||
<< 1 /*enumerator*/;
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
|
||||
? diag::warn_cxx14_compat_ns_enum_attribute
|
||||
: diag::ext_ns_enum_attribute)
|
||||
<< 1 /*enumerator*/;
|
||||
ParseCXX11Attributes(attrs);
|
||||
}
|
||||
|
||||
|
|
|
@ -77,9 +77,10 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(unsigned Context,
|
|||
ParsedAttributesWithRange attrs(AttrFactory);
|
||||
SourceLocation attrLoc;
|
||||
if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
|
||||
if (!getLangOpts().CPlusPlus1z)
|
||||
Diag(Tok.getLocation(), diag::warn_cxx14_compat_attribute)
|
||||
<< 0 /*namespace*/;
|
||||
Diag(Tok.getLocation(), getLangOpts().CPlusPlus1z
|
||||
? diag::warn_cxx14_compat_ns_enum_attribute
|
||||
: diag::ext_ns_enum_attribute)
|
||||
<< 0 /*namespace*/;
|
||||
attrLoc = Tok.getLocation();
|
||||
ParseCXX11Attributes(attrs);
|
||||
}
|
||||
|
|
|
@ -127,7 +127,7 @@ extern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}}
|
|||
[[]] using ns::i; // expected-error {{an attribute list cannot appear here}}
|
||||
[[unknown]] using namespace ns; // expected-warning {{unknown attribute 'unknown' ignored}}
|
||||
[[noreturn]] using namespace ns; // expected-error {{'noreturn' attribute only applies to functions}}
|
||||
namespace [[]] ns2 {} // expected-warning {{attributes on a namespace declaration are incompatible with C++ standards before C++17}}
|
||||
namespace [[]] ns2 {} // expected-warning {{attributes on a namespace declaration are a C++17 extension}}
|
||||
|
||||
using [[]] alignas(4) [[]] ns::i; // expected-error {{an attribute list cannot appear here}}
|
||||
using [[]] alignas(4) [[]] foobar = int; // expected-error {{an attribute list cannot appear here}} expected-error {{'alignas' attribute only applies to}}
|
||||
|
@ -179,7 +179,7 @@ enum [[]] E2; // expected-error {{forbids forward references}}
|
|||
enum [[]] E1;
|
||||
enum [[]] E3 : int;
|
||||
enum [[]] {
|
||||
k_123 [[]] = 123 // expected-warning {{attributes on an enumerator declaration are incompatible with C++ standards before C++17}}
|
||||
k_123 [[]] = 123 // expected-warning {{attributes on an enumerator declaration are a C++17 extension}}
|
||||
};
|
||||
enum [[]] E1 e; // expected-error {{an attribute list cannot appear here}}
|
||||
enum [[]] class E4 { }; // expected-error {{an attribute list cannot appear here}}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -std=c++98 -Wc++11-compat -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++11-compat -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++98 -Wc++11-compat-pedantic -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++11-compat-pedantic -verify %s
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
|
||||
|
@ -52,4 +52,7 @@ static_assert(true); // expected-warning {{incompatible with C++ standards befor
|
|||
|
||||
template<int ...N> int f() { return (N + ...); } // expected-warning {{incompatible with C++ standards before C++17}}
|
||||
|
||||
namespace [[]] NS_with_attr {} // expected-warning {{incompatible with C++ standards before C++17}}
|
||||
enum { e [[]] }; // expected-warning {{incompatible with C++ standards before C++17}}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue