Fix a typo correction crash when resolving ambiguous corrections.

In certain cases, the tree transform would introduce new TypoExprs while
trying one of the corrections, invalidating the unique_ptr in the state
reference, and also causing a TypoExpr to exist that will never be
corrected since it doesn't exist in the final corrected expression. The
simple solution to both problems is to temporarily disable typo
correction while handling potentially ambiguous typo corrections.

llvm-svn: 240734
This commit is contained in:
Kaelyn Takata 2015-06-25 23:47:39 +00:00
parent 4fb1f9cda6
commit 26ffc5f7fb
2 changed files with 32 additions and 0 deletions

View File

@ -6506,6 +6506,11 @@ public:
// with the same edit length that pass all the checks and filters.
// TODO: Properly handle various permutations of possible corrections when
// there is more than one potentially ambiguous typo correction.
// Also, disable typo correction while attempting the transform when
// handling potentially ambiguous typo corrections as any new TypoExprs will
// have been introduced by the application of one of the correction
// candidates and add little to no value if corrected.
SemaRef.DisableTypoCorrection = true;
while (!AmbiguousTypoExprs.empty()) {
auto TE = AmbiguousTypoExprs.back();
auto Cached = TransformCache[TE];
@ -6522,6 +6527,7 @@ public:
State.Consumer->restoreSavedPosition();
TransformCache[TE] = Cached;
}
SemaRef.DisableTypoCorrection = false;
// Ensure that all of the TypoExprs within the current Expr have been found.
if (!Res.isUsable())

View File

@ -32,3 +32,29 @@ void f() {
}
}
}
namespace NewTypoExprFromResolvingTypoAmbiguity {
struct A {
void Swap(A *other);
};
struct pair {
int first;
A *second;
};
struct map {
public:
void swap(map &x);
pair find(int x);
};
void run(A *annotations) {
map new_annotations;
auto &annotation = *annotations;
auto new_it = new_annotations.find(5);
auto &new_anotation = new_it.second; // expected-note {{'new_anotation' declared here}}
new_annotation->Swap(&annotation); // expected-error {{use of undeclared identifier 'new_annotation'; did you mean 'new_anotation'?}}
}
}