@@ -95,12 +95,13 @@ + (StrongSmall)getStrongSmallClass;
95
95
@end
96
96
97
97
id g0;
98
+ StrongSmall g1, g2;
98
99
100
+ // CHECK: %[[STRUCT_STRONGSMALL:.*]] = type { i32, i8* }
99
101
// CHECK: %[[STRUCT_STRONGOUTER:.*]] = type { %[[STRUCT_STRONG:.*]], i8*, double }
100
102
// CHECK: %[[STRUCT_STRONG]] = type { %[[STRUCT_TRIVIAL:.*]], i8* }
101
103
// CHECK: %[[STRUCT_TRIVIAL]] = type { [4 x i32] }
102
104
// CHECK: %[[STRUCT_BLOCK_BYREF_T:.*]] = type { i8*, %[[STRUCT_BLOCK_BYREF_T]]*, i32, i32, i8*, i8*, i8*, %[[STRUCT_STRONGOUTER]] }
103
- // CHECK: %[[STRUCT_STRONGSMALL:.*]] = type { i32, i8* }
104
105
// CHECK: %[[STRUCT_STRONGBLOCK:.*]] = type { void ()* }
105
106
// CHECK: %[[STRUCT_BITFIELD1:.*]] = type { i8, i8, i8*, i32, i8*, [3 x i32], i8*, double, i8, i8 }
106
107
@@ -900,4 +901,47 @@ void test_zero_bitfield() {
900
901
a = b;
901
902
}
902
903
904
+ // CHECK-LABEL: define i8* @test_conditional0(
905
+ // CHECK: %[[TMP:.*]] = alloca %[[STRUCT_STRONGSMALL]], align 8
906
+
907
+ // CHECK: %[[V1:.*]] = bitcast %[[STRUCT_STRONGSMALL]]* %[[TMP]] to i8**
908
+ // CHECK: call void @__copy_constructor_8_8_t0w4_s8(i8** %[[V1]], i8** bitcast (%[[STRUCT_STRONGSMALL]]* @g2 to i8**))
909
+
910
+ // CHECK: %[[V2:.*]] = bitcast %[[STRUCT_STRONGSMALL]]* %[[TMP]] to i8**
911
+ // CHECK: call void @__copy_constructor_8_8_t0w4_s8(i8** %[[V2]], i8** bitcast (%[[STRUCT_STRONGSMALL]]* @g1 to i8**))
912
+
913
+ // CHECK: %[[V5:.*]] = bitcast %[[STRUCT_STRONGSMALL]]* %[[TMP]] to i8**
914
+ // CHECK: call void @__destructor_8_s8(i8** %[[V5]])
915
+ // CHECK: @llvm.objc.autoreleaseReturnValue
916
+
917
+ id test_conditional0 (int c) {
918
+ return (c ? g2 : g1).f1 ;
919
+ }
920
+
921
+ // CHECK-LABEL: define i8* @test_conditional1(
922
+ // CHECK-NOT: call void @__destructor
923
+
924
+ id test_conditional1 (int c) {
925
+ calleeStrongSmall (c ? g2 : g1);
926
+ }
927
+
928
+ // CHECK-LABEL: define i8* @test_assignment0(
929
+ // CHECK: %[[TMP:.*]] = alloca %[[STRUCT_STRONGSMALL]], align 8
930
+ // CHECK: call void @__copy_assignment_8_8_t0w4_s8(i8** bitcast (%[[STRUCT_STRONGSMALL]]* @g2 to i8**), i8** bitcast (%[[STRUCT_STRONGSMALL]]* @g1 to i8**))
931
+ // CHECK: %[[V0:.*]] = bitcast %[[STRUCT_STRONGSMALL]]* %[[TMP]] to i8**
932
+ // CHECK: call void @__copy_constructor_8_8_t0w4_s8(i8** %[[V0]], i8** bitcast (%[[STRUCT_STRONGSMALL]]* @g2 to i8**))
933
+ // CHECK: %[[V3:.*]] = bitcast %[[STRUCT_STRONGSMALL]]* %[[TMP]] to i8**
934
+ // CHECK: call void @__destructor_8_s8(i8** %[[V3]])
935
+
936
+ id test_assignment0 (void ) {
937
+ return (g2 = g1).f1 ;
938
+ }
939
+
940
+ // CHECK-LABEL: define i8* @test_assignment1(
941
+ // CHECK-NOT: call void @__destructor
942
+
943
+ id test_assignment1 (void ) {
944
+ calleeStrongSmall (g2 = g1);
945
+ }
946
+
903
947
#endif /* USESTRUCT */
0 commit comments