[PATCH v2 6/6] Wire up delayed typo correction to DiagnoseEmptyLookup and set up Sema::ActOnIdExpression to use the new functionality.

David Blaikie dblaikie at gmail.com
Tue Nov 4 16:54:39 PST 2014


Could you post/send (on/off list, etc) an aggregate patch so I can play
around with the behavior of this patch?

Some superficial patch review

lambda passed to CorrectDelayedTyposInExpr has 'else-after-return' - you
could move the short block up to the top:

if (!...CPlusPlus11)
  return this->VerifyIntegerConstantExpression(E);
/* unindented the longer part of the code */

I'm slightly surprised at the indentation there too - I think clang-format
has a special case for lambdas as the last function argument, where it
won't indent them extra (so the "});" will be at the same level as the
expression - maybe it only does that if you're not initializing a variable?
Dunno.

Do you need the 'this->' qualification in that lambda? I assume not. (& I
usually favor just capture everything by reference [&] - but up to you on
that, we're all still certainly feeling out how best to write C++11)

EmptyLookupTypoDiags::operator() - some {} on single-statement blocks (if
(Ctx)/else)
Might be worth inverting the if/following block - the if block is
longer/nested than the tail block, so switching them around should reduce
indentation, etc.

std::string CorrectedStr(TC.getAsString(SemaRef.getLangOpts()));

Prefer copy/move init rather than direct init:

std::string CorrectedStr = TC.getAsString(SemaRef.getLangOpts());

Hmm - it might be nice to write EmptyLookupTypoDiags just as a single free
function (taking all those members as parameters instead) then call that in
a lambda - that way you don't have to write all the member state/ctor/etc
logic?

lambda in ParseCaseStatement: I'd probably write "return ExprResult(...)"
rather than explicitly specifying the return type. (do you even need to do
either? If CorrectDelayedTyposInExpr is a template, then its return result
should just implicitly convert to ExprResult in the caller, if it takes a
std::function, that should still work too... - I can explain this more in
person, perhaps.

Rather than goto in ParseCXXIdExpression, could that be a loop?


Hmm - why is the correction applied to the LHS/RHS of the binary
expression, rather than waiting until the full expression is parsed?






On Wed, Oct 29, 2014 at 12:49 PM, Kaelyn Takata <rikka at google.com> wrote:

>
> Among other things, this eliminates at least one redundant error case
> and allows recovery in several cases where it wasn't possible before
> (e.g. correcting a mistyped static_cast<>).
> ---
>  include/clang/Parse/Parser.h         |   9 +++
>  include/clang/Sema/Sema.h            |   4 +-
>  lib/Parse/ParseCXXInlineMethods.cpp  |   1 +
>  lib/Parse/ParseDecl.cpp              |   4 +-
>  lib/Parse/ParseDeclCXX.cpp           |   2 +-
>  lib/Parse/ParseExpr.cpp              |  30 +++++++---
>  lib/Parse/ParseExprCXX.cpp           |  13 ++++-
>  lib/Parse/ParseObjc.cpp              |   5 +-
>  lib/Parse/ParseOpenMP.cpp            |   3 +-
>  lib/Parse/ParseStmt.cpp              |   8 ++-
>  lib/Sema/SemaExpr.cpp                | 110
> ++++++++++++++++++++++++++++++++---
>  lib/Sema/SemaStmt.cpp                |  19 ++++++
>  test/FixIt/fixit-unrecoverable.cpp   |   4 +-
>  test/SemaCXX/typo-correction.cpp     |   7 ++-
>  test/SemaTemplate/crash-10438657.cpp |   2 +-
>  15 files changed, 189 insertions(+), 32 deletions(-)
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141104/084dbbac/attachment.html>


More information about the cfe-commits mailing list