[PATCH] D16949: Fix for: Bug 5941 - improve diagnostic for * vs & confusion

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 25 18:10:26 PST 2016


On Tue, Feb 16, 2016 at 10:45 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Tue, Feb 16, 2016 at 10:01 PM, Ryan Yee via cfe-commits <
> cfe-commits at 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 at -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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160225/ade150a2/attachment-0001.html>


More information about the cfe-commits mailing list