[cfe-commits] [PATCH] Improve error recovery for comma/semicolon typo in declaration group

John McCall rjmccall at apple.com
Wed Oct 5 17:44:41 PDT 2011


On Oct 5, 2011, at 5:25 PM, Richard Smith wrote:
> On Thu, October 6, 2011 00:58, Eli Friedman wrote:
>> On Wed, Oct 5, 2011 at 4:26 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>>> Clang currently gives unhelpful diagnostics for cases such as this:
>>> 
>>> 
>>>      static const char *const Triples[] = {
>>>        "powerpc-linux-gnu",
>>>        "powerpc-unknown-linux-gnu"
>>>      },
>>>      CandidateLibDirs.append(LibDirs, LibDirs +
>>> llvm::array_lengthof(LibDirs));
>>> 
>>> 
>>> Viz:
>>> 
>>> 
>>> lib/Driver/ToolChains.cpp:1582:7: error: default initialization of an
>>> object of const type 'const char'     CandidateLibDirs.append(LibDirs,
>>> LibDirs + llvm::array_lengthof(LibDirs));
>>>     ^
>>> lib/Driver/ToolChains.cpp:1582:23: error: expected ';' at end of declaration
>>>     CandidateLibDirs.append(LibDirs, LibDirs +
>>> llvm::array_lengthof(LibDirs));
>>>                     ^
>>>                     ;
>>> 
>>> 
>>> The attached patch is a conservative fix for this issue. In cases where a
>>> declarator group contains a comma followed by a newline followed by
>>> something which obviously is neither a declarator nor a typo for a
>>> declarator, we give a fixit suggesting that a ; was intended:
>>> 
>>> lib/Driver/ToolChains.cpp:1581:8: error: expected ';' at end of declaration
>>>      },
>>>       ^ ;
>>> 
>>> 
>>> OK to commit?
>>> 
>> 
>> I don't really like Parser::MightBeDeclarator... I can see at least
>> two cases where it rejects valid code.  Can you use Parser::TryParseDeclarator
>> or something?
> 
> I'd be reluctant to add tentative parsing for all declarator groups with more
> than one declarator.

Yes, please don't use tentative parsing here. :)  In fact, if you could use at most
one token of lookahead, that would be ideal.

Abstractly, I don't really like the approach of opting-out possible declarators,
but the alternative would make the diagnostic *very* special-case.  Please
at least leave a comment in the declarator-parsing code saying to update
your function if a new token is added there, though.

John.



More information about the cfe-commits mailing list