mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 15:36:07 +00:00
Downgrade bogus ExtWarn on duplicate 'friend' specifier to a Warning, and add a
Warning for a duplicate 'constexpr' specifier. llvm-svn: 198956
This commit is contained in:
parent
78dcc03c37
commit
c0a5d5bc4f
@ -827,7 +827,12 @@ bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
|
|||||||
unsigned &DiagID) {
|
unsigned &DiagID) {
|
||||||
if (Friend_specified) {
|
if (Friend_specified) {
|
||||||
PrevSpec = "friend";
|
PrevSpec = "friend";
|
||||||
DiagID = diag::ext_duplicate_declspec;
|
// Keep the later location, so that we can later diagnose ill-formed
|
||||||
|
// declarations like 'friend class X friend;'. Per [class.friend]p3,
|
||||||
|
// 'friend' must be the first token in a friend declaration that is
|
||||||
|
// not a function declaration.
|
||||||
|
FriendLoc = Loc;
|
||||||
|
DiagID = diag::warn_duplicate_declspec;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -850,7 +855,13 @@ bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
|
|||||||
|
|
||||||
bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
|
bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
|
||||||
unsigned &DiagID) {
|
unsigned &DiagID) {
|
||||||
// 'constexpr constexpr' is ok.
|
// 'constexpr constexpr' is ok, but warn as this is likely not what the user
|
||||||
|
// intended.
|
||||||
|
if (Constexpr_specified) {
|
||||||
|
DiagID = diag::warn_duplicate_declspec;
|
||||||
|
PrevSpec = "constexpr";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
Constexpr_specified = true;
|
Constexpr_specified = true;
|
||||||
ConstexprLoc = Loc;
|
ConstexprLoc = Loc;
|
||||||
return false;
|
return false;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic -fcxx-exceptions -fexceptions %s
|
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic-errors -fcxx-exceptions -fexceptions %s
|
||||||
|
|
||||||
const char const *x10; // expected-warning {{duplicate 'const' declaration specifier}}
|
const char const *x10; // expected-error {{duplicate 'const' declaration specifier}}
|
||||||
|
|
||||||
int x(*g); // expected-error {{use of undeclared identifier 'g'}}
|
int x(*g); // expected-error {{use of undeclared identifier 'g'}}
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ class asm_class_test {
|
|||||||
void foo() __asm__("baz");
|
void foo() __asm__("baz");
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { fooenum = 1, }; // expected-warning {{commas at the end of enumerator lists are a C++11 extension}}
|
enum { fooenum = 1, }; // expected-error {{commas at the end of enumerator lists are a C++11 extension}}
|
||||||
|
|
||||||
struct a {
|
struct a {
|
||||||
int Type : fooenum;
|
int Type : fooenum;
|
||||||
@ -81,7 +81,7 @@ namespace Commas {
|
|||||||
(global5),
|
(global5),
|
||||||
*global6,
|
*global6,
|
||||||
&global7 = global1,
|
&global7 = global1,
|
||||||
&&global8 = static_cast<int&&>(global1), // expected-warning 2{{rvalue reference}}
|
&&global8 = static_cast<int&&>(global1), // expected-error 2{{rvalue reference}}
|
||||||
S::a,
|
S::a,
|
||||||
global9,
|
global9,
|
||||||
global10 = 0,
|
global10 = 0,
|
||||||
@ -212,14 +212,14 @@ namespace PR5066 {
|
|||||||
template<typename T> struct X {};
|
template<typename T> struct X {};
|
||||||
X<int N> x; // expected-error {{type-id cannot have a name}}
|
X<int N> x; // expected-error {{type-id cannot have a name}}
|
||||||
|
|
||||||
using T = int (*T)(); // expected-error {{type-id cannot have a name}} expected-warning {{C++11}}
|
using T = int (*T)(); // expected-error {{type-id cannot have a name}} expected-error {{C++11}}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace PR17255 {
|
namespace PR17255 {
|
||||||
void foo() {
|
void foo() {
|
||||||
typename A::template B<>; // expected-error {{use of undeclared identifier 'A'}} \
|
typename A::template B<>; // expected-error {{use of undeclared identifier 'A'}} \
|
||||||
// expected-error {{expected a qualified name after 'typename'}} \
|
// expected-error {{expected a qualified name after 'typename'}} \
|
||||||
// expected-warning {{'template' keyword outside of a template}}
|
// expected-error {{'template' keyword outside of a template}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,6 +232,13 @@ namespace PR17567 {
|
|||||||
FooBar::~FooBar() {} // expected-error {{undeclared}} expected-error {{expected the class name}}
|
FooBar::~FooBar() {} // expected-error {{undeclared}} expected-error {{expected the class name}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace DuplicateFriend {
|
||||||
|
struct A {
|
||||||
|
friend void friend f(); // expected-warning {{duplicate 'friend' declaration specifier}}
|
||||||
|
friend struct B friend; // expected-warning {{duplicate 'friend' declaration specifier}}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// PR8380
|
// PR8380
|
||||||
extern "" // expected-error {{unknown linkage language}}
|
extern "" // expected-error {{unknown linkage language}}
|
||||||
test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} \
|
test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} \
|
||||||
|
@ -104,3 +104,14 @@ namespace UsingDeclAttrs {
|
|||||||
using [[gnu::aligned(1)]] T = int; // expected-error {{an attribute list cannot appear here}}
|
using [[gnu::aligned(1)]] T = int; // expected-error {{an attribute list cannot appear here}}
|
||||||
using T = int [[gnu::aligned(1)]]; // expected-error {{'aligned' attribute cannot be applied to types}}
|
using T = int [[gnu::aligned(1)]]; // expected-error {{'aligned' attribute cannot be applied to types}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace DuplicateSpecifier {
|
||||||
|
constexpr constexpr int f(); // expected-warning {{duplicate 'constexpr' declaration specifier}}
|
||||||
|
constexpr int constexpr a = 0; // expected-warning {{duplicate 'constexpr' declaration specifier}}
|
||||||
|
|
||||||
|
struct A {
|
||||||
|
friend constexpr int constexpr friend f(); // expected-warning {{duplicate 'friend' declaration specifier}} \
|
||||||
|
// expected-warning {{duplicate 'constexpr' declaration specifier}}
|
||||||
|
friend struct A friend; // expected-warning {{duplicate 'friend'}} expected-error {{'friend' must appear first}}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user