diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-12-16 16:54:16 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-12-16 16:54:16 +0000 |
commit | 52bb5d2a1474460707e5ca11656b2749a7a33a82 (patch) | |
tree | d43575c47f20841b95c69e58d5948a05d7af7740 | |
parent | 125cebdc35dd8ff7965aa57a6ab630e2fc6fe5a3 (diff) |
In Sema::CheckInitializerTypes, replace a use of CheckReferenceInit with an InitializationSequence
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91542 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaInit.cpp | 16 | ||||
-rw-r--r-- | test/SemaCXX/decl-init-ref.cpp | 2 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-template-template-parm.cpp | 2 | ||||
-rw-r--r-- | test/SemaTemplate/metafun-apply.cpp | 2 |
4 files changed, 14 insertions, 8 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 04506908f0..20008a7c1c 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -192,11 +192,17 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, // A variable declared to be a T& or T&&, that is "reference to type T" // (8.3.2), shall be initialized by an object, or function, of // type T or by an object that can be converted into a T. - if (DeclType->isReferenceType()) - return CheckReferenceInit(Init, DeclType, InitLoc, - /*SuppressUserConversions=*/false, - /*AllowExplicit=*/DirectInit, - /*ForceRValue=*/false); + if (DeclType->isReferenceType()) { + InitializationSequence InitSeq(*this, Entity, Kind, &Init, 1); + OwningExprResult CurInit = InitSeq.Perform(*this, Entity, Kind, + MultiExprArg(*this, (void**)&Init, 1), + &DeclType); + if (CurInit.isInvalid()) + return true; + + Init = CurInit.takeAs<Expr>(); + return false; + } // C99 6.7.8p3: The type of the entity to be initialized shall be an array // of unknown size ("[]") or an object type that is not a variable array type. diff --git a/test/SemaCXX/decl-init-ref.cpp b/test/SemaCXX/decl-init-ref.cpp index ab743694a1..4200b169ab 100644 --- a/test/SemaCXX/decl-init-ref.cpp +++ b/test/SemaCXX/decl-init-ref.cpp @@ -18,7 +18,7 @@ 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'}} +const int& ri = (void)0; // expected-error {{reference to type 'int const' could not bind to an rvalue of type 'void'}} int main() { const A& rca = f(); // expected-error {{conversion from 'class B' to 'struct A const' is ambiguous}} diff --git a/test/SemaTemplate/instantiate-template-template-parm.cpp b/test/SemaTemplate/instantiate-template-template-parm.cpp index 6035308b0a..f48a0c7a71 100644 --- a/test/SemaTemplate/instantiate-template-template-parm.cpp +++ b/test/SemaTemplate/instantiate-template-template-parm.cpp @@ -17,7 +17,7 @@ struct add_reference { int i; apply<add_pointer, int>::type ip = &i; apply<add_reference, int>::type ir = i; -apply<add_reference, float>::type fr = i; // expected-error{{non-const lvalue reference to type 'float' cannot be initialized with a value of type 'int'}} +apply<add_reference, float>::type fr = i; // expected-error{{non-const lvalue reference to type 'float' cannot bind to a value of unrelated type 'int'}} // Template template parameters template<int> struct B; // expected-note{{has a different type 'int'}} diff --git a/test/SemaTemplate/metafun-apply.cpp b/test/SemaTemplate/metafun-apply.cpp index 56a2dc9c39..4044d14a84 100644 --- a/test/SemaTemplate/metafun-apply.cpp +++ b/test/SemaTemplate/metafun-apply.cpp @@ -29,7 +29,7 @@ struct apply1 { int i; apply1<add_pointer, int>::type ip = &i; apply1<add_reference, int>::type ir = i; -apply1<add_reference, float>::type fr = i; // expected-error{{non-const lvalue reference to type 'float' cannot be initialized with a value of type 'int'}} +apply1<add_reference, float>::type fr = i; // expected-error{{non-const lvalue reference to type 'float' cannot bind to a value of unrelated type 'int'}} void test() { apply1<add_reference, void>::type t; // expected-note{{in instantiation of template class 'struct apply1<struct add_reference, void>' requested here}} \ |