]> granicus.if.org Git - clang/commitdiff
Fix crash-on-invalid for 'operator int[]()' in C++11.
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 14 Feb 2012 09:00:46 +0000 (09:00 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 14 Feb 2012 09:00:46 +0000 (09:00 +0000)
Signed off by Richard Smith.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150464 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseDeclCXX.cpp
test/SemaCXX/member-init.cpp

index cc0cf15e739cef951ed16ac644ae50c5ac61f657..6213824cae3aa2dd2ecb281685dfb4b64e51c60c 100644 (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) {
index 819c8d13db8972c8af01a30625e4a82892b59216..c93c85bbf89adf9c6b022e8d2c4d1b0ce730b5f8 100644 (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); };