diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2014-12-16 22:02:06 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2014-12-16 22:02:06 +0000 |
commit | 4d59b77883ab05ed53fb1c3be2663c3af2b6f59d (patch) | |
tree | 298ec70f3f3ece57cb531f4b140f7bfcf85df511 | |
parent | 7129c10cae224b1b5a437589794906ef08a84c07 (diff) | |
download | bcm5719-llvm-4d59b77883ab05ed53fb1c3be2663c3af2b6f59d.tar.gz bcm5719-llvm-4d59b77883ab05ed53fb1c3be2663c3af2b6f59d.zip |
Look at whether TransformTypos returned a different Expr instead of looking at the number of uncorrected typos before and after. Correcting one typo may produce an expression with another TypoExpr in it, leading to matching counts even though a typo was corrected.
Fixes PR21925!
llvm-svn: 224380
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/typo-correction-delayed.cpp | 13 |
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 28fb0545ad2..2d3d127618b 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -6208,10 +6208,11 @@ ExprResult Sema::CorrectDelayedTyposInExpr( auto TyposResolved = DelayedTypos.size(); auto Result = TransformTypos(*this, Filter).Transform(E); TyposResolved -= DelayedTypos.size(); - if (TyposResolved) { + if (Result.isInvalid() || Result.get() != E) { ExprEvalContexts.back().NumTypos -= TyposResolved; return Result; } + assert(TyposResolved == 0 && "Corrected typo but got same Expr back?"); } return E; } diff --git a/clang/test/SemaCXX/typo-correction-delayed.cpp b/clang/test/SemaCXX/typo-correction-delayed.cpp index 7879d299d08..c91fb6ca65e 100644 --- a/clang/test/SemaCXX/typo-correction-delayed.cpp +++ b/clang/test/SemaCXX/typo-correction-delayed.cpp @@ -130,3 +130,16 @@ void UseOverload() { // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}} Overload(resulta); } + +namespace PR21925 { +struct X { + int get() { return 7; } // expected-note {{'get' declared here}} +}; +void test() { + X variable; // expected-note {{'variable' declared here}} + + // expected-error@+2 {{use of undeclared identifier 'variableX'; did you mean 'variable'?}} + // expected-error@+1 {{no member named 'getX' in 'PR21925::X'; did you mean 'get'?}} + int x = variableX.getX(); +} +} |