]> granicus.if.org Git - clang/commitdiff
Clarify the error message when the reason the conversion is not viable is because...
authorNick Lewycky <nicholas@mxc.ca>
Tue, 25 Aug 2015 22:18:46 +0000 (22:18 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Tue, 25 Aug 2015 22:18:46 +0000 (22:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245979 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaInit.cpp
lib/Sema/SemaOverload.cpp
test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.spec.auto/p3-generic-lambda-1y.cpp
test/CXX/expr/expr.prim/expr.prim.lambda/templates.cpp
test/SemaCXX/rval-references.cpp

index 08d38872036ed8d36537e29c81d4f3d37f6c6874..819324609a6acdec48f84068c343df3a8006504e 100644 (file)
@@ -5792,7 +5792,8 @@ def err_typecheck_bool_condition : Error<
 def err_typecheck_ambiguous_condition : Error<
   "conversion %diff{from $ to $|between types}0,1 is ambiguous">;
 def err_typecheck_nonviable_condition : Error<
-  "no viable conversion%diff{ from $ to $|}0,1">;
+  "no viable conversion%select{%diff{ from $ to $|}1,2|"
+  "%diff{ from returned value of type $ to function return type $|}1,2}0">;
 def err_typecheck_nonviable_condition_incomplete : Error<
   "no viable conversion%diff{ from $ to incomplete type $|}0,1">;
 def err_typecheck_deleted_function : Error<
index 1b958ae782c8c71a4fa741efb9855f53fb60bb7e..de11666747ab1744f6cfc4ede059e04ff761449a 100644 (file)
@@ -6946,6 +6946,7 @@ bool InitializationSequence::Diagnose(Sema &S,
                           diag::err_typecheck_nonviable_condition_incomplete,
                                Args[0]->getType(), Args[0]->getSourceRange()))
         S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
+          << (Entity.getKind() == InitializedEntity::EK_Result)
           << Args[0]->getType() << Args[0]->getSourceRange()
           << DestType.getNonReferenceType();
 
index ed986902fcbeb56e9329144d2d8c976060ddf6f0..3906ba8e94830cfdc9ce42a734139f84875b5099 100644 (file)
@@ -3212,7 +3212,7 @@ Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) {
                              diag::err_typecheck_nonviable_condition_incomplete,
                              From->getType(), From->getSourceRange()))
       Diag(From->getLocStart(), diag::err_typecheck_nonviable_condition)
-          << From->getType() << From->getSourceRange() << ToType;
+          << false << From->getType() << From->getSourceRange() << ToType;
   } else
     return false;
   CandidateSet.NoteCandidates(*this, OCD_AllCandidates, From);
index 65b085bcec13fc65bf1341224811ea5b69fde2fd..07bc884e7d5ee38494aaf3fddc0ce6d782e57261 100644 (file)
@@ -49,7 +49,7 @@ int main()
       static double dfi(int i) { return i + 3.14; }
       static Local localfi(int) { return Local{}; }
     };
-    auto l4 = [](auto (*fp)(int)) -> int { return fp(3); }; //expected-error{{no viable conversion from 'Local' to 'int'}} 
+    auto l4 = [](auto (*fp)(int)) -> int { return fp(3); }; //expected-error{{no viable conversion from returned value of type 'Local' to function return type 'int'}} 
     l4(&Local::ifi);
     l4(&Local::cfi);
     l4(&Local::dfi);
index c18bb7d1921bca5a24e320c27140a4298411a1a4..e40761770d5558b81fe5cd0de9bb8ff703628f7b 100644 (file)
@@ -38,7 +38,7 @@ template X captures(X, X);
 template<typename T>
 int infer_result(T x, T y) {
   auto lambda = [=](bool b) { return x + y; };
-  return lambda(true); // expected-error{{no viable conversion from 'X' to 'int'}}
+  return lambda(true); // expected-error{{no viable conversion from returned value of type 'X' to function return type 'int'}}
 }
 
 template int infer_result(int, int);
index fc341e87f4a404c67dc68dcecffbee0ebcee1e71..9c79ad7b0b97cc5625e69be9b534457cb46d2a2d 100644 (file)
@@ -90,5 +90,5 @@ MoveOnly returningNonEligible() {
   else if (0) // Copy from reference can't be elided
     return r; // expected-error {{call to deleted constructor}}
   else // Construction from different type can't be elided
-    return i; // expected-error {{no viable conversion from 'int' to 'MoveOnly'}}
+    return i; // expected-error {{no viable conversion from returned value of type 'int' to function return type 'MoveOnly'}}
 }