On Fri, Jan 25, 2013 at 6:31 PM, Richard Trieu <[email protected]> wrote: > Author: rtrieu > Date: Fri Jan 25 20:31:38 2013 > New Revision: 173556 > > URL: http://llvm.org/viewvc/llvm-project?rev=173556&view=rev > Log: > Give a more informative error message when the dot or arrow operator is used > on a type. Currently, it gives a generic "expected unqualified-id" error. > The new error message is "cannot use (dot|arrow) operator on a type".
Kaelyn - might be nice if we could go one further & see if there's a nearby typo correction we should be doing. > cfe/trunk/test/Parser/cxx-decl.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=173556&r1=173555&r2=173556&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Fri Jan 25 20:31:38 > 2013 > @@ -422,6 +422,8 @@ def err_declaration_does_not_declare_par > def err_no_matching_param : Error<"parameter named %0 is missing">; > > /// C++ parser diagnostics > +def err_invalid_operator_on_type : Error< > + "cannot use %select{dot|arrow}0 operator on a type">; > def err_expected_unqualified_id : Error< > "expected %select{identifier|unqualified-id}0">; > def err_func_def_no_params : Error< > > Modified: cfe/trunk/lib/Parse/ParseDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=173556&r1=173555&r2=173556&view=diff > ============================================================================== > --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) > +++ cfe/trunk/lib/Parse/ParseDecl.cpp Fri Jan 25 20:31:38 2013 > @@ -4498,9 +4498,12 @@ void Parser::ParseDirectDeclarator(Decla > if (D.getContext() == Declarator::MemberContext) > Diag(Tok, diag::err_expected_member_name_or_semi) > << D.getDeclSpec().getSourceRange(); > - else if (getLangOpts().CPlusPlus) > - Diag(Tok, diag::err_expected_unqualified_id) << > getLangOpts().CPlusPlus; > - else > + else if (getLangOpts().CPlusPlus) { > + if (Tok.is(tok::period) || Tok.is(tok::arrow)) > + Diag(Tok, diag::err_invalid_operator_on_type) << Tok.is(tok::arrow); > + else > + Diag(Tok, diag::err_expected_unqualified_id) << > getLangOpts().CPlusPlus; > + } else > Diag(Tok, diag::err_expected_ident_lparen); > D.SetIdentifier(0, Tok.getLocation()); > D.setInvalidType(true); > > Modified: cfe/trunk/test/Parser/cxx-decl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-decl.cpp?rev=173556&r1=173555&r2=173556&view=diff > ============================================================================== > --- cfe/trunk/test/Parser/cxx-decl.cpp (original) > +++ cfe/trunk/test/Parser/cxx-decl.cpp Fri Jan 25 20:31:38 2013 > @@ -162,6 +162,24 @@ bitand r2 = v; > > } > > +struct DIE { > + void foo() {} > +}; > + > +void test (DIE die, DIE *Die, DIE INT, DIE *FLOAT) { > + DIE.foo(); // expected-error {{cannot use dot operator on a type}} > + die.foo(); > + > + DIE->foo(); // expected-error {{cannot use arrow operator on a type}} > + Die->foo(); > + > + int.foo(); // expected-error {{cannot use dot operator on a type}} > + INT.foo(); > + > + float->foo(); // expected-error {{cannot use arrow operator on a type}} > + FLOAT->foo(); > +} > + > // PR8380 > extern "" // expected-error {{unknown linkage language}} > test6a { ;// expected-error {{C++ requires a type specifier for all > declarations}} \ > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
