1 // RUN: %clang_cc1 -std=c++20 -triple x86_64-linux-gnu %s -emit-llvm -o - | FileCheck %s
3 // CHECK-DAG: @[[STR_0:.*]] = {{.*}} [3 x i8] c"%s\00",
4 // CHECK-DAG: @[[STR_1:.*]] = {{.*}} [2 x i8] c"C\00",
5 // CHECK-DAG: @[[STR_2:.*]] = {{.*}} [4 x i8] c" {\0A\00",
6 // CHECK-DAG: @[[STR_3:.*]] = {{.*}} [5 x i8] c"%s%s\00",
7 // CHECK-DAG: @[[STR_4:.*]] = {{.*}} [3 x i8] c" \00",
8 // CHECK-DAG: @[[STR_5:.*]] = {{.*}} [2 x i8] c"A\00",
9 // CHECK-DAG: @[[STR_6:.*]] = {{.*}} [14 x i8] c"%s%s %s = %d\0A\00",
10 // CHECK-DAG: @[[STR_7:.*]] = {{.*}} [5 x i8] c" \00",
11 // CHECK-DAG: @[[STR_8:.*]] = {{.*}} [4 x i8] c"int\00",
12 // CHECK-DAG: @[[STR_9:.*]] = {{.*}} [2 x i8] c"n\00",
13 // CHECK-DAG: @[[STR_10:.*]] = {{.*}} [5 x i8] c"%s}\0A\00",
14 // CHECK-DAG: @[[STR_11:.*]] = {{.*}} [2 x i8] c"B\00",
15 // CHECK-DAG: @[[STR_12:.*]] = {{.*}} [10 x i8] c"%s%s %s =\00",
16 // CHECK-DAG: @[[STR_13:.*]] = {{.*}} [2 x i8] c"a\00",
17 // CHECK-DAG: @[[STR_14:.*]] = {{.*}} [15 x i8] c"%s%s %s = *%p\0A\00",
18 // CHECK-DAG: @[[STR_15:.*]] = {{.*}} [2 x i8] c"X\00",
19 // CHECK-DAG: @[[STR_16:.*]] = {{.*}} [2 x i8] c"x\00",
20 // CHECK-DAG: @[[STR_17:.*]] = {{.*}} [2 x i8] c"f\00",
21 // CHECK-DAG: @[[STR_18:.*]] = {{.*}} [2 x i8] c"g\00",
22 // CHECK-DAG: @[[STR_19:.*]] = {{.*}} [3 x i8] c"}\0A\00",
26 class X
{ private: int n
; };
27 struct C
: A
, B
{ A a
; X x
; int f
, g
; };
29 template<typename
...T
> int format(int a
, const char *str
, T
...);
33 // CHECK-LABEL: define {{.*}} @_Z1gR1C(
35 // CHECK: call {{.*}} @_Z1fv()
36 // CHECK: call {{.*}} @_Z6formatIJPKcEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_0]], ptr noundef @[[STR_1]])
38 // CHECK: call {{.*}} @_Z1fv()
39 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 {{.*}}, ptr noundef @[[STR_2]])
41 // CHECK: call {{.*}} @_Z1fv()
42 // CHECK: call {{.*}} @_Z6formatIJPKcS1_EEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_3]], ptr noundef @[[STR_4]], ptr noundef @[[STR_5]])
44 // CHECK: call {{.*}} @_Z1fv()
45 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 {{.*}}, ptr noundef @[[STR_2]])
47 // CHECK: call {{.*}} @_Z1fv()
48 // CHECK: %[[VAL_n:.*]] = getelementptr inbounds %[[VAL_struct_A:.*]], ptr %[[VAL_0:.*]], i32 0, i32 0
49 // CHECK: %[[VAL_1:.*]] = load i32, ptr %[[VAL_n]],
50 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_iEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_6]], ptr noundef @[[STR_7]], ptr noundef @[[STR_8]], ptr noundef @[[STR_9]], i32 noundef %[[VAL_1]])
52 // CHECK: call {{.*}} @_Z1fv()
53 // CHECK: call {{.*}} @_Z6formatIJPKcEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_10]], ptr noundef @[[STR_4]])
55 // CHECK: call {{.*}} @_Z1fv()
56 // CHECK: call {{.*}} @_Z6formatIJPKcS1_EEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_3]], ptr noundef @[[STR_4]], ptr noundef @[[STR_11]])
58 // CHECK: %[[VAL_2:.*]] = icmp eq ptr %[[VAL_0]], null
59 // CHECK: br i1 %[[VAL_2]],
61 // CHECK: %[[VAL_add_ptr:.*]] = getelementptr inbounds i8, ptr %[[VAL_0]], i64 4
64 // CHECK: %[[VAL_cast_result:.*]] = phi
65 // CHECK: call {{.*}} @_Z1fv()
66 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 {{.*}}, ptr noundef @[[STR_2]])
68 // CHECK: call {{.*}} @_Z1fv()
69 // CHECK: %[[VAL_n17:.*]] = getelementptr inbounds %[[VAL_struct_B:.*]], ptr %[[VAL_cast_result]], i32 0, i32 0
70 // CHECK: %[[VAL_3:.*]] = load i32, ptr %[[VAL_n17]],
71 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_iEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_6]], ptr noundef @[[STR_7]], ptr noundef @[[STR_8]], ptr noundef @[[STR_9]], i32 noundef %[[VAL_3]])
73 // CHECK: call {{.*}} @_Z1fv()
74 // CHECK: call {{.*}} @_Z6formatIJPKcEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_10]], ptr noundef @[[STR_4]])
76 // CHECK: call {{.*}} @_Z1fv()
77 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_EEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_12]], ptr noundef @[[STR_4]], ptr noundef @[[STR_5]], ptr noundef @[[STR_13]])
79 // CHECK: %[[VAL_a:.*]] = getelementptr inbounds %[[VAL_struct_C:.*]], ptr %[[VAL_0]], i32 0, i32 2
80 // CHECK: call {{.*}} @_Z1fv()
81 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 {{.*}}, ptr noundef @[[STR_2]])
83 // CHECK: call {{.*}} @_Z1fv()
84 // CHECK: %[[VAL_n26:.*]] = getelementptr inbounds %[[VAL_struct_A]], ptr %[[VAL_a]], i32 0, i32 0
85 // CHECK: %[[VAL_4:.*]] = load i32, ptr %[[VAL_n26]],
86 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_iEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_6]], ptr noundef @[[STR_7]], ptr noundef @[[STR_8]], ptr noundef @[[STR_9]], i32 noundef %[[VAL_4]])
88 // CHECK: call {{.*}} @_Z1fv()
89 // CHECK: call {{.*}} @_Z6formatIJPKcEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_10]], ptr noundef @[[STR_4]])
91 // CHECK: call {{.*}} @_Z1fv()
92 // CHECK: %[[VAL_x:.*]] = getelementptr inbounds %[[VAL_struct_C]], ptr %[[VAL_0]], i32 0, i32 3
93 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_P1XEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_14]], ptr noundef @[[STR_4]], ptr noundef @[[STR_15]], ptr noundef @[[STR_16]], ptr noundef %[[VAL_x]])
95 // CHECK: call {{.*}} @_Z1fv()
96 // CHECK: %[[VAL_f:.*]] = getelementptr inbounds %[[VAL_struct_C]], ptr %[[VAL_0]], i32 0, i32 4
97 // CHECK: %[[VAL_5:.*]] = load i32, ptr %[[VAL_f]],
98 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_iEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_6]], ptr noundef @[[STR_4]], ptr noundef @[[STR_8]], ptr noundef @[[STR_17]], i32 noundef %[[VAL_5]])
100 // CHECK: call {{.*}} @_Z1fv()
101 // CHECK: %[[VAL_g:.*]] = getelementptr inbounds %[[VAL_struct_C]], ptr %[[VAL_0]], i32 0, i32 5
102 // CHECK: %[[VAL_6:.*]] = load i32, ptr %[[VAL_g]],
103 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_iEEiiS1_DpT_(i32 {{.*}}, ptr noundef @[[STR_6]], ptr noundef @[[STR_4]], ptr noundef @[[STR_8]], ptr noundef @[[STR_18]], i32 noundef %[[VAL_6]])
105 // CHECK: call {{.*}} @_Z1fv()
106 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 {{.*}}, ptr noundef @[[STR_19]])
107 __builtin_dump_struct(&c
, format
, f());
110 // CHECK-LABEL: define {{.*}} @_Z1hR1X(
112 // CHECK: %[[VAL_x_addr:.*]] = alloca ptr,
113 // CHECK: store ptr %[[VAL_x]], ptr %[[VAL_x_addr]],
114 // CHECK: call {{.*}} @_Z6formatIJPKcEEiiS1_DpT_(i32 noundef 0, ptr noundef @[[STR_0]], ptr noundef @[[STR_15]])
116 // CHECK: %[[VAL_0:.*]] = load ptr, ptr %[[VAL_x_addr]],
117 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 noundef 0, ptr noundef @[[STR_2]])
119 // CHECK: %[[VAL_n:.*]] = getelementptr inbounds %[[VAL_class_X:.*]], ptr %[[VAL_0]], i32 0, i32 0
120 // CHECK: %[[VAL_1:.*]] = load i32, ptr %[[VAL_n]],
121 // CHECK: call {{.*}} @_Z6formatIJPKcS1_S1_iEEiiS1_DpT_(i32 noundef 0, ptr noundef @[[STR_6]], ptr noundef @[[STR_4]], ptr noundef @[[STR_8]], ptr noundef @[[STR_9]], i32 noundef %[[VAL_1]])
123 // CHECK: call {{.*}} @_Z6formatIJEEiiPKcDpT_(i32 noundef 0, ptr noundef @[[STR_19]])
124 __builtin_dump_struct(&x
, format
, 0);