forked from OSchip/llvm-project
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
This commit is contained in:
parent
bf570b98f2
commit
8811b3904c
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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'?}}
|
||||
|
|
Loading…
Reference in New Issue