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

Ryan Yee via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 16 22:01:17 PST 2016


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. 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 |"


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16949.48149.patch
Type: text/x-patch
Size: 3352 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160217/17f6515f/attachment.bin>


More information about the cfe-commits mailing list