From 45ac397b4181223667a2b9147706f3c727db7874 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 14 Feb 2014 19:37:25 +0000 Subject: [PATCH] [IRGen]. Fixes a crash in using Objective-C array properties by fixing shouldBindAsLValue to accept arrays (like record types) because we always manipulate them in memory. Patch suggested by John MaCall. // rdar://15610943 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201428 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenFunction.h | 4 ++-- test/CodeGenObjC/property-array-type.m | 30 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 test/CodeGenObjC/property-array-type.m diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 322f480c83..a1f6721ae8 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/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/test/CodeGenObjC/property-array-type.m b/test/CodeGenObjC/property-array-type.m new file mode 100644 index 0000000000..6600fd0f59 --- /dev/null +++ b/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]]) -- 2.40.0