]> granicus.if.org Git - clang/commitdiff
Improve the diagnostic that complains about binding an rvalue
authorDouglas Gregor <dgregor@apple.com>
Fri, 21 Jan 2011 01:04:33 +0000 (01:04 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 21 Jan 2011 01:04:33 +0000 (01:04 +0000)
reference to an lvalue.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123953 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaInit.cpp
test/SemaCXX/rval-references.cpp

index 39127947372f6b2e0da05fadb94a0bbe5d7b4bb7..84b2a88d5828d27cd0af5718f34efa1f087e92bd 100644 (file)
@@ -767,7 +767,8 @@ def err_init_conversion_failed : Error<
   "base class|a vector element}0 of type %1 with an %select{rvalue|lvalue}2 of "
   "type %3">;
 
-def err_lvalue_to_rvalue_ref : Error<"rvalue reference cannot bind to lvalue">;
+def err_lvalue_to_rvalue_ref : Error<"rvalue reference to type %0 cannot bind "
+  "to lvalue of type %1">;
 def err_invalid_initialization : Error<
 "invalid initialization of reference of type %0 from expression of type %1">;
 def err_lvalue_to_rvalue_ambig_ref : Error<"rvalue reference cannot bind to lvalue "
index 59a393613162bec022402d3ec92d0eb934383ed5..3ed336dbb83b2dea9283bfe8d61e419236e354c7 100644 (file)
@@ -4140,6 +4140,7 @@ bool InitializationSequence::Diagnose(Sema &S,
       
   case FK_RValueReferenceBindingToLValue:
     S.Diag(Kind.getLocation(), diag::err_lvalue_to_rvalue_ref)
+      << DestType.getNonReferenceType() << Args[0]->getType()
       << Args[0]->getSourceRange();
     break;
       
index ee659ecbd2adb1d58cc8a5952e24d69f9a1d6320..df6e40042850b3ceca9b39cadb732da1ab4dafd3 100644 (file)
@@ -28,9 +28,9 @@ fun_type &&make_fun();
 void f() {
   int &&virr1; // expected-error {{declaration of reference variable 'virr1' requires an initializer}}
   int &&virr2 = 0;
-  int &&virr3 = virr2; // expected-error {{rvalue reference cannot bind to lvalue}}
+  int &&virr3 = virr2; // expected-error {{rvalue reference to type 'int' cannot bind to lvalue of type 'int'}}
   int i1 = 0;
-  int &&virr4 = i1; // expected-error {{rvalue reference cannot bind to lvalue}}
+  int &&virr4 = i1; // expected-error {{rvalue reference to type 'int' cannot bind to lvalue of type 'int'}}
   int &&virr5 = ret_irr();
   int &&virr6 = static_cast<int&&>(i1);
   (void)static_cast<not_int&&>(i1); // expected-error {{types are not compatible}}