In Sema::CheckInitializerTypes, replace a use of CheckReferenceInit with an InitializationSequence

llvm-svn: 91542
This commit is contained in:
Douglas Gregor
2009-12-16 16:54:16 +00:00
parent 4044489d69
commit 59ae3c8542
4 changed files with 14 additions and 8 deletions

View File

@@ -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.

View File

@@ -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}}

View File

@@ -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'}}

View File

@@ -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}} \