diff options
author | John McCall <rjmccall@apple.com> | 2010-12-04 09:03:57 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-12-04 09:03:57 +0000 |
commit | 74e40b70306b39d65fed16d474017df036ff3960 (patch) | |
tree | a797db1e2c238aea4cfa8e6ad678debd14d43714 | |
parent | 9c5d70cee1fab3f988f9cd40316071b088a3f19d (diff) |
Don't crash when initializing a subaggregate in C from a property r-value.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120899 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaInit.cpp | 1 | ||||
-rw-r--r-- | test/CodeGenObjC/property.m | 12 |
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index d7048a129f..7c4bd4a82e 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -698,6 +698,7 @@ void InitListChecker::CheckSubElementType(const InitializedEntity &Entity, // that of the expression. if ((ElemType->isRecordType() || ElemType->isVectorType()) && SemaRef.Context.hasSameUnqualifiedType(expr->getType(), ElemType)) { + SemaRef.DefaultFunctionArrayLvalueConversion(expr); UpdateStructuredListElement(StructuredList, StructuredIndex, expr); ++Index; return; diff --git a/test/CodeGenObjC/property.m b/test/CodeGenObjC/property.m index 1e7ca232be..fe8737e917 100644 --- a/test/CodeGenObjC/property.m +++ b/test/CodeGenObjC/property.m @@ -77,3 +77,15 @@ void test2() { // CHECK-NEXT: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i32)*)(i8* [[BASETMP]], i8* [[SEL]], i32 [[ADD]]) test2_helper().dyn *= 10; } + +// Test aggregate initialization from property reads. +// Not crashing is good enough for the property-specific test. +struct test3_struct { int x,y,z; }; +struct test3_nested { struct test3_struct t; }; +@interface test3_object +@property struct test3_struct s; +@end +void test3(test3_object *p) { + struct test3_struct array[1] = { p.s }; + struct test3_nested agg = { p.s }; +} |