diff options
| -rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 4 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/property-array-type.m | 30 |
2 files changed, 32 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 322f480c834..a1f6721ae81 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -688,8 +688,8 @@ public: // act exactly like l-values but are formally required to be // r-values in C. return expr->isGLValue() || - expr->getType()->isRecordType() || - expr->getType()->isFunctionType(); + expr->getType()->isFunctionType() || + hasAggregateEvaluationKind(expr->getType()); } static OpaqueValueMappingData bind(CodeGenFunction &CGF, diff --git a/clang/test/CodeGenObjC/property-array-type.m b/clang/test/CodeGenObjC/property-array-type.m new file mode 100644 index 00000000000..6600fd0f596 --- /dev/null +++ b/clang/test/CodeGenObjC/property-array-type.m @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// rdar://15610943 + +struct _GLKMatrix4 +{ + float m[16]; +}; +typedef struct _GLKMatrix4 GLKMatrix4; + +@interface NSObject @end + +@interface MyProgram +- (void)setTransform:(float[16])transform; +@end + +@interface ViewController +@property (nonatomic, assign) GLKMatrix4 transform; +@end + +@implementation ViewController +- (void)viewDidLoad { + MyProgram *program; + program.transform = self.transform.m; +} +@end + +// CHECK: [[M:%.*]] = getelementptr inbounds %struct._GLKMatrix4* [[TMP:%.*]], i32 0, i32 0 +// CHECK: [[ARRAYDECAY:%.*]] = getelementptr inbounds [16 x float]* [[M]], i32 0, i32 0 +// CHECK: [[SIX:%.*]] = load i8** @"\01L_OBJC_SELECTOR_REFERENCES +// CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, float*)*)(i8* [[SEVEN:%.*]], i8* [[SIX]], float* [[ARRAYDECAY]]) |

