diff options
author | Nico Weber <nicolasweber@gmx.de> | 2015-01-30 16:53:11 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2015-01-30 16:53:11 +0000 |
commit | f9e37be2d63ea563bb235b74f7103353ec0fdfef (patch) | |
tree | fb54c3885ec7b8b6e66a0eb268ec26f2d5d6de87 /clang/test/Parser/cxx-class.cpp | |
parent | 655b59854fba05212109b63ca4cd7e40e2843917 (diff) | |
download | bcm5719-llvm-f9e37be2d63ea563bb235b74f7103353ec0fdfef.tar.gz bcm5719-llvm-f9e37be2d63ea563bb235b74f7103353ec0fdfef.zip |
Follow-up to r217302 and r227555: Don't crash on inline ~A::A() if A is an int.
Even with r227555, this still crashed:
struct S {
int A;
~A::A() {}
};
That's because ParseOptionalCXXScopeSpecifier()'s call to
ActOnCXXNestedNameSpecifier() doesn't mark the scope spec as invalid if sema
thought it's a good idea to fixit-correct "::" to ":". For the diagnostic
improvement done in r217302, we never want :: to be interpreted as :, so fix
this by setting ColonSacred to false temporarily.
Found by SLi's bot.
llvm-svn: 227581
Diffstat (limited to 'clang/test/Parser/cxx-class.cpp')
-rw-r--r-- | clang/test/Parser/cxx-class.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/test/Parser/cxx-class.cpp b/clang/test/Parser/cxx-class.cpp index 7c5c4ecf58c..077bd6f02ce 100644 --- a/clang/test/Parser/cxx-class.cpp +++ b/clang/test/Parser/cxx-class.cpp @@ -159,6 +159,21 @@ namespace DtorErrors { ~D::D() throw(X) {} // expected-error {{'~' in destructor name should be after nested name specifier}} ~Undeclared::Undeclared() {} // expected-error {{use of undeclared identifier 'Undeclared'}} expected-error {{'~' in destructor name should be after nested name specifier}} + + struct S { + // For another struct's destructor, emit the same diagnostic like for + // A::~A() in addition to the "~ in the wrong place" one. + ~A::A() {} // expected-error {{'~' in destructor name should be after nested name specifier}} expected-error {{non-friend class member '~A' cannot have a qualified name}} + A::~A() {} // expected-error {{non-friend class member '~A' cannot have a qualified name}} + + // An inline destructor with a redundant class name should also get the + // same diagnostic as S::~S. + ~S::S() {} // expected-error {{'~' in destructor name should be after nested name specifier}} expected-error {{extra qualification on member '~S'}} + + // This just shouldn't crash. + int I; // expected-note {{declared here}} + ~I::I() {} // expected-error {{'I' is not a class, namespace, or enumeration}} expected-error {{'~' in destructor name should be after nested name specifier}} + }; } namespace BadFriend { |