Fix crash-on-invalid for 'operator int[]()' in C++11.

Signed off by Richard Smith.

llvm-svn: 150464
This commit is contained in:
David Blaikie 2012-02-14 09:00:46 +00:00
parent cfad98f745
commit cdd91dbe9f
2 changed files with 7 additions and 3 deletions

View File

@ -1989,11 +1989,12 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
// declarator is followed by an initializer.
//
// A brace-or-equal-initializer for a member-declarator is not an
// initializer in the gramamr, so this is ill-formed.
// initializer in the grammar, so this is ill-formed.
Diag(Tok, diag::err_incomplete_array_member_init);
SkipUntil(tok::comma, true, true);
// Avoid later warnings about a class member of incomplete type.
ThisDecl->setInvalidDecl();
if (ThisDecl)
// Avoid later warnings about a class member of incomplete type.
ThisDecl->setInvalidDecl();
} else
ParseCXXNonStaticMemberInitializer(ThisDecl);
} else if (HasInitializer) {

View File

@ -29,6 +29,9 @@ const int C = 0, D = 0;
struct S {
int as[] = { decltype(x)::B<C, D>(0) }; // expected-error {{array bound cannot be deduced from an in-class initializer}}
T<sizeof(as) / sizeof(int)> x; // expected-error {{requires a type specifier}}
// test that we handle invalid array bound deductions without crashing when the declarator name is itself invalid
operator int[](){}; // expected-error {{'operator int' cannot be the name of a variable or data member}} \
// expected-error {{array bound cannot be deduced from an in-class initializer}}
};
struct ThrowCtor { ThrowCtor(int) noexcept(false); };