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 @@ -8343,6 +8343,7 @@ AmbiguousTypoExprs.remove(TE); SemaRef.getTypoExprState(TE).Consumer->restoreSavedPosition(); + TransformCache[TE] = SavedTransformCache[TE]; } TransformCache = std::move(SavedTransformCache); } diff --git a/clang/test/Sema/typo-correction-ambiguity.c b/clang/test/Sema/typo-correction-ambiguity.c --- a/clang/test/Sema/typo-correction-ambiguity.c +++ b/clang/test/Sema/typo-correction-ambiguity.c @@ -12,3 +12,16 @@ v_2_0(v_195, // expected-error {{use of undeclared identifier 'v_195'}} v_231); // expected-error {{use of undeclared identifier 'v_231'}} } + +// Test: no typo-correction diagnostics are emitted for ambiguous typos. +struct a { + int xxx; +}; + +int g_107; +int g_108; +int g_109; + +struct a g_999; +struct a g_998; +void PR50797() { (g_910.xxx = g_910.xxx); } //expected-error 2{{use of undeclared identifier 'g_910'}} diff --git a/clang/test/Sema/typo-correction-no-hang.c b/clang/test/Sema/typo-correction-no-hang.c new file mode 100644 --- /dev/null +++ b/clang/test/Sema/typo-correction-no-hang.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// PR50797 +struct a { + int xxx; // expected-note {{'xxx' declared here}} +}; + +int g_107; +int g_108; +int g_109; + +struct a g_999; // expected-note 4{{'g_999' declared here}} + +void b() { (g_910.xxx = g_910.xxx); } //expected-error 2{{use of undeclared identifier 'g_910'; did you mean 'g_999'}} + +void c() { (g_910.xxx = g_910.xxx1); } //expected-error 2{{use of undeclared identifier 'g_910'; did you mean 'g_999'}} \ + expected-error {{no member named 'xxx1' in 'struct a'; did you mean 'xxx'}}