From: Douglas Gregor Date: Fri, 21 Jan 2011 01:04:33 +0000 (+0000) Subject: Improve the diagnostic that complains about binding an rvalue X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fb5d7efc279335bde2cdc0a73da525d6b28201e9;p=clang Improve the diagnostic that complains about binding an rvalue reference to an lvalue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123953 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 3912794737..84b2a88d58 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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 " diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 59a3936131..3ed336dbb8 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -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; diff --git a/test/SemaCXX/rval-references.cpp b/test/SemaCXX/rval-references.cpp index ee659ecbd2..df6e400428 100644 --- a/test/SemaCXX/rval-references.cpp +++ b/test/SemaCXX/rval-references.cpp @@ -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(i1); (void)static_cast(i1); // expected-error {{types are not compatible}}