[PATCH] Add context to "expected unqualified-id" message

Richard Trieu rtrieu at google.com
Mon Jun 24 17:52:13 PDT 2013


On Mon, Jun 24, 2013 at 5:13 PM, Eli Friedman <eli.friedman at gmail.com>wrote:

> On Mon, Jun 24, 2013 at 4:58 PM, Richard Trieu <rtrieu at google.com> wrote:
>
>> When the error message "expected unqualified-id" appears in the middle of
>> parsing a declarator, and the token pointed to begins a new line, add a
>> note that points back to the rest of the declarator.  This is to prevent
>> the confusing case where an "expected unqualified-id" message shows up and
>> points to a line of code where there is a single '}'.
>>
>> http://llvm-reviews.chandlerc.com/D1032
>>
>> Files:
>>   lib/Parse/ParseDecl.cpp
>>   test/Parser/cxx-decl.cpp
>>   include/clang/Basic/DiagnosticParseKinds.td
>>
>> Index: lib/Parse/ParseDecl.cpp
>> ===================================================================
>> --- lib/Parse/ParseDecl.cpp
>> +++ lib/Parse/ParseDecl.cpp
>> @@ -4737,8 +4737,14 @@
>>      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
>> +      else {
>>          Diag(Tok, diag::err_expected_unqualified_id) <<
>> getLangOpts().CPlusPlus;
>> +        if (Tok.isAtStartOfLine()) {
>> +          SourceLocation Loc = D.getCXXScopeSpec().getEndLoc();
>> +          if (Loc.isValid())
>> +            Diag(PP.getLocForEndOfToken(Loc), diag::note_after_here);
>> +        }
>> +      }
>>      } else
>>        Diag(Tok, diag::err_expected_ident_lparen);
>>      D.SetIdentifier(0, Tok.getLocation());
>> Index: test/Parser/cxx-decl.cpp
>> ===================================================================
>> --- test/Parser/cxx-decl.cpp
>> +++ test/Parser/cxx-decl.cpp
>> @@ -187,6 +187,22 @@
>>  // Ensure we produce at least some diagnostic for attributes in C++98.
>>  [[]] struct S; // expected-error 2{{}}
>>
>> +namespace test7 {
>> +  struct Foo {
>> +    int a();
>> +    int b();
>> +  };
>> +
>> +  int Foo::
>> +  // Comment!
>> +  a() {}
>> +
>> +
>> +  int Foo::
>> +  // expected-note at -1 {{after here}}
>> +  // Comment!
>> +} // expected-error {{expected unqualified-id}}
>>
>>
> Why don't we just point the error at the first location?
>
> -Eli
>

That sounds like it would work too.  My first thought was to add a note,
but moving the caret is also a solution to this problem.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130624/aefd8621/attachment.html>


More information about the cfe-commits mailing list