When typo-correcting a using-declaration, actually correct the name of the

UsingDecl (so that redeclaration lookup can find it).

llvm-svn: 269530
This commit is contained in:
Richard Smith 2016-05-14 01:58:49 +00:00
parent 81ef0e1adb
commit 9385d704c1
2 changed files with 39 additions and 0 deletions

View File

@ -7998,6 +7998,9 @@ public:
if (Candidate.WillReplaceSpecifier() && !Candidate.getCorrectionSpecifier())
return false;
// FIXME: Don't correct to a name that CheckUsingDeclRedeclaration would
// reject.
if (RequireMemberOf) {
auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
if (FoundRecord && FoundRecord->isInjectedClassName()) {
@ -8207,6 +8210,7 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
R.addDecl(Ctor);
} else {
// FIXME: Pick up all the declarations if we found an overloaded function.
NameInfo.setName(ND->getDeclName());
R.addDecl(ND);
}
} else {

View File

@ -243,6 +243,41 @@ namespace PR19171 {
struct F : E {
using E::EE; // expected-error-re {{no member named 'EE' in 'PR19171::E'{{$}}}}
};
struct TypoDuplicate { // expected-note 0-4{{here}}
TypoDuplicate(int);
void foobar(); // expected-note 2{{here}}
};
struct TypoDuplicateDerived1 : TypoDuplicate {
#if __cplusplus >= 201103L
using TypoDuplicate::TypoFuplicate; // expected-error {{did you mean 'TypoDuplicate'}} expected-note {{previous}}
using TypoDuplicate::TypoDuplicate; // expected-error {{redeclaration}}
#endif
using TypoDuplicate::goobar; // expected-error {{did you mean 'foobar'}} expected-note {{previous}}
using TypoDuplicate::foobar; // expected-error {{redeclaration}}
};
struct TypoDuplicateDerived2 : TypoDuplicate {
#if __cplusplus >= 201103L
using TypoFuplicate::TypoDuplicate; // expected-error {{did you mean 'TypoDuplicate'}} expected-note {{previous}}
using TypoDuplicate::TypoDuplicate; // expected-error {{redeclaration}}
#endif
};
struct TypoDuplicateDerived3 : TypoDuplicate {
#if __cplusplus >= 201103L
// FIXME: Don't suggest a correction that would lead to a redeclaration
// error here... or at least diagnose the error.
using TypoDuplicate::TypoDuplicate;
using TypoDuplicate::TypoFuplicate; // expected-error {{did you mean 'TypoDuplicate'}}
#endif
using TypoDuplicate::foobar;
using TypoDuplicate::goobar; // expected-error {{did you mean 'foobar'}}
};
struct TypoDuplicateDerived4 : TypoDuplicate {
#if __cplusplus >= 201103L
using TypoDuplicate::TypoDuplicate; // expected-note {{previous}}
using TypoFuplicate::TypoDuplicate; // expected-error {{did you mean 'TypoDuplicate'}} expected-error {{redeclaration}}
#endif
};
}
namespace TypoCorrectTemplateMember {