On Tue, Feb 16, 2016 at 10:45 PM, David Blaikie <dblai...@gmail.com> wrote:
> > > On Tue, Feb 16, 2016 at 10:01 PM, Ryan Yee via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > >> ryee88 updated this revision to Diff 48149. >> ryee88 added a comment. >> >> Keeping the number of test files to a minimum makes sense. >> >> Couldn't find an existing test for this diagnostic. > > > That would be a bit surprising - if you want to see if you can find one, > one way would be to add an "assert(false)" in where the diagnostic is > emitted, and see which test cases fail - see if any look useful. They might > not be testing tnhe whole diagnostic text, etc, but could be expanded to do > so. > Ping on this comment ^ are you sure there's no existing coverage you could attach your test to/modify to cover? > > >> I did find a cxx-reference.cpp that tests reference diagnostics so this >> seems like a reasonable location for this new test. >> >> >> http://reviews.llvm.org/D16949 >> >> Files: >> include/clang/Basic/DiagnosticSemaKinds.td >> lib/Sema/SemaOverload.cpp >> test/Parser/cxx-reference.cpp >> >> Index: test/Parser/cxx-reference.cpp >> =================================================================== >> --- test/Parser/cxx-reference.cpp >> +++ test/Parser/cxx-reference.cpp >> @@ -24,3 +24,29 @@ >> #if __cplusplus <= 199711L >> // expected-warning@-2 {{rvalue references are a C++11 extension}} >> #endif >> + >> +namespace PointerVsReferenceSuggestion{ >> + class A; >> + >> + void f0(A *a); // expected-note {{candidate function not viable: >> cannot convert argument of incomplete type >> 'PointerVsReferenceSuggestion::A' to 'PointerVsReferenceSuggestion::A *' >> for 1st argument; take the address of the argument with &}} >> + void f1(A &a) { >> + f0(a); // expected-error {{no matching function for call to 'f0'}} >> + } >> + >> + void f2(A &a); // expected-note {{candidate function not viable: >> cannot convert argument of incomplete type 'PointerVsReferenceSuggestion::A >> *' to 'PointerVsReferenceSuggestion::A &' for 1st argument; dereference the >> argument with *}} >> + void f3(A *a) { >> + f2(a); // expected-error {{no matching function for call to 'f2'}} >> + } >> + >> + class B {}; >> + >> + void f4(B *b); // expected-note {{candidate function not viable: no >> known conversion from 'PointerVsReferenceSuggestion::B' to >> 'PointerVsReferenceSuggestion::B *' for 1st argument; take the address of >> the argument with &}} >> + void f5(B &b) { >> + f4(b); // expected-error {{no matching function for call to 'f4'}} >> + } >> + >> + void f6(B &b); // expected-note {{candidate function not viable: no >> known conversion from 'PointerVsReferenceSuggestion::B *' to >> 'PointerVsReferenceSuggestion::B &' for 1st argument; dereference the >> argument with *}} >> + void f7(B *b) { >> + f6(b); // expected-error {{no matching function for call to 'f6'}} >> + } >> +} >> Index: lib/Sema/SemaOverload.cpp >> =================================================================== >> --- lib/Sema/SemaOverload.cpp >> +++ lib/Sema/SemaOverload.cpp >> @@ -9104,10 +9104,13 @@ >> if (const PointerType *PTy = TempFromTy->getAs<PointerType>()) >> TempFromTy = PTy->getPointeeType(); >> if (TempFromTy->isIncompleteType()) { >> + // Emit the generic diagnostic and, optionally, add the hints to it. >> S.Diag(Fn->getLocation(), >> diag::note_ovl_candidate_bad_conv_incomplete) >> << (unsigned) FnKind << FnDesc >> << (FromExpr ? FromExpr->getSourceRange() : SourceRange()) >> - << FromTy << ToTy << (unsigned) isObjectArgument << I+1; >> + << FromTy << ToTy << (unsigned) isObjectArgument << I+1 >> + << (unsigned) (Cand->Fix.Kind); >> + >> MaybeEmitInheritedConstructorNote(S, Fn); >> return; >> } >> Index: include/clang/Basic/DiagnosticSemaKinds.td >> =================================================================== >> --- include/clang/Basic/DiagnosticSemaKinds.td >> +++ include/clang/Basic/DiagnosticSemaKinds.td >> @@ -3189,7 +3189,12 @@ >> "function (the implicit move assignment operator)|" >> "constructor (inherited)}0%1 " >> "not viable: cannot convert argument of incomplete type " >> - "%diff{$ to $|to parameter type}2,3">; >> + "%diff{$ to $|to parameter type}2,3 for " >> + "%select{%ordinal5 argument|object argument}4" >> + "%select{|; dereference the argument with *|" >> + "; take the address of the argument with &|" >> + "; remove *|" >> + "; remove &}6">; >> def note_ovl_candidate_bad_list_argument : Note<"candidate " >> "%select{function|function|constructor|" >> "function |function |constructor |" >> >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits