diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -7780,8 +7780,9 @@ // If we found a valid result, double check to make sure it's not ambiguous. if (!IsAmbiguous && !Res.isInvalid() && !AmbiguousTypoExprs.empty()) { - auto SavedTransformCache = std::move(TransformCache); - TransformCache.clear(); + auto SavedTransformCache = + llvm::SmallDenseMap(TransformCache); + // Ensure none of the TypoExprs have multiple typo correction candidates // with the same edit length that pass all the checks and filters. while (!AmbiguousTypoExprs.empty()) { diff --git a/clang/test/Sema/typo-correction-ambiguity.c b/clang/test/Sema/typo-correction-ambiguity.c new file mode 100644 --- /dev/null +++ b/clang/test/Sema/typo-correction-ambiguity.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// Check the following typo correction behavior in C: +// - no typos are diagnosed when a call expression has ambiguous (multiple) corrections + +int v_63; + +void v_2_0(int v_452, int v_454) {} + +int v_3_0() { + for (int v_345 = 0 ; v_63;) + v_2_0(v_195, // expected-error {{use of undeclared identifier 'v_195'}} + v_231); // expected-error {{use of undeclared identifier 'v_231'}} +}