Replace the workaround from r153445 with a proper fix.
Infinite recursion was happening when DiagnoseInvalidRedeclaration called ActOnFunctionDeclarator to check if a typo correction works when the correction was just to the nested-name-specifier because the wrong DeclContext was being passed in. Unlike a number of functions surrounding typo correction, the DeclContext passed in for a function is the context of the function name after applying any nested name specifiers, not the lexical DeclContext where the function+nested-name-specifier appears. llvm-svn: 153962
This commit is contained in:
parent
b81e2b403c
commit
f4657d5bd7
|
@ -205,7 +205,7 @@ class CorrectionCandidateCallback {
|
|||
: WantTypeSpecifiers(true), WantExpressionKeywords(true),
|
||||
WantCXXNamedCasts(true), WantRemainingKeywords(true),
|
||||
WantObjCSuper(false),
|
||||
IsObjCIvarLookup(false), AllowAddedQualifier(true) {}
|
||||
IsObjCIvarLookup(false) {}
|
||||
|
||||
virtual ~CorrectionCandidateCallback() {}
|
||||
|
||||
|
@ -239,10 +239,6 @@ class CorrectionCandidateCallback {
|
|||
// Temporary hack for the one case where a CorrectTypoContext enum is used
|
||||
// when looking up results.
|
||||
bool IsObjCIvarLookup;
|
||||
|
||||
/// \brief Whether to allow this typo correction to add a
|
||||
/// nested-name-specifier.
|
||||
bool AllowAddedQualifier;
|
||||
};
|
||||
|
||||
/// @brief Simple template class for restricting typo correction candidates
|
||||
|
|
|
@ -4500,14 +4500,7 @@ namespace {
|
|||
class DifferentNameValidatorCCC : public CorrectionCandidateCallback {
|
||||
public:
|
||||
DifferentNameValidatorCCC(CXXRecordDecl *Parent)
|
||||
: ExpectedParent(Parent ? Parent->getCanonicalDecl() : 0) {
|
||||
// Don't allow any additional qualification.
|
||||
// FIXME: It would be nice to perform this additional qualification.
|
||||
// However, DiagnoseInvalidRedeclaration is unable to handle the
|
||||
// qualification, because it doesn't know how to pass the corrected
|
||||
// nested-name-specifier through to ActOnFunctionDeclarator.
|
||||
AllowAddedQualifier = false;
|
||||
}
|
||||
: ExpectedParent(Parent ? Parent->getCanonicalDecl() : 0) {}
|
||||
|
||||
virtual bool ValidateCandidate(const TypoCorrection &candidate) {
|
||||
if (candidate.getEditDistance() == 0)
|
||||
|
@ -4596,12 +4589,11 @@ static NamedDecl* DiagnoseInvalidRedeclaration(
|
|||
// TODO: Refactor ActOnFunctionDeclarator so that we can call only the
|
||||
// pieces need to verify the typo-corrected C++ declaraction and hopefully
|
||||
// eliminate the need for the parameter pack ExtraArgs.
|
||||
Result = SemaRef.ActOnFunctionDeclarator(ExtraArgs.S, ExtraArgs.D,
|
||||
NewFD->getDeclContext(),
|
||||
NewFD->getTypeSourceInfo(),
|
||||
Previous,
|
||||
ExtraArgs.TemplateParamLists,
|
||||
ExtraArgs.AddToScope);
|
||||
Result = SemaRef.ActOnFunctionDeclarator(
|
||||
ExtraArgs.S, ExtraArgs.D,
|
||||
Correction.getCorrectionDecl()->getDeclContext(),
|
||||
NewFD->getTypeSourceInfo(), Previous, ExtraArgs.TemplateParamLists,
|
||||
ExtraArgs.AddToScope);
|
||||
if (Trap.hasErrorOccurred()) {
|
||||
// Pretend the typo correction never occurred
|
||||
ExtraArgs.D.SetIdentifier(Name.getAsIdentifierInfo(),
|
||||
|
|
|
@ -3815,7 +3815,7 @@ TypoCorrection Sema::CorrectTypo(const DeclarationNameInfo &TypoName,
|
|||
// Determine whether we are going to search in the various namespaces for
|
||||
// corrections.
|
||||
bool SearchNamespaces
|
||||
= getLangOpts().CPlusPlus && CCC.AllowAddedQualifier &&
|
||||
= getLangOpts().CPlusPlus &&
|
||||
(IsUnqualifiedLookup || (QualifiedDC && QualifiedDC->isNamespace()));
|
||||
|
||||
if (IsUnqualifiedLookup || SearchNamespaces) {
|
||||
|
|
|
@ -19,11 +19,11 @@ namespace PR12297 {
|
|||
namespace B {
|
||||
typedef short T;
|
||||
|
||||
T global();
|
||||
T global(); // expected-note {{'A::B::global' declared here}}
|
||||
}
|
||||
}
|
||||
|
||||
using namespace A::B;
|
||||
|
||||
T A::global(); // expected-error{{out-of-line definition of 'global' does not match any declaration in namespace 'PR12297::A'}}
|
||||
T A::global(); // expected-error {{out-of-line definition of 'global' does not match any declaration in namespace 'PR12297::A'; did you mean 'A::B::global'?}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue