forked from OSchip/llvm-project
Give nicer note when a member redeclaration has or lacks 'const'
llvm-svn: 141555
This commit is contained in:
parent
7571ba7015
commit
1a6eb99d45
|
|
@ -3253,6 +3253,9 @@ def warn_member_extra_qualification : Warning<
|
|||
def err_member_qualification : Error<
|
||||
"non-friend class member %0 cannot have a qualified name">;
|
||||
def note_member_def_close_match : Note<"member declaration nearly matches">;
|
||||
def note_member_def_close_const_match : Note<
|
||||
"member declaration does not match because "
|
||||
"it %select{is|is not}0 const qualified">;
|
||||
def note_member_def_close_param_match : Note<
|
||||
"type of %ordinal0 parameter of member declaration does not match "
|
||||
"definition (%1 vs %2)">;
|
||||
|
|
|
|||
|
|
@ -4365,10 +4365,17 @@ static void DiagnoseInvalidRedeclaration(Sema &S, FunctionDecl *NewFD,
|
|||
else
|
||||
S.Diag(NewFD->getLocation(), DiagMsg) << Name << DC << NewFD->getLocation();
|
||||
|
||||
bool NewFDisConst = false;
|
||||
if (CXXMethodDecl *NewMD = dyn_cast<CXXMethodDecl>(NewFD))
|
||||
NewFDisConst = NewMD->getTypeQualifiers() & Qualifiers::Const;
|
||||
|
||||
for (llvm::SmallVector<std::pair<FunctionDecl*, unsigned>, 1>::iterator
|
||||
NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end();
|
||||
NearMatch != NearMatchEnd; ++NearMatch) {
|
||||
FunctionDecl *FD = NearMatch->first;
|
||||
bool FDisConst = false;
|
||||
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD))
|
||||
FDisConst = MD->getTypeQualifiers() & Qualifiers::Const;
|
||||
|
||||
if (unsigned Idx = NearMatch->second) {
|
||||
ParmVarDecl *FDParam = FD->getParamDecl(Idx-1);
|
||||
|
|
@ -4377,7 +4384,10 @@ static void DiagnoseInvalidRedeclaration(Sema &S, FunctionDecl *NewFD,
|
|||
<< Idx << FDParam->getType() << NewFD->getParamDecl(Idx-1)->getType();
|
||||
} else if (Correction) {
|
||||
S.Diag(FD->getLocation(), diag::note_previous_decl)
|
||||
<< Correction.getQuoted(S.getLangOptions());
|
||||
<< Correction.getQuoted(S.getLangOptions());
|
||||
} else if (FDisConst != NewFDisConst) {
|
||||
S.Diag(FD->getLocation(), diag::note_member_def_close_const_match)
|
||||
<< NewFDisConst << FD->getSourceRange().getEnd();
|
||||
} else
|
||||
S.Diag(FD->getLocation(), diag::note_member_def_close_match);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ struct Foo {
|
|||
}
|
||||
|
||||
class Bar {
|
||||
void f(test1::Foo::Inner foo) const; // expected-note {{member declaration nearly matches}}
|
||||
void f(test1::Foo::Inner foo) const; // expected-note {{member declaration does not match because it is const qualified}}
|
||||
};
|
||||
|
||||
using test1::Foo;
|
||||
|
|
@ -79,3 +79,16 @@ class Crash {
|
|||
void Crash::cart(int count) const {} // expected-error {{out-of-line definition of 'cart' does not match any declaration in 'Crash'}}
|
||||
// ...while this one crashed clang
|
||||
void Crash::chart(int count) const {} // expected-error {{out-of-line definition of 'chart' does not match any declaration in 'Crash'}}
|
||||
|
||||
class TestConst {
|
||||
public:
|
||||
int getit() const; // expected-note {{member declaration does not match because it is const qualified}}
|
||||
void setit(int); // expected-note {{member declaration does not match because it is not const qualified}}
|
||||
};
|
||||
|
||||
int TestConst::getit() { // expected-error {{out-of-line definition of 'getit' does not match any declaration in 'TestConst'}}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void TestConst::setit(int) const { // expected-error {{out-of-line definition of 'setit' does not match any declaration in 'TestConst'}}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,10 +27,10 @@ int A::C::cx = 17;
|
|||
static int A::C::cx2 = 17; // expected-error{{'static' can}}
|
||||
|
||||
class C2 {
|
||||
void m(); // expected-note{{member declaration nearly matches}}
|
||||
void m(); // expected-note{{member declaration does not match because it is not const qualified}}
|
||||
|
||||
void f(const int& parm); // expected-note{{type of 1st parameter of member declaration does not match definition ('const int &' vs 'int')}}
|
||||
void f(int) const; // expected-note{{member declaration nearly matches}}
|
||||
void f(int) const; // expected-note{{member declaration does not match because it is const qualified}}
|
||||
void f(float);
|
||||
|
||||
int x;
|
||||
|
|
@ -121,7 +121,7 @@ namespace E {
|
|||
|
||||
|
||||
class Operators {
|
||||
Operators operator+(const Operators&) const; // expected-note{{member declaration nearly matches}}
|
||||
Operators operator+(const Operators&) const; // expected-note{{member declaration does not match because it is const qualified}}
|
||||
operator bool();
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue