When initializing struct members, the important thing is that the "initializing" expression is

compatible, not having the same type.

Fix rdar://8183908 in which compatible vector types weren't initialized properly leading to a crash.

llvm-svn: 124637
This commit is contained in:
Argyrios Kyrtzidis 2011-02-01 00:52:10 +00:00
parent c46f94d490
commit 0d349f9b8a
2 changed files with 14 additions and 2 deletions

View File

@ -697,7 +697,8 @@ void InitListChecker::CheckSubElementType(const InitializedEntity &Entity,
// initial value of the object, including unnamed members, is
// that of the expression.
if ((ElemType->isRecordType() || ElemType->isVectorType()) &&
SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) {
SemaRef.CheckSingleAssignmentConstraints(ElemType, expr)
== Sema::Compatible) {
SemaRef.DefaultFunctionArrayLvalueConversion(expr);
UpdateStructuredListElement(StructuredList, StructuredIndex, expr);
++Index;

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 %s -emit-llvm -o -
// RUN: %clang_cc1 %s -emit-llvm-only
typedef struct _zend_ini_entry zend_ini_entry;
struct _zend_ini_entry {
@ -18,3 +18,14 @@ struct GLGENH {
};
struct GLGENH ABHFBF = {1};
typedef __attribute__(( ext_vector_type(2) )) unsigned int uint2;
typedef __attribute__(( __vector_size__(8) )) unsigned int __neon_uint32x2_t;
// rdar://8183908
typedef struct __simd64_uint32_t {
__neon_uint32x2_t val;
} uint32x2_t;
void foo() {
const uint32x2_t signBit = { (uint2) 0x80000000 };
}