mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
In Sema::CheckInitializerTypes, replace a use of CheckReferenceInit with an InitializationSequence
llvm-svn: 91542
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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}}
|
||||
|
||||
@@ -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'}}
|
||||
|
||||
@@ -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}} \
|
||||
|
||||
Reference in New Issue
Block a user