Author: David Goldman Date: 2019-10-25T13:20:27-04:00 New Revision: 7a2b704bf0cf65f9eb46fe3668a83b75aa2d80a6
URL: https://github.com/llvm/llvm-project/commit/7a2b704bf0cf65f9eb46fe3668a83b75aa2d80a6 DIFF: https://github.com/llvm/llvm-project/commit/7a2b704bf0cf65f9eb46fe3668a83b75aa2d80a6.diff LOG: [Sema][Typo Correction] Fix another infinite loop on ambiguity See also: D67515 - For the given call expression we would end up repeatedly trying to transform the same expression over and over again - Fix is to keep the old TransformCache when checking for ambiguity Differential Revision: https://reviews.llvm.org/D69060 Added: clang/test/Sema/typo-correction-ambiguity.c Modified: clang/lib/Sema/SemaExprCXX.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 18efd8335d9d..4fdd15bf466f 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -7780,8 +7780,9 @@ class TransformTypos : public TreeTransform<TransformTypos> { // 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<TypoExpr *, ExprResult, 2>(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 index 000000000000..bebbf25ce291 --- /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'}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits