xref: /aosp_15_r20/external/clang/test/CodeGenCXX/cxx1z-init-statement.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++1z -triple x86_64-apple-macosx10.7.0 -emit-llvm -o - %s -w | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li typedef int T;
f()4*67e74705SXin Li void f() {
5*67e74705SXin Li   // CHECK:      %[[A:.*]] = alloca i32, align 4
6*67e74705SXin Li   // CHECK-NEXT: store i32 5, i32* %[[A]], align 4
7*67e74705SXin Li   // CHECK-NEXT: %[[B:.*]] = load i32, i32* %[[A]], align 4
8*67e74705SXin Li   // CHECK-NEXT  %[[C:.*]] = icmp slt i32 %[[B]], 8
9*67e74705SXin Li   if (int a = 5; a < 8)
10*67e74705SXin Li     ;
11*67e74705SXin Li }
12*67e74705SXin Li 
f1()13*67e74705SXin Li void f1() {
14*67e74705SXin Li   // CHECK:      %[[A:.*]] = alloca i32, align 4
15*67e74705SXin Li   // CHECK-NEXT: %[[B:.*]] = alloca i32, align 4
16*67e74705SXin Li   // CHECK-NEXT: %[[C:.*]] = alloca i32, align 4
17*67e74705SXin Li   // CHECK-NEXT: store i32 5, i32* %[[B]], align 4
18*67e74705SXin Li   // CHECK-NEXT: store i32 7, i32* %[[C]], align 4
19*67e74705SXin Li   if (int a, b = 5; int c = 7)
20*67e74705SXin Li     ;
21*67e74705SXin Li }
22*67e74705SXin Li 
f2()23*67e74705SXin Li int f2() {
24*67e74705SXin Li   // CHECK:      %[[A:.*]] = alloca i32, align 4
25*67e74705SXin Li   // CHECK-NEXT: %[[B:.*]] = call i32 @_Z2f2v()
26*67e74705SXin Li   // CHECK-NEXT: store i32 7, i32* %[[A]], align 4
27*67e74705SXin Li   // CHECK-NEXT: %[[C:.*]] = load i32, i32* %[[A]], align 4
28*67e74705SXin Li   // CHECK-NEXT: %[[D:.*]] = icmp ne i32 %[[C]], 0
29*67e74705SXin Li   if (T{f2()}; int c = 7)
30*67e74705SXin Li     ;
31*67e74705SXin Li   return 2;
32*67e74705SXin Li }
33*67e74705SXin Li 
g()34*67e74705SXin Li void g() {
35*67e74705SXin Li   // CHECK:      %[[A:.*]] = alloca i32, align 4
36*67e74705SXin Li   // CHECK-NEXT: store i32 5, i32* %[[A]], align 4
37*67e74705SXin Li   // CHECK-NEXT: %[[B:.*]] = load i32, i32* %[[A]], align 4
38*67e74705SXin Li   // CHECK-NEXT: switch i32 %[[B]], label %[[C:.*]] [
39*67e74705SXin Li   switch (int a = 5; a) {
40*67e74705SXin Li     case 0:
41*67e74705SXin Li       break;
42*67e74705SXin Li   }
43*67e74705SXin Li }
44*67e74705SXin Li 
g1()45*67e74705SXin Li void g1() {
46*67e74705SXin Li   // CHECK:      %[[A:.*]] = alloca i32, align 4
47*67e74705SXin Li   // CHECK-NEXT: %[[B:.*]] = alloca i32, align 4
48*67e74705SXin Li   // CHECK-NEXT: %[[C:.*]] = alloca i32, align 4
49*67e74705SXin Li   // CHECK-NEXT: store i32 5, i32* %[[B]], align 4
50*67e74705SXin Li   // CHECK-NEXT: store i32 7, i32* %[[C]], align 4
51*67e74705SXin Li   // CHECK-NEXT: %[[D:.*]] = load i32, i32* %[[C]], align 4
52*67e74705SXin Li   // CHECK-NEXT: switch i32 %[[D]], label %[[E:.*]] [
53*67e74705SXin Li   switch (int a, b = 5; int c = 7) {
54*67e74705SXin Li     case 0:
55*67e74705SXin Li       break;
56*67e74705SXin Li   }
57*67e74705SXin Li }
58*67e74705SXin Li 
g2()59*67e74705SXin Li int g2() {
60*67e74705SXin Li   // CHECK:      %[[A:.*]] = alloca i32, align 4
61*67e74705SXin Li   // CHECK-NEXT: %[[B:.*]] = call i32 @_Z2f2v()
62*67e74705SXin Li   // CHECK-NEXT: store i32 7, i32* %[[A]], align 4
63*67e74705SXin Li   // CHECK-NEXT: %[[C:.*]] = load i32, i32* %[[A]], align 4
64*67e74705SXin Li   // CHECK-NEXT: switch i32 %[[C]], label %[[E:.*]] [
65*67e74705SXin Li   switch (T{f2()}; int c = 7) {
66*67e74705SXin Li     case 0:
67*67e74705SXin Li       break;
68*67e74705SXin Li   }
69*67e74705SXin Li   return 2;
70*67e74705SXin Li }
71