From: Kaelyn Uhrain Date: Mon, 10 Oct 2011 18:01:37 +0000 (+0000) Subject: Give nicer note when a member redeclaration has or lacks 'const' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1055393814ac989727aa7437a5f3c3c44b4f83e5;p=clang Give nicer note when a member redeclaration has or lacks 'const' git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141555 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index c4e0168ce7..8ce63ead9e 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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)">; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index b1e4a4e75b..671ba615a8 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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(NewFD)) + NewFDisConst = NewMD->getTypeQualifiers() & Qualifiers::Const; + for (llvm::SmallVector, 1>::iterator NearMatch = NearMatches.begin(), NearMatchEnd = NearMatches.end(); NearMatch != NearMatchEnd; ++NearMatch) { FunctionDecl *FD = NearMatch->first; + bool FDisConst = false; + if (CXXMethodDecl *MD = dyn_cast(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); } diff --git a/test/SemaCXX/function-redecl.cpp b/test/SemaCXX/function-redecl.cpp index 2bc04a6d07..b19bff6543 100644 --- a/test/SemaCXX/function-redecl.cpp +++ b/test/SemaCXX/function-redecl.cpp @@ -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'}} +} diff --git a/test/SemaCXX/nested-name-spec.cpp b/test/SemaCXX/nested-name-spec.cpp index 8e73c3e2ed..e13030cc38 100644 --- a/test/SemaCXX/nested-name-spec.cpp +++ b/test/SemaCXX/nested-name-spec.cpp @@ -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(); };