]> granicus.if.org Git - clang/commitdiff
Improve diagnostic and recovery when missing a comma between base or
authorDouglas Gregor <dgregor@apple.com>
Tue, 7 Sep 2010 14:35:10 +0000 (14:35 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 7 Sep 2010 14:35:10 +0000 (14:35 +0000)
member initializers in a C++ constructor. Fixes <rdar://problem/7796492>.

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

include/clang/Basic/DiagnosticParseKinds.td
lib/Parse/ParseDeclCXX.cpp
test/FixIt/fixit.cpp

index 646fd0d1bfb6c43b01df3e4da87773ad46b364ed..50e98706f51b525c014c58d804a3d1e0d7c1968a 100644 (file)
@@ -364,6 +364,9 @@ def err_default_template_template_parameter_not_template : Error<
   "default template argument for a template template parameter must be a class "
   "template">;
   
+def err_ctor_init_missing_comma : Error<
+  "missing ',' between base or member initializers">;
+
 // C++ declarations
 def err_friend_decl_defines_class : Error<
   "cannot define a type in a friend declaration">;
index b277156a0d069e039cf5b4b694b5db32bd37d510..6a63986f4a5a6c61959029f34433f5f70fefce7d 100644 (file)
@@ -1735,6 +1735,12 @@ void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) {
       ConsumeToken();
     else if (Tok.is(tok::l_brace))
       break;
+    // If the next token looks like a base or member initializer, assume that
+    // we're just missing a comma.
+    else if (Tok.is(tok::identifier) || Tok.is(tok::coloncolon))
+      Diag(Tok.getLocation(), diag::err_ctor_init_missing_comma)
+        << FixItHint::CreateInsertion(PP.getLocForEndOfToken(PrevTokLocation),
+                                      ", ");
     else {
       // Skip over garbage, until we get to '{'.  Don't eat the '{'.
       Diag(Tok.getLocation(), diag::err_expected_lbrace_or_comma);
index b9282c4d9481113d588e6a5f59c2c9067fa77897..5a28132397006a0b97611ac93c4be50d958545e9 100644 (file)
@@ -51,3 +51,12 @@ namespace rdar7853795 {
     }
   };
 }
+
+namespace rdar7796492 {
+  class A { int x, y; A(); };
+
+  A::A()
+    : x(1) y(2) { // expected-error{{missing ',' between base or member initializers}}
+  }
+
+}