mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 18:11:19 +00:00
If a function decl cannot be merged, mark it as invalid.
Clang currently crashes on class C { C() = default; C() = delete; }; My cunning plan for fixing this was to change the `if (!FnD)` in Parser::ParseCXXInlineMethodDef() to `if (!FnD || FnD->isInvalidDecl)` – but alas, the second constructor decl wasn't marked as invalid. This lets Sema::MergeFunctionDecl() return true on function redeclarations, which leads to them being marked invalid. This also improves error messages when functions are redeclared. llvm-svn: 226365
This commit is contained in:
parent
b6cb695135
commit
71e377d6ee
@ -2761,6 +2761,7 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD,
|
||||
<< New << New->getType();
|
||||
}
|
||||
Diag(OldLocation, PrevDiag) << Old << Old->getType();
|
||||
return true;
|
||||
|
||||
// Complain if this is an explicit declaration of a special
|
||||
// member that was initially declared implicitly.
|
||||
|
@ -10,8 +10,8 @@ class A {
|
||||
|
||||
template <class T>
|
||||
class B {
|
||||
void foo4() { } // expected-note {{previous definition is here}} expected-note {{previous definition is here}}
|
||||
void foo4() { } // expected-error {{class member cannot be redeclared}} expected-error {{redefinition of 'foo4'}}
|
||||
void foo4() { } // expected-note {{previous definition is here}}
|
||||
void foo4() { } // expected-error {{class member cannot be redeclared}}
|
||||
void foo5() { } // expected-note {{previous definition is here}}
|
||||
|
||||
friend void foo3() {
|
||||
|
@ -110,8 +110,8 @@ namespace ellipsis {
|
||||
template<typename...T>
|
||||
struct S {
|
||||
void e(S::S());
|
||||
void f(S(...args[sizeof(T)])); // expected-note {{here}}
|
||||
void f(S(...args)[sizeof(T)]); // expected-error {{redeclared}} expected-note {{here}}
|
||||
void f(S(...args[sizeof(T)])); // expected-note {{here}} expected-note {{here}}
|
||||
void f(S(...args)[sizeof(T)]); // expected-error {{redeclared}}
|
||||
void f(S ...args[sizeof(T)]); // expected-error {{redeclared}}
|
||||
void g(S(...[sizeof(T)])); // expected-note {{here}} expected-warning {{ISO C++11 requires a parenthesized pack declaration to have a name}}
|
||||
void g(S(...)[sizeof(T)]); // expected-error {{function cannot return array type}}
|
||||
|
@ -119,9 +119,9 @@ struct C4 {
|
||||
// PR5415 - don't hang!
|
||||
struct S
|
||||
{
|
||||
void f(); // expected-note 1 {{previous declaration}}
|
||||
void S::f() {} // expected-error {{extra qualification on member}} expected-error {{class member cannot be redeclared}} expected-note {{previous declaration}} expected-note {{previous definition}}
|
||||
void f() {} // expected-error {{class member cannot be redeclared}} expected-error {{redefinition}}
|
||||
void f(); // expected-note 1 {{previous declaration}} expected-note {{previous declaration}}
|
||||
void S::f() {} // expected-error {{extra qualification on member}} expected-error {{class member cannot be redeclared}}
|
||||
void f() {} // expected-error {{class member cannot be redeclared}}
|
||||
};
|
||||
|
||||
// Don't crash on this bogus code.
|
||||
|
@ -11,8 +11,6 @@ struct X {
|
||||
|
||||
// expected-error@6 {{class member cannot be redeclared}}
|
||||
// expected-note@5 {{previous}}
|
||||
// expected-error@6 {{non-constexpr declaration of 'f' follows constexpr declaration}}
|
||||
// expected-note@5 {{previous}}
|
||||
#else
|
||||
// expected-warning@5 {{'constexpr' non-static member function will not be implicitly 'const' in C++14; add 'const' to avoid a change in behavior}}
|
||||
#endif
|
||||
|
@ -21,8 +21,8 @@ int conv1c = conv1.operator auto();
|
||||
int conv1d = conv1.operator int(); // expected-error {{no member named 'operator int'}}
|
||||
|
||||
struct Conv2 {
|
||||
operator auto() { return 0; } // expected-note 2{{previous}}
|
||||
operator auto() { return 0.; } // expected-error {{cannot be redeclared}} expected-error {{redefinition of 'operator auto'}}
|
||||
operator auto() { return 0; } // expected-note {{previous}}
|
||||
operator auto() { return 0.; } // expected-error {{cannot be redeclared}} expected-error {{cannot initialize return object of type 'auto' with an rvalue of type 'double'}}
|
||||
};
|
||||
|
||||
struct Conv3 {
|
||||
|
@ -30,10 +30,8 @@ class X {
|
||||
static void g(int); // expected-error {{static and non-static member functions with the same parameter types cannot be overloaded}}
|
||||
static void g(float); // expected-error {{class member cannot be redeclared}}
|
||||
|
||||
void h(); // expected-note {{previous declaration is here}} \
|
||||
expected-note {{previous declaration is here}}
|
||||
void h() __restrict; // expected-error {{class member cannot be redeclared}} \
|
||||
expected-error {{conflicting types for 'h'}}
|
||||
void h(); // expected-note {{previous declaration is here}}
|
||||
void h() __restrict; // expected-error {{class member cannot be redeclared}}
|
||||
};
|
||||
|
||||
int main() {} // expected-note {{previous definition is here}}
|
||||
|
Loading…
Reference in New Issue
Block a user