]> granicus.if.org Git - clang/commitdiff
Issue good diagnostics when initializing a refernce type with
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 30 Sep 2009 21:23:30 +0000 (21:23 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 30 Sep 2009 21:23:30 +0000 (21:23 +0000)
a bad initializer. Fixes pr4274.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/decl-init-ref.cpp

index 06e1516686b4f2a5d2de4a7ea3541ba651c9d791..b5672fd7ca83dc156518b1cccb094e3b57e594c2 100644 (file)
@@ -474,6 +474,8 @@ def err_destructor_name : Error<
 
 // C++ initialization
 def err_lvalue_to_rvalue_ref : Error<"rvalue reference cannot bind to lvalue">;
+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 "
                                            "due to multiple conversion functions">;
 // FIXME: passing in an English string as %1!
index 223662afce9ed82827545a2092c8f02c3f8c0085..1966aebca2dd4d5481969e2f392e309b432570ed 100644 (file)
@@ -3703,9 +3703,14 @@ Sema::CheckReferenceInit(Expr *&Init, QualType DeclType,
           Diag(Func->getLocation(), diag::err_ovl_candidate);
         }
       }
-      else
-        Diag(DeclLoc, diag::err_lvalue_to_rvalue_ref)
-          << Init->getSourceRange();
+      else {
+        if (isRValRef)
+          Diag(DeclLoc, diag::err_lvalue_to_rvalue_ref) 
+            << Init->getSourceRange();
+        else
+          Diag(DeclLoc, diag::err_invalid_initialization)
+            << DeclType << Init->getType() << Init->getSourceRange();
+      }
     }
     return badConversion;
   }
index a87c0efae2a73fc99dd61d952015f72a405b68d1..9fb3f171d6006934c8c79a28d528bac5f2ed9ccb 100644 (file)
@@ -18,6 +18,8 @@ class B : public BASE , public BASE1
 
 extern B f();
 
+const int& ri = (void)0; // expected-error {{invalid initialization of reference of type 'int const &' from expression of type 'void'}}
+
 int main() {
         const A& rca = f(); // expected-error {{rvalue reference cannot bind to lvalue due to multiple conversion functions}}
         A& ra = f(); // expected-error {{non-const lvalue reference to type 'struct A' cannot be initialized with a temporary of type 'class B'}}