-
Notifications
You must be signed in to change notification settings - Fork 11.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Sema][Typo Correction] Fix potential infite loop on ambiguity checks
Summary: This fixes a bug introduced in D62648, where Clang could infinite loop if it became stuck on a single TypoCorrection when it was supposed to be testing ambiguous corrections. Although not a common case, it could happen if there are multiple possible corrections with the same edit distance. The fix is simply to wipe the TypoExpr from the `TransformCache` so that the call to `TransformTypoExpr` doesn't use the `CachedEntry`. Reviewers: rsmith Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D67515 llvm-svn: 371859
- Loading branch information
1 parent
e7e8b51
commit 6d18650
Showing
2 changed files
with
33 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,29 @@ | |||
// RUN: %clang_cc1 -fsyntax-only -verify %s | |||
|
|||
// Check the following typo correction behavior in namespaces: | |||
// - no typos are diagnosed when an expression has ambiguous (multiple) corrections | |||
// - proper iteration through multiple potentially ambiguous corrections | |||
|
|||
namespace AmbiguousCorrection | |||
{ | |||
void method_Bar(); | |||
void method_Foo(); | |||
void method_Zoo(); | |||
}; | |||
|
|||
void testAmbiguousNoSuggestions() | |||
{ | |||
AmbiguousCorrection::method_Ace(); // expected-error {{no member named 'method_Ace' in namespace 'AmbiguousCorrection'}} | |||
} | |||
|
|||
namespace MultipleCorrectionsButNotAmbiguous | |||
{ | |||
int PrefixType_Name(int value); // expected-note {{'PrefixType_Name' declared here}} | |||
int PrefixType_MIN(); | |||
int PrefixType_MAX(); | |||
}; | |||
|
|||
int testMultipleCorrectionsButNotAmbiguous() { | |||
int val = MultipleCorrectionsButNotAmbiguous::PrefixType_Enum(0); // expected-error {{no member named 'PrefixType_Enum' in namespace 'MultipleCorrectionsButNotAmbiguous'; did you mean 'PrefixType_Name'?}} | |||
return val; | |||
} |