From: Douglas Gregor Date: Tue, 7 Sep 2010 14:35:10 +0000 (+0000) Subject: Improve diagnostic and recovery when missing a comma between base or X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1f6fa48960eae269a3931d1fc545ed468d9a4d2;p=clang Improve diagnostic and recovery when missing a comma between base or member initializers in a C++ constructor. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113199 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 646fd0d1bf..50e98706f5 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -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">; diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index b277156a0d..6a63986f4a 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -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); diff --git a/test/FixIt/fixit.cpp b/test/FixIt/fixit.cpp index b9282c4d94..5a28132397 100644 --- a/test/FixIt/fixit.cpp +++ b/test/FixIt/fixit.cpp @@ -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}} + } + +}