diff options
| author | Kaelyn Uhrain <rikka@google.com> | 2012-01-11 21:17:51 +0000 |
|---|---|---|
| committer | Kaelyn Uhrain <rikka@google.com> | 2012-01-11 21:17:51 +0000 |
| commit | 8811b3904c4f3648c958e24a51a05e6b1c311e5a (patch) | |
| tree | a25cbd72625f3dd1e34f14637b05abd9e93565fb /clang | |
| parent | bf570b98f221226e667863fa73281dd2aadc75c6 (diff) | |
| download | bcm5719-llvm-8811b3904c4f3648c958e24a51a05e6b1c311e5a.tar.gz bcm5719-llvm-8811b3904c4f3648c958e24a51a05e6b1c311e5a.zip | |
Fix the caching in CorrectTypo so that other non-keyword identifiers
are still added if the cached correction fails validation.
Also fix a copy-and-paste error in a comment from my previous commit.
Finally, add an example of the benefit the typo correction callback adds
to TryNamespaceTypoCorrection--which happens to also tickle the above
caching problem, as the only way a non-namespace Decl would be added to
the possible corrections is if it was cached as the correction for a
previous instance of the same typo where the typo was corrected to a
non-namespace via a different code path.
llvm-svn: 147968
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaCXX/typo-correction.cpp | 7 |
3 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f21d7664e5e..9fcac224a23 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1747,7 +1747,8 @@ Sema::ActOnMemInitializer(Decl *ConstructorD, namespace { -// Callback to only accept typo corrections that are namespaces. +// Callback to only accept typo corrections that can be a valid C++ member +// intializer: either a non-static field member or a base class. class MemInitializerValidatorCCC : public CorrectionCandidateCallback { public: explicit MemInitializerValidatorCCC(CXXRecordDecl *ClassDecl) diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 5bf0ca535c1..c69022d935c 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -3650,7 +3650,8 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName, IsUnqualifiedLookup = true; UnqualifiedTyposCorrectedMap::iterator Cached = UnqualifiedTyposCorrected.find(Typo); - if (Cached == UnqualifiedTyposCorrected.end()) { + if (Cached == UnqualifiedTyposCorrected.end() || + (Cached->second && CCC && !CCC->ValidateCandidate(Cached->second))) { // Provide a stop gap for files that are just seriously broken. Trying // to correct all typos can turn into a HUGE performance penalty, causing // some files to take minutes to get rejected by the parser. diff --git a/clang/test/SemaCXX/typo-correction.cpp b/clang/test/SemaCXX/typo-correction.cpp index 0fb33bc7813..c3e8480b293 100644 --- a/clang/test/SemaCXX/typo-correction.cpp +++ b/clang/test/SemaCXX/typo-correction.cpp @@ -40,3 +40,10 @@ struct Derived : public BaseType { // expected-note {{base class 'BaseType' spec static int base_type; Derived() : basetype() {} // expected-error{{initializer 'basetype' does not name a non-static data member or base class; did you mean the base class 'BaseType'?}} }; + +// In this example, somename should not be corrected to the cached correction +// "some_name" since "some_name" is a class and a namespace name is needed. +class some_name {}; // expected-note {{'some_name' declared here}} +somename Foo; // expected-error {{unknown type name 'somename'; did you mean 'some_name'?}} +namespace SomeName {} // expected-note {{namespace 'SomeName' defined here}} +using namespace somename; // expected-error {{no namespace named 'somename'; did you mean 'SomeName'?}} |

