Initial patch was missing tests, because I didn’t ’svn-add’ new files. Can you please apply it on release_37 branch?
My apologies for this fault. > On 23 Jul 2015, at 16:45, Alex Denisov <1101.deb...@gmail.com> wrote: > > Author: alexdenisov > Date: Thu Jul 23 09:45:41 2015 > New Revision: 243018 > > URL: http://llvm.org/viewvc/llvm-project?rev=243018&view=rev > Log: > Add missing files for objc_boxable feature. > > Original patch [r240761] is missing all new files because of committer's > mistake. > > > Added: > cfe/trunk/test/CodeGenObjC/Inputs/nsvalue-boxed-expressions-support.h > cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios-arc.m > cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios.m > cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac-arc.m > cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac.m > cfe/trunk/test/Lexer/has_attribute_objc_boxable.m > cfe/trunk/test/Lexer/has_feature_boxed_nsvalue_expressions.m > cfe/trunk/test/PCH/objc_boxable.m > cfe/trunk/test/PCH/objc_boxable_record.h > cfe/trunk/test/PCH/objc_boxable_record_attr.h > cfe/trunk/test/SemaObjC/objc-boxed-expressions-nsvalue.m > cfe/trunk/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm > > Added: cfe/trunk/test/CodeGenObjC/Inputs/nsvalue-boxed-expressions-support.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/Inputs/nsvalue-boxed-expressions-support.h?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/Inputs/nsvalue-boxed-expressions-support.h > (added) > +++ cfe/trunk/test/CodeGenObjC/Inputs/nsvalue-boxed-expressions-support.h Thu > Jul 23 09:45:41 2015 > @@ -0,0 +1,63 @@ > +#ifndef NSVALUE_BOXED_EXPRESSIONS_SUPPORT_H > +#define NSVALUE_BOXED_EXPRESSIONS_SUPPORT_H > + > +#define BOXABLE __attribute__((objc_boxable)) > + > +typedef unsigned long NSUInteger; > +typedef double CGFloat; > + > +typedef struct BOXABLE _NSRange { > + NSUInteger location; > + NSUInteger length; > +} NSRange; > + > +typedef struct BOXABLE _NSPoint { > + CGFloat x; > + CGFloat y; > +} NSPoint; > + > +typedef struct BOXABLE _NSSize { > + CGFloat width; > + CGFloat height; > +} NSSize; > + > +typedef struct BOXABLE _NSRect { > + NSPoint origin; > + NSSize size; > +} NSRect; > + > +struct CGPoint { > + CGFloat x; > + CGFloat y; > +}; > +typedef struct BOXABLE CGPoint CGPoint; > + > +struct CGSize { > + CGFloat width; > + CGFloat height; > +}; > +typedef struct BOXABLE CGSize CGSize; > + > +struct CGRect { > + CGPoint origin; > + CGSize size; > +}; > +typedef struct BOXABLE CGRect CGRect; > + > +struct NSEdgeInsets { > + CGFloat top; > + CGFloat left; > + CGFloat bottom; > + CGFloat right; > +}; > +typedef struct BOXABLE NSEdgeInsets NSEdgeInsets; > + > +@interface NSValue > + > ++ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; > + > +@end > + > +NSRange getRange(); > + > +#endif // NSVALUE_BOXED_EXPRESSIONS_SUPPORT_H > > Added: cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios-arc.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios-arc.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios-arc.m (added) > +++ cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios-arc.m Thu Jul 23 > 09:45:41 2015 > @@ -0,0 +1,126 @@ > +// RUN: %clang_cc1 -I %S/Inputs -triple armv7-apple-ios8.0.0 -emit-llvm > -fobjc-arc -O2 -disable-llvm-optzns -o - %s | FileCheck %s > + > +#import "nsvalue-boxed-expressions-support.h" > + > +// CHECK: [[CLASS:@.*]] = external global %struct._class_t > +// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}} > +// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=II{{.*}} > +// CHECK: [[METH:@.*]] = private > global{{.*}}valueWithBytes:objCType:{{.*}} > +// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}} > +// CHECK: [[POINT_STR:.*]] = {{.*}}CGPoint=dd{{.*}} > +// CHECK: [[SIZE_STR:.*]] = {{.*}}CGSize=dd{{.*}} > +// CHECK: [[RECT_STR:.*]] = > {{.*}}CGRect={CGPoint=dd}{CGSize=dd}}{{.*}} > +// CHECK: [[EDGE_STR:.*]] = {{.*}}NSEdgeInsets=dddd{{.*}} > + > +// CHECK-LABEL: define void @doRange() > +void doRange() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSRange* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSRange ns_range = { .location = 0, .length = 42 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *range = @(ns_range); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doPoint() > +void doPoint() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.CGPoint{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.CGPoint{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.CGPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.CGPoint* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.CGPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + CGPoint cg_point = { .x = 42, .y = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[POINT_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *point = @(cg_point); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doSize() > +void doSize() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.CGSize{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.CGSize{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.CGSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.CGSize* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.CGSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + CGSize cg_size = { .width = 42, .height = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[SIZE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *size = @(cg_size); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRect() > +void doRect() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.CGRect{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.CGRect{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.CGRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.CGRect* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.CGRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + CGPoint cg_point = { .x = 42, .y = 24 }; > + CGSize cg_size = { .width = 42, .height = 24 }; > + CGRect cg_rect = { .origin = cg_point, .size = cg_size }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[RECT_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *rect = @(cg_rect); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doNSEdgeInsets() > +void doNSEdgeInsets() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSEdgeInsets ns_edge_insets; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[EDGE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *edge_insets = @(ns_edge_insets); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRangeRValue() > +void doRangeRValue() { > + // CHECK: [[COERCE:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: call {{.*}} @getRange {{.*}} [[COERCE]]{{.*}} > + // CHECK: [[COERCE_CAST:%.*]] = bitcast %struct._NSRange* > [[COERCE]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* > [[RECV_PTR]] to i8* > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[COERCE_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *range_rvalue = @(getRange()); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > > Added: cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios.m (added) > +++ cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-ios.m Thu Jul 23 09:45:41 > 2015 > @@ -0,0 +1,114 @@ > +// RUN: %clang_cc1 -I %S/Inputs -triple armv7-apple-ios8.0.0 -emit-llvm -O2 > -disable-llvm-optzns -o - %s | FileCheck %s > + > +#import "nsvalue-boxed-expressions-support.h" > + > +// CHECK: [[CLASS:@.*]] = external global %struct._class_t > +// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}} > +// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=II{{.*}} > +// CHECK: [[METH:@.*]] = private > global{{.*}}valueWithBytes:objCType:{{.*}} > +// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}} > +// CHECK: [[POINT_STR:.*]] = {{.*}}CGPoint=dd{{.*}} > +// CHECK: [[SIZE_STR:.*]] = {{.*}}CGSize=dd{{.*}} > +// CHECK: [[RECT_STR:.*]] = > {{.*}}CGRect={CGPoint=dd}{CGSize=dd}}{{.*}} > +// CHECK: [[EDGE_STR:.*]] = {{.*}}NSEdgeInsets=dddd{{.*}} > + > +// CHECK-LABEL: define void @doRange() > +void doRange() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSRange* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSRange ns_range = { .location = 0, .length = 42 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + NSValue *range = @(ns_range); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doPoint() > +void doPoint() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.CGPoint{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.CGPoint{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.CGPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.CGPoint* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.CGPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + CGPoint cg_point = { .x = 42, .y = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[POINT_STR]]{{.*}}) > + NSValue *point = @(cg_point); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doSize() > +void doSize() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.CGSize{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.CGSize{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.CGSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.CGSize* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.CGSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + CGSize cg_size = { .width = 42, .height = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[SIZE_STR]]{{.*}}) > + NSValue *size = @(cg_size); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRect() > +void doRect() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.CGRect{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.CGRect{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.CGRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.CGRect* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.CGRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + CGPoint cg_point = { .x = 42, .y = 24 }; > + CGSize cg_size = { .width = 42, .height = 24 }; > + CGRect cg_rect = { .origin = cg_point, .size = cg_size }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[RECT_STR]]{{.*}}) > + NSValue *rect = @(cg_rect); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doNSEdgeInsets() > +void doNSEdgeInsets() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSEdgeInsets ns_edge_insets; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[EDGE_STR]]{{.*}}) > + NSValue *edge_insets = @(ns_edge_insets); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRangeRValue() > +void doRangeRValue() { > + // CHECK: [[COERCE:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: call {{.*}} @getRange {{.*}} [[COERCE]]{{.*}} > + // CHECK: [[COERCE_CAST:%.*]] = bitcast %struct._NSRange* > [[COERCE]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* > [[RECV_PTR]] to i8* > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[COERCE_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + NSValue *range_rvalue = @(getRange()); > + // CHECK: ret void > +} > + > > Added: cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac-arc.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac-arc.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac-arc.m (added) > +++ cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac-arc.m Thu Jul 23 > 09:45:41 2015 > @@ -0,0 +1,130 @@ > +// RUN: %clang_cc1 -I %S/Inputs -triple x86_64-apple-macosx -emit-llvm > -fobjc-arc -O2 -disable-llvm-optzns -o - %s | FileCheck %s > + > +#import "nsvalue-boxed-expressions-support.h" > + > +// CHECK: [[CLASS:@.*]] = external global %struct._class_t > +// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}} > +// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=QQ{{.*}} > +// CHECK: [[METH:@.*]] = private > global{{.*}}valueWithBytes:objCType:{{.*}} > +// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}} > +// CHECK: [[POINT_STR:.*]] = {{.*}}_NSPoint=dd{{.*}} > +// CHECK: [[SIZE_STR:.*]] = {{.*}}_NSSize=dd{{.*}} > +// CHECK: [[RECT_STR:.*]] = > {{.*}}_NSRect={_NSPoint=dd}{_NSSize=dd}}{{.*}} > +// CHECK: [[EDGE_STR:.*]] = {{.*}}NSEdgeInsets=dddd{{.*}} > + > +// CHECK-LABEL: define void @doRange() > +void doRange() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSRange* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSRange ns_range = { .location = 0, .length = 42 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *range = @(ns_range); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doPoint() > +void doPoint() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSPoint{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSPoint{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSPoint* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSPoint ns_point = { .x = 42, .y = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[POINT_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *point = @(ns_point); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doSize() > +void doSize() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSSize{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSSize{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSSize* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSSize ns_size = { .width = 42, .height = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[SIZE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *size = @(ns_size); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRect() > +void doRect() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSRect{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSRect{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSRect* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSPoint ns_point = { .x = 42, .y = 24 }; > + NSSize ns_size = { .width = 42, .height = 24 }; > + NSRect ns_rect = { .origin = ns_point, .size = ns_size }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[RECT_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *rect = @(ns_rect); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doNSEdgeInsets() > +void doNSEdgeInsets() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSEdgeInsets ns_edge_insets; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[EDGE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *edge_insets = @(ns_edge_insets); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRangeRValue() > +void doRangeRValue() { > + // CHECK: [[COERCE:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[RVAL:%.*]] = call {{.*}} @getRange() > + // CHECK: [[COERCE_CAST:%.*]] = bitcast %struct._NSRange* > [[COERCE]]{{.*}} > + // CHECK: [[COERCE_CAST_PTR:%.*]] = getelementptr {{.*}} > [[COERCE_CAST]], {{.*}} > + // CHECK: [[EXTR_RVAL:%.*]] = extractvalue {{.*}} [[RVAL]]{{.*}} > + // CHECK: store {{.*}}[[EXTR_RVAL]]{{.*}}[[COERCE_CAST_PTR]]{{.*}} > + // CHECK: [[COERCE_CAST:%.*]] = bitcast %struct._NSRange* > [[COERCE]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* > [[RECV_PTR]] to i8* > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[COERCE_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + // CHECK: call i8* @objc_retainAutoreleasedReturnValue > + NSValue *range_rvalue = @(getRange()); > + // CHECK: call void @objc_release > + // CHECK: ret void > +} > + > > Added: cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac.m (added) > +++ cfe/trunk/test/CodeGenObjC/nsvalue-objc-boxable-mac.m Thu Jul 23 09:45:41 > 2015 > @@ -0,0 +1,118 @@ > +// RUN: %clang_cc1 -I %S/Inputs -triple x86_64-apple-macosx -emit-llvm -O2 > -disable-llvm-optzns -o - %s | FileCheck %s > + > +#import "nsvalue-boxed-expressions-support.h" > + > +// CHECK: [[CLASS:@.*]] = external global %struct._class_t > +// CHECK: [[NSVALUE:@.*]] = {{.*}}[[CLASS]]{{.*}} > +// CHECK: [[RANGE_STR:.*]] = {{.*}}_NSRange=QQ{{.*}} > +// CHECK: [[METH:@.*]] = private > global{{.*}}valueWithBytes:objCType:{{.*}} > +// CHECK: [[VALUE_SEL:@.*]] = {{.*}}[[METH]]{{.*}} > +// CHECK: [[POINT_STR:.*]] = {{.*}}_NSPoint=dd{{.*}} > +// CHECK: [[SIZE_STR:.*]] = {{.*}}_NSSize=dd{{.*}} > +// CHECK: [[RECT_STR:.*]] = > {{.*}}_NSRect={_NSPoint=dd}{_NSSize=dd}}{{.*}} > +// CHECK: [[EDGE_STR:.*]] = {{.*}}NSEdgeInsets=dddd{{.*}} > + > +// CHECK-LABEL: define void @doRange() > +void doRange() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSRange* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSRange* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSRange ns_range = { .location = 0, .length = 42 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + NSValue *range = @(ns_range); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doPoint() > +void doPoint() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSPoint{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSPoint{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSPoint* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSPoint* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSPoint ns_point = { .x = 42, .y = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[POINT_STR]]{{.*}}) > + NSValue *point = @(ns_point); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doSize() > +void doSize() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSSize{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSSize{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSSize* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSSize* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSSize ns_size = { .width = 42, .height = 24 }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8* {{.*}}[[SIZE_STR]]{{.*}}) > + NSValue *size = @(ns_size); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRect() > +void doRect() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct._NSRect{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct._NSRect{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct._NSRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct._NSRect* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct._NSRect* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSPoint ns_point = { .x = 42, .y = 24 }; > + NSSize ns_size = { .width = 42, .height = 24 }; > + NSRect ns_rect = { .origin = ns_point, .size = ns_size }; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[RECT_STR]]{{.*}}) > + NSValue *rect = @(ns_rect); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doNSEdgeInsets() > +void doNSEdgeInsets() { > + // CHECK: [[LOCAL_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[TEMP_VAR:%.*]] = alloca %struct.NSEdgeInsets{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[TEMP_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[LOCAL_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[LOCAL_VAR]]{{.*}} > + // CHECK: call void @llvm.memcpy{{.*}} [[TEMP_CAST]]{{.*}} > [[LOCAL_CAST]]{{.*}} > + // CHECK: [[PARAM_CAST:%.*]] = bitcast %struct.NSEdgeInsets* > [[TEMP_VAR]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* [[RECV_PTR]] > to i8* > + NSEdgeInsets ns_edge_insets; > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[PARAM_CAST]], i8*{{.*}}[[EDGE_STR]]{{.*}}) > + NSValue *edge_insets = @(ns_edge_insets); > + // CHECK: ret void > +} > + > +// CHECK-LABEL: define void @doRangeRValue() > +void doRangeRValue() { > + // CHECK: [[COERCE:%.*]] = alloca %struct._NSRange{{.*}} > + // CHECK: [[RECV_PTR:%.*]] = load {{.*}} [[NSVALUE]] > + // CHECK: [[RVAL:%.*]] = call {{.*}} @getRange() > + // CHECK: [[COERCE_CAST:%.*]] = bitcast %struct._NSRange* > [[COERCE]]{{.*}} > + // CHECK: [[COERCE_CAST_PTR:%.*]] = getelementptr {{.*}} > [[COERCE_CAST]], {{.*}} > + // CHECK: [[EXTR_RVAL:%.*]] = extractvalue {{.*}} [[RVAL]]{{.*}} > + // CHECK: store {{.*}}[[EXTR_RVAL]]{{.*}}[[COERCE_CAST_PTR]]{{.*}} > + // CHECK: [[COERCE_CAST:%.*]] = bitcast %struct._NSRange* > [[COERCE]]{{.*}} > + // CHECK: [[SEL:%.*]] = load i8*, i8** [[VALUE_SEL]] > + // CHECK: [[RECV:%.*]] = bitcast %struct._class_t* > [[RECV_PTR]] to i8* > + // CHECK: call {{.*objc_msgSend.*}}(i8* [[RECV]], i8* [[SEL]], i8* > [[COERCE_CAST]], i8* {{.*}}[[RANGE_STR]]{{.*}}) > + NSValue *range_rvalue = @(getRange()); > + // CHECK: ret void > +} > + > > Added: cfe/trunk/test/Lexer/has_attribute_objc_boxable.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/has_attribute_objc_boxable.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/Lexer/has_attribute_objc_boxable.m (added) > +++ cfe/trunk/test/Lexer/has_attribute_objc_boxable.m Thu Jul 23 09:45:41 2015 > @@ -0,0 +1,8 @@ > +// RUN: %clang_cc1 -E %s -o - | FileCheck %s > + > +#if __has_attribute(objc_boxable) > +int has_objc_boxable_attribute(); > +#endif > + > +// CHECK: has_objc_boxable_attribute > + > > Added: cfe/trunk/test/Lexer/has_feature_boxed_nsvalue_expressions.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/has_feature_boxed_nsvalue_expressions.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/Lexer/has_feature_boxed_nsvalue_expressions.m (added) > +++ cfe/trunk/test/Lexer/has_feature_boxed_nsvalue_expressions.m Thu Jul 23 > 09:45:41 2015 > @@ -0,0 +1,8 @@ > +// RUN: %clang_cc1 -E %s -o - | FileCheck %s > + > +#if __has_feature(objc_boxed_nsvalue_expressions) > +int has_objc_boxed_nsvalue_expressions(); > +#endif > + > +// CHECK: has_objc_boxed_nsvalue_expressions > + > > Added: cfe/trunk/test/PCH/objc_boxable.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/objc_boxable.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/PCH/objc_boxable.m (added) > +++ cfe/trunk/test/PCH/objc_boxable.m Thu Jul 23 09:45:41 2015 > @@ -0,0 +1,17 @@ > +// Test objc_boxable update record > + > +// RUN: %clang_cc1 -x objective-c %S/objc_boxable_record.h -emit-pch -o %t1 > +// RUN: %clang_cc1 -x objective-c %S/objc_boxable_record_attr.h -include-pch > %t1 -emit-pch -o %t2 > +// RUN: %clang_cc1 %s -include-pch %t2 -fsyntax-only -verify > + > +// expected-no-diagnostics > + > +__attribute__((objc_root_class)) > +@interface NSValue > ++ (NSValue *)valueWithBytes:(const void *)bytes objCType:(const char *)type; > +@end > + > +void doStuff(struct boxable b) { > + id v = @(b); > +} > + > > Added: cfe/trunk/test/PCH/objc_boxable_record.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/objc_boxable_record.h?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/PCH/objc_boxable_record.h (added) > +++ cfe/trunk/test/PCH/objc_boxable_record.h Thu Jul 23 09:45:41 2015 > @@ -0,0 +1,5 @@ > +// used with objc_boxable.m test > +struct boxable { > + int dummy; > +}; > + > > Added: cfe/trunk/test/PCH/objc_boxable_record_attr.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/objc_boxable_record_attr.h?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/PCH/objc_boxable_record_attr.h (added) > +++ cfe/trunk/test/PCH/objc_boxable_record_attr.h Thu Jul 23 09:45:41 2015 > @@ -0,0 +1,3 @@ > +// used with objc_boxable.m test > +typedef struct __attribute((objc_boxable)) boxable boxable; > + > > Added: cfe/trunk/test/SemaObjC/objc-boxed-expressions-nsvalue.m > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objc-boxed-expressions-nsvalue.m?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/SemaObjC/objc-boxed-expressions-nsvalue.m (added) > +++ cfe/trunk/test/SemaObjC/objc-boxed-expressions-nsvalue.m Thu Jul 23 > 09:45:41 2015 > @@ -0,0 +1,101 @@ > +// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s > + > +#define BOXABLE __attribute__((objc_boxable)) > + > +typedef struct BOXABLE _NSPoint { > + int dummy; > +} NSPoint; > + > +typedef struct BOXABLE _NSSize { > + int dummy; > +} NSSize; > + > +typedef struct BOXABLE _NSRect { > + int dummy; > +} NSRect; > + > +typedef struct BOXABLE _CGPoint { > + int dummy; > +} CGPoint; > + > +typedef struct BOXABLE _CGSize { > + int dummy; > +} CGSize; > + > +typedef struct BOXABLE _CGRect { > + int dummy; > +} CGRect; > + > +typedef struct BOXABLE _NSRange { > + int dummy; > +} NSRange; > + > +struct _NSEdgeInsets { > + int dummy; > +}; > + > +typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets; > + > +typedef struct _SomeStruct { > + double d; > +} SomeStruct; > + > +typedef union BOXABLE _BoxableUnion { > + int dummy; > +} BoxableUnion; > + > +void checkNSValueDiagnostic() { > + NSRect rect; > + id value = @(rect); // expected-error{{NSValue must be available to use > Objective-C boxed expressions}} > +} > + > +@interface NSValue > ++ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; > +@end > + > +int main() { > + NSPoint ns_point; > + id ns_point_value = @(ns_point); > + > + NSSize ns_size; > + id ns_size_value = @(ns_size); > + > + NSRect ns_rect; > + id ns_rect_value = @(ns_rect); > + > + CGPoint cg_point; > + id cg_point_value = @(cg_point); > + > + CGSize cg_size; > + id cg_size_value = @(cg_size); > + > + CGRect cg_rect; > + id cg_rect_value = @(cg_rect); > + > + NSRange ns_range; > + id ns_range_value = @(ns_range); > + > + NSEdgeInsets edge_insets; > + id edge_insets_object = @(edge_insets); > + > + BoxableUnion boxable_union; > + id boxed_union = @(boxable_union); > + > + SomeStruct s; > + id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka 'struct > _SomeStruct') used in a boxed expression}} > +} > + > +CGRect getRect() { > + CGRect r; > + return r; > +} > + > +SomeStruct getSomeStruct() { > + SomeStruct s; > + return s; > +} > + > +void rvalue() { > + id rv_rect = @(getRect()); > + id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type > 'SomeStruct' (aka 'struct _SomeStruct') used in a boxed expression}} > +} > > Added: cfe/trunk/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm?rev=243018&view=auto > ============================================================================== > --- cfe/trunk/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm (added) > +++ cfe/trunk/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm Thu Jul 23 > 09:45:41 2015 > @@ -0,0 +1,118 @@ > +// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9 -verify %s > + > +#define BOXABLE __attribute__((objc_boxable)) > + > +typedef struct BOXABLE _NSPoint { > + int dummy; > +} NSPoint; > + > +typedef struct BOXABLE _NSSize { > + int dummy; > +} NSSize; > + > +typedef struct BOXABLE _NSRect { > + int dummy; > +} NSRect; > + > +typedef struct BOXABLE _CGPoint { > + int dummy; > +} CGPoint; > + > +typedef struct BOXABLE _CGSize { > + int dummy; > +} CGSize; > + > +typedef struct BOXABLE _CGRect { > + int dummy; > +} CGRect; > + > +typedef struct BOXABLE _NSRange { > + int dummy; > +} NSRange; > + > +typedef struct BOXABLE _NSEdgeInsets { > + int dummy; > +} NSEdgeInsets; > + > +typedef struct BOXABLE _NSEdgeInsets NSEdgeInsets; > + > +typedef struct _SomeStruct { > + double d; > +} SomeStruct; > + > +struct BOXABLE NonTriviallyCopyable { > + double d; > + NonTriviallyCopyable() {} > + NonTriviallyCopyable(const NonTriviallyCopyable &obj) {} > +}; > + > +void checkNSValueDiagnostic() { > + NSRect rect; > + id value = @(rect); // expected-error{{NSValue must be available to use > Objective-C boxed expressions}} > +} > + > +@interface NSValue > ++ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; > +@end > + > +int main() { > + NSPoint ns_point; > + id ns_point_value = @(ns_point); > + > + NSSize ns_size; > + id ns_size_value = @(ns_size); > + > + NSRect ns_rect; > + id ns_rect_value = @(ns_rect); > + > + CGPoint cg_point; > + id cg_point_value = @(cg_point); > + > + CGSize cg_size; > + id cg_size_value = @(cg_size); > + > + CGRect cg_rect; > + id cg_rect_value = @(cg_rect); > + > + NSRange ns_range; > + id ns_range_value = @(ns_range); > + > + NSEdgeInsets edge_insets; > + id edge_insets_object = @(edge_insets); > + > + SomeStruct s; > + id err = @(s); // expected-error{{illegal type 'SomeStruct' (aka > '_SomeStruct') used in a boxed expression}} > + > + NonTriviallyCopyable ntc; > + id ntcErr = @(ntc); // expected-error{{non-trivially copyable type > 'NonTriviallyCopyable' cannot be used in a boxed expression}} > +} > + > +CGRect getRect() { > + CGRect r; > + return r; > +} > + > +SomeStruct getSomeStruct() { > + SomeStruct s; > + return s; > +} > + > +void rvalue() { > + id rv_rect = @(getRect()); > + id rv_some_struct = @(getSomeStruct()); // expected-error {{illegal type > 'SomeStruct' (aka '_SomeStruct') used in a boxed expression}} > +} > + > +template <class T> id box(T value) { return @(value); } // > expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot be > used in a boxed expression}} > +void test_template_1(NSRect rect, NonTriviallyCopyable ntc) { > + id x = box(rect); > + id y = box(ntc); // expected-note{{in instantiation of function template > specialization 'box<NonTriviallyCopyable>' requested here}} > +} > + > +template <unsigned i> id boxRect(NSRect rect) { return @(rect); } > +template <unsigned i> id boxNTC(NonTriviallyCopyable ntc) { return @(ntc); } > // expected-error{{non-trivially copyable type 'NonTriviallyCopyable' cannot > be used in a boxed expression}} > +void test_template_2(NSRect rect, NonTriviallyCopyable ntc) { > + id x = boxRect<0>(rect); > + id y = boxNTC<0>(ntc); > +} > + > + > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
signature.asc
Description: Message signed with OpenPGP using GPGMail
_______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits