summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2014-12-16 22:02:06 +0000
committerNick Lewycky <nicholas@mxc.ca>2014-12-16 22:02:06 +0000
commit4d59b77883ab05ed53fb1c3be2663c3af2b6f59d (patch)
tree298ec70f3f3ece57cb531f4b140f7bfcf85df511
parent7129c10cae224b1b5a437589794906ef08a84c07 (diff)
downloadbcm5719-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.cpp3
-rw-r--r--clang/test/SemaCXX/typo-correction-delayed.cpp13
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();
+}
+}
OpenPOWER on IntegriCloud