[PATCH] D16949: Fix for: Bug 5941 - improve diagnostic for * vs & confusion
Ryan Yee via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 13 20:32:55 PST 2016
ryee88 updated this revision to Diff 47925.
ryee88 added a comment.
Sorry-- re-uploading the diff. Didn't notice I dropped the code changes.
http://reviews.llvm.org/D16949
Files:
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaOverload.cpp
test/Parser/overloaded-pointer-vs-reference-hint.cpp
Index: test/Parser/overloaded-pointer-vs-reference-hint.cpp
===================================================================
--- /dev/null
+++ test/Parser/overloaded-pointer-vs-reference-hint.cpp
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify
+
+class A;
+
+void f0(A *a); // expected-note {{candidate function not viable: cannot convert argument of incomplete type 'A' to '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 'A *' to 'A &' for 1st argument; dereference the argument with *}}
+void f3(A *a) {
+ f2(a); // expected-error {{no matching function for call to 'f2'}}
+}
+
+
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.47925.patch
Type: text/x-patch
Size: 2471 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160214/d4efdca4/attachment.bin>
More information about the cfe-commits
mailing list