forked from OSchip/llvm-project
Use the new init code for member subobjects.
llvm-svn: 94329
This commit is contained in:
parent
0cf999b663
commit
73eb7cd351
|
@ -236,7 +236,8 @@ class InitListChecker {
|
|||
InitListExpr *IList, QualType DeclType, unsigned &Index,
|
||||
InitListExpr *StructuredList,
|
||||
unsigned &StructuredIndex);
|
||||
void CheckStructUnionTypes(InitListExpr *IList, QualType DeclType,
|
||||
void CheckStructUnionTypes(const InitializedEntity *Entity,
|
||||
InitListExpr *IList, QualType DeclType,
|
||||
RecordDecl::field_iterator Field,
|
||||
bool SubobjectIsDesignatorContext, unsigned &Index,
|
||||
InitListExpr *StructuredList,
|
||||
|
@ -633,7 +634,7 @@ void InitListChecker::CheckListElementTypes(const InitializedEntity *Entity,
|
|||
} else if (DeclType->isAggregateType()) {
|
||||
if (DeclType->isRecordType()) {
|
||||
RecordDecl *RD = DeclType->getAs<RecordType>()->getDecl();
|
||||
CheckStructUnionTypes(IList, DeclType, RD->field_begin(),
|
||||
CheckStructUnionTypes(Entity, IList, DeclType, RD->field_begin(),
|
||||
SubobjectIsDesignatorContext, Index,
|
||||
StructuredList, StructuredIndex,
|
||||
TopLevelObject);
|
||||
|
@ -1060,7 +1061,8 @@ void InitListChecker::CheckArrayType(const InitializedEntity *Entity,
|
|||
}
|
||||
}
|
||||
|
||||
void InitListChecker::CheckStructUnionTypes(InitListExpr *IList,
|
||||
void InitListChecker::CheckStructUnionTypes(const InitializedEntity *Entity,
|
||||
InitListExpr *IList,
|
||||
QualType DeclType,
|
||||
RecordDecl::field_iterator Field,
|
||||
bool SubobjectIsDesignatorContext,
|
||||
|
@ -1138,8 +1140,17 @@ void InitListChecker::CheckStructUnionTypes(InitListExpr *IList,
|
|||
continue;
|
||||
}
|
||||
|
||||
CheckSubElementType(0, IList, Field->getType(), Index,
|
||||
StructuredList, StructuredIndex);
|
||||
// FIXME: Once we know Entity is not null, we can get rid of the check
|
||||
// and the else block.
|
||||
if (Entity) {
|
||||
InitializedEntity MemberEntity =
|
||||
InitializedEntity::InitializeMember(*Field, Entity);
|
||||
CheckSubElementType(&MemberEntity, IList, Field->getType(), Index,
|
||||
StructuredList, StructuredIndex);
|
||||
} else {
|
||||
CheckSubElementType(0, IList, Field->getType(), Index,
|
||||
StructuredList, StructuredIndex);
|
||||
}
|
||||
InitializedSomething = true;
|
||||
|
||||
if (DeclType->isUnionType()) {
|
||||
|
@ -1549,7 +1560,8 @@ InitListChecker::CheckDesignatedInitializer(InitListExpr *IList,
|
|||
|
||||
// Check the remaining fields within this class/struct/union subobject.
|
||||
bool prevHadError = hadError;
|
||||
CheckStructUnionTypes(IList, CurrentObjectType, Field, false, Index,
|
||||
|
||||
CheckStructUnionTypes(0, IList, CurrentObjectType, Field, false, Index,
|
||||
StructuredList, FieldIndex);
|
||||
return hadError && !prevHadError;
|
||||
}
|
||||
|
|
|
@ -37,3 +37,6 @@ __v4hi v1 = { (void *)1, 2, 3 }; // expected-error {{cannot initialize a vector
|
|||
|
||||
// Array initialization.
|
||||
int a[] = { (void *)1 }; // expected-error {{cannot initialize an array element of type 'int' with an rvalue of type 'void *'}}
|
||||
|
||||
// Struct initialization.
|
||||
struct S { int a; } s = { (void *)1 }; // expected-error {{cannot initialize a member subobject of type 'int' with an rvalue of type 'void *'}}
|
||||
|
|
|
@ -120,4 +120,4 @@ u u1 = { 1 };
|
|||
u u2 = u1;
|
||||
u u3 = 1; // expected-error{{no viable conversion}}
|
||||
u u4 = { 0, "asdf" }; // expected-error{{excess elements in union initializer}}
|
||||
u u5 = { "asdf" }; // expected-error{{incompatible type initializing 'char const [5]', expected 'int'}}
|
||||
u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'char const [5]'}}
|
||||
|
|
|
@ -197,7 +197,7 @@ template struct InitList1<APair, int*>;
|
|||
template<typename T, typename Val1, typename Val2>
|
||||
struct InitList2 {
|
||||
void f(Val1 val1, Val2 val2) {
|
||||
T x = { val1, val2 }; // expected-error{{incompatible}}
|
||||
T x = { val1, val2 }; // expected-error{{cannot initialize}}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue