Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / CodeGenObjCXX / arc-cxx11-init-list.mm
blobc2d4f8685d7efbe466f050b98bdc542e2c6c7c0b
1 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple armv7-ios5.0 -std=c++11 -fmerge-all-constants -fobjc-arc -Os -emit-llvm -o - %s | FileCheck %s
3 // CHECK: @[[STR0:.*]] = private unnamed_addr constant [5 x i8] c"str0\00", section "__TEXT,__cstring,cstring_literals"
4 // CHECK: @[[UNNAMED_CFSTRING0:.*]] = private global %struct.__NSConstantString_tag { ptr @__CFConstantStringClassReference, i32 1992, ptr @[[STR0]], i32 4 }, section "__DATA,__cfstring"
5 // CHECK: @[[STR1:.*]] = private unnamed_addr constant [5 x i8] c"str1\00", section "__TEXT,__cstring,cstring_literals"
6 // CHECK: @[[UNNAMED_CFSTRING1:.*]] = private global %struct.__NSConstantString_tag { ptr @__CFConstantStringClassReference, i32 1992, ptr @[[STR1]], i32 4 }, section "__DATA,__cfstring"
7 // CHECK: @[[REFTMP:.*]] = private constant [2 x ptr] [ptr @[[UNNAMED_CFSTRING0]], ptr @[[UNNAMED_CFSTRING1]]]
9 typedef __SIZE_TYPE__ size_t;
11 namespace std {
12 template <typename _Ep>
13 class initializer_list {
14   const _Ep* __begin_;
15   size_t __size_;
17   initializer_list(const _Ep* __b, size_t __s);
21 @interface I
22 + (instancetype) new;
23 @end
25 void function(std::initializer_list<I *>);
27 extern "C" void single() { function({ [I new] }); }
29 // CHECK: [[INSTANCE:%.*]] = {{.*}} call ptr @objc_msgSend(ptr {{.*}}, ptr {{.*}})
30 // CHECK-NEXT: store ptr [[INSTANCE]], ptr %{{.*}},
31 // CHECK: call void @llvm.objc.release(ptr {{.*}})
33 extern "C" void multiple() { function({ [I new], [I new] }); }
35 // CHECK: [[INSTANCE:%.*]] = {{.*}} call ptr @objc_msgSend(ptr {{.*}}, ptr {{.*}})
36 // CHECK-NEXT: store ptr [[INSTANCE]], ptr %{{.*}},
37 // CHECK: call void @llvm.objc.release(ptr {{.*}})
39 std::initializer_list<id> foo1() {
40   return {@"str0", @"str1"};
43 // CHECK: define{{.*}} void @_Z4foo1v(ptr {{.*}} %[[AGG_RESULT:.*]])
44 // CHECK: store ptr @[[REFTMP]], ptr %[[AGG_RESULT]]
45 // CHECK: %[[SIZE:.*]] = getelementptr inbounds %"class.std::initializer_list.0", ptr %[[AGG_RESULT]], i32 0, i32 1
46 // CHECK: store i32 2, ptr %[[SIZE]]
47 // CHECK: ret void
49 void external();
51 extern "C" void extended() {
52   const auto && temporary = { [I new] };
53   external();
56 // CHECK: [[INSTANCE:%.*]] = {{.*}} call ptr @objc_msgSend(ptr {{.*}}, ptr {{.*}})
57 // CHECK: {{.*}} call void @_Z8externalv()
58 // CHECK: {{.*}} call void @llvm.objc.release(ptr {{.*}})
60 std::initializer_list<I *> il = { [I new] };
62 // CHECK: [[POOL:%.*]] = {{.*}} call ptr @llvm.objc.autoreleasePoolPush()
63 // CHECK: [[INSTANCE:%.*]] = {{.*}} call ptr @objc_msgSend(ptr {{.*}}, ptr {{.*}})
64 // CHECK-NEXT: store ptr [[INSTANCE]], ptr @_ZGR2il_
65 // CHECK: {{.*}} call void @llvm.objc.autoreleasePoolPop(ptr [[POOL]])