Teach the FixIt in DiagnoseInvalidRedeclaration how to replace the written
nested name specifiers in addition to the function's identifier when the correction has a different nested name specifier. llvm-svn: 158178
This commit is contained in:
parent
389e9c2d7c
commit
1dac08da4b
|
@ -4742,15 +4742,19 @@ static NamedDecl* DiagnoseInvalidRedeclaration(
|
|||
}
|
||||
}
|
||||
|
||||
if (Correction)
|
||||
SemaRef.Diag(NewFD->getLocation(), DiagMsg)
|
||||
if (Correction) {
|
||||
SourceRange FixItLoc(NewFD->getLocation());
|
||||
CXXScopeSpec &SS = ExtraArgs.D.getCXXScopeSpec();
|
||||
if (Correction.getCorrectionSpecifier() && SS.isValid())
|
||||
FixItLoc.setBegin(SS.getBeginLoc());
|
||||
SemaRef.Diag(NewFD->getLocStart(), DiagMsg)
|
||||
<< Name << NewDC << Correction.getQuoted(SemaRef.getLangOpts())
|
||||
<< FixItHint::CreateReplacement(
|
||||
NewFD->getLocation(),
|
||||
Correction.getAsString(SemaRef.getLangOpts()));
|
||||
else
|
||||
FixItLoc, Correction.getAsString(SemaRef.getLangOpts()));
|
||||
} else {
|
||||
SemaRef.Diag(NewFD->getLocation(), DiagMsg)
|
||||
<< Name << NewDC << NewFD->getLocation();
|
||||
}
|
||||
|
||||
bool NewFDisConst = false;
|
||||
if (CXXMethodDecl *NewMD = dyn_cast<CXXMethodDecl>(NewFD))
|
||||
|
|
|
@ -242,3 +242,21 @@ void test() {
|
|||
}
|
||||
|
||||
} // namespace arrow_suggest
|
||||
|
||||
// Make sure fixing namespace-qualified identifiers functions properly with
|
||||
// namespace-aware typo correction/
|
||||
namespace redecl_typo {
|
||||
namespace Foo {
|
||||
void BeEvil(); // expected-note {{'BeEvil' declared here}}
|
||||
}
|
||||
namespace Bar {
|
||||
namespace Foo {
|
||||
bool isGood(); // expected-note {{'Bar::Foo::isGood' declared here}}
|
||||
void beEvil();
|
||||
}
|
||||
}
|
||||
bool Foo::isGood() { // expected-error {{out-of-line definition of 'isGood' does not match any declaration in namespace 'redecl_typo::Foo'; did you mean 'Bar::Foo::isGood'?}}
|
||||
return true;
|
||||
}
|
||||
void Foo::beEvil() {} // expected-error {{out-of-line definition of 'beEvil' does not match any declaration in namespace 'redecl_typo::Foo'; did you mean 'BeEvil'?}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue