1981b6fde6992567d8be03ba77dabe1efc3ff33d1Argyrios Kyrtzidis// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
28f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman
38f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedmanint b(char* x);
48f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman
58f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman// Extremely basic VLA test
68f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedmanvoid a(int x) {
78f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman  char arry[x];
88f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman  arry[0] = 10;
98f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman  b(arry);
108f39f5e96ce4a5f401f431f61db7df1cf05dce6fEli Friedman}
11b50525ba0e996bc072cdb76152fcfe0bc64bb72aAnders Carlsson
120269709723e4cb0836a1a50964949e96dc0d1173Anders Carlssonint c(int n)
13b50525ba0e996bc072cdb76152fcfe0bc64bb72aAnders Carlsson{
140269709723e4cb0836a1a50964949e96dc0d1173Anders Carlsson  return sizeof(int[n]);
15b50525ba0e996bc072cdb76152fcfe0bc64bb72aAnders Carlsson}
16c756a8ebee5c896a01f2c564bf4ba800c0beda21Anders Carlsson
17c756a8ebee5c896a01f2c564bf4ba800c0beda21Anders Carlssonint f0(int x) {
18c756a8ebee5c896a01f2c564bf4ba800c0beda21Anders Carlsson  int vla[x];
19c756a8ebee5c896a01f2c564bf4ba800c0beda21Anders Carlsson  return vla[x-1];
20c756a8ebee5c896a01f2c564bf4ba800c0beda21Anders Carlsson}
2122ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson
2222ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlssonvoid
2322ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlssonf(int count)
2422ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson{
2522ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson int a[count];
2622ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson
2722ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson  do {  } while (0);
2822ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson
2922ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson  if (a[0] != 3) {
3022ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson  }
3122ab8d86ec613ace6602b6de11fa9ccc08580f6bAnders Carlsson}
32bdad6b69f1214fb20116795f8e8cbf881e3017c6Eli Friedman
33bdad6b69f1214fb20116795f8e8cbf881e3017c6Eli Friedmanvoid g(int count) {
34bdad6b69f1214fb20116795f8e8cbf881e3017c6Eli Friedman  // Make sure we emit sizes correctly in some obscure cases
35bdad6b69f1214fb20116795f8e8cbf881e3017c6Eli Friedman  int (*a[5])[count];
36bdad6b69f1214fb20116795f8e8cbf881e3017c6Eli Friedman  int (*b)[][count];
37bdad6b69f1214fb20116795f8e8cbf881e3017c6Eli Friedman}
384ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis
394ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis// rdar://8403108
4093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f_8403108
414ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidisvoid f_8403108(unsigned x) {
424ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis  // CHECK: call i8* @llvm.stacksave()
434ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis  char s1[x];
444ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis  while (1) {
454ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis    // CHECK: call i8* @llvm.stacksave()
464ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis    char s2[x];
474ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis    if (1)
484ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis      break;
494ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis  // CHECK: call void @llvm.stackrestore(i8*
504ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis  }
514ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis  // CHECK: call void @llvm.stackrestore(i8*
524ada2ca7d82dab68d3646f3eb6dcdfee072e8ea4Argyrios Kyrtzidis}
53f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian
54f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian// pr7827
55745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanianvoid function(short width, int data[][width]) {} // expected-note {{passing argument to parameter 'data' here}}
56f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian
57f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanianvoid test() {
58745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     int bork[4][13];
59f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian     // CHECK: call void @function(i16 signext 1, i32* null)
60f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian     function(1, 0);
61745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     // CHECK: call void @function(i16 signext 1, i32* inttoptr
62745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     function(1, 0xbadbeef); // expected-warning {{incompatible integer to pointer conversion passing}}
63745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     // CHECK: call void @function(i16 signext 1, i32* {{.*}})
64745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     function(1, bork);
65745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian}
66745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian
67745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanianvoid function1(short width, int data[][width][width]) {}
68745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanianvoid test1() {
69745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     int bork[4][13][15];
70745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     // CHECK: call void @function1(i16 signext 1, i32* {{.*}})
71745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     function1(1, bork);
72745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     // CHECK: call void @function(i16 signext 1, i32* {{.*}})
73745da3a5bb4ea35f93f50301e7fbbb7d78d3b6bbFariborz Jahanian     function(1, bork[2]);
74f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian}
75f4435703872acb6eb0ff01b52414584e08d9ee35Fariborz Jahanian
76c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian// rdar://8476159
77c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanianstatic int GLOB;
78c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanianint test2(int n)
79c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian{
80c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian  GLOB = 0;
81c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian  char b[1][n+3];			/* Variable length array.  */
82c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian  // CHECK:  [[tmp_1:%.*]] = load i32* @GLOB, align 4
83c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian  // CHECK-NEXT: add nsw i32 [[tmp_1]], 1
84c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian  __typeof__(b[GLOB++]) c;
85c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian  return GLOB;
86c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian}
87c5be7b0fc804d8e6f87298ec03c94d8cccd74f29Fariborz Jahanian
88981b6fde6992567d8be03ba77dabe1efc3ff33d1Argyrios Kyrtzidis// http://llvm.org/PR8567
8993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define double @test_PR8567
90981b6fde6992567d8be03ba77dabe1efc3ff33d1Argyrios Kyrtzidisdouble test_PR8567(int n, double (*p)[n][5]) {
91bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK:      [[NV:%.*]] = alloca i32, align 4
92bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[PV:%.*]] = alloca [5 x double]*, align 4
93bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: store
94bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: store
95bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[N:%.*]] = load i32* [[NV]], align 4
96bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[P:%.*]] = load [5 x double]** [[PV]], align 4
97913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T0:%.*]] = mul nsw i32 1, [[N]]
98bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds [5 x double]* [[P]], i32 [[T0]]
99bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [5 x double]* [[T1]], i32 2
100bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds [5 x double]* [[T2]], i32 0, i32 3
101bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: [[T4:%.*]] = load double* [[T3]]
102bc8d40d85f3fa1e34569834916f18fecaa635152John McCall  // CHECK-NEXT: ret double [[T4]]
103981b6fde6992567d8be03ba77dabe1efc3ff33d1Argyrios Kyrtzidis return p[1][2][3];
104981b6fde6992567d8be03ba77dabe1efc3ff33d1Argyrios Kyrtzidis}
105913dab2525cc705e5238023a446f5371fa411883John McCall
106913dab2525cc705e5238023a446f5371fa411883John McCallint test4(unsigned n, char (*p)[n][n+1][6]) {
10793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:    define i32 @test4(
108913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK:      [[N:%.*]] = alloca i32, align 4
109913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[P:%.*]] = alloca [6 x i8]*, align 4
110913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[P2:%.*]] = alloca [6 x i8]*, align 4
111913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: store i32
112913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: store [6 x i8]*
113913dab2525cc705e5238023a446f5371fa411883John McCall
114913dab2525cc705e5238023a446f5371fa411883John McCall  // VLA captures.
115913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[DIM0:%.*]] = load i32* [[N]], align 4
116913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T0:%.*]] = load i32* [[N]], align 4
117913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[DIM1:%.*]] = add i32 [[T0]], 1
118913dab2525cc705e5238023a446f5371fa411883John McCall
119913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T0:%.*]] = load [6 x i8]** [[P]], align 4
120913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T1:%.*]] = load i32* [[N]], align 4
121913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T2:%.*]] = udiv i32 [[T1]], 2
122913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T3:%.*]] = mul nuw i32 [[DIM0]], [[DIM1]]
123913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T4:%.*]] = mul nsw i32 [[T2]], [[T3]]
124913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T5:%.*]] = getelementptr inbounds [6 x i8]* [[T0]], i32 [[T4]]
125913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T6:%.*]] = load i32* [[N]], align 4
126913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T7:%.*]] = udiv i32 [[T6]], 4
127913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T8:%.*]] = sub i32 0, [[T7]]
128913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T9:%.*]] = mul nuw i32 [[DIM0]], [[DIM1]]
129913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T10:%.*]] = mul nsw i32 [[T8]], [[T9]]
130913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T11:%.*]] = getelementptr inbounds [6 x i8]* [[T5]], i32 [[T10]]
131913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: store [6 x i8]* [[T11]], [6 x i8]** [[P2]], align 4
132913dab2525cc705e5238023a446f5371fa411883John McCall  __typeof(p) p2 = (p + n/2) - n/4;
133913dab2525cc705e5238023a446f5371fa411883John McCall
134913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T0:%.*]] = load [6 x i8]** [[P2]], align 4
135913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T1:%.*]] = load [6 x i8]** [[P]], align 4
136913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T2:%.*]] = ptrtoint [6 x i8]* [[T0]] to i32
137913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T3:%.*]] = ptrtoint [6 x i8]* [[T1]] to i32
138913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T4:%.*]] = sub i32 [[T2]], [[T3]]
139913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T5:%.*]] = mul nuw i32 [[DIM0]], [[DIM1]]
140913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T6:%.*]] = mul nuw i32 6, [[T5]]
141913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: [[T7:%.*]] = sdiv exact i32 [[T4]], [[T6]]
142913dab2525cc705e5238023a446f5371fa411883John McCall  // CHECK-NEXT: ret i32 [[T7]]
143913dab2525cc705e5238023a446f5371fa411883John McCall  return p2 - p;
144913dab2525cc705e5238023a446f5371fa411883John McCall}
1452ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian
1462ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian// rdar://11485774
1472ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanianvoid test5(void)
1482ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian{
14993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @test5(
1502ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  int a[5], i = 0;
1512ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  // CHECK: [[A:%.*]] = alloca [5 x i32], align 4
1522ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
1532ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  // CHECK-NEXT: [[CL:%.*]] = alloca i32*, align 4
1542ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  // CHECK-NEXT: store i32 0, i32* [[I]], align 4
1552ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian
1562ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  (typeof(++i, (int (*)[i])a)){&a} += 0;
1572ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  // CHECK-NEXT: [[Z:%.*]] = load i32* [[I]], align 4
158ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[INC:%.*]]  = add nsw i32 [[Z]], 1
159ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: store i32 [[INC]], i32* [[I]], align 4
160ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[O:%.*]] = load i32* [[I]], align 4
161ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[AR:%.*]] = getelementptr inbounds [5 x i32]* [[A]], i32 0, i32 0
162ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[T:%.*]] = bitcast [5 x i32]* [[A]] to i32*
163ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: store i32* [[T]], i32** [[CL]]
164ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[TH:%.*]] = load i32** [[CL]]
165ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[VLAIX:%.*]] = mul nsw i32 0, [[O]]
166ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[ADDPTR:%.*]] = getelementptr inbounds i32* [[TH]], i32 [[VLAIX]]
1672ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian  // CHECK-NEXT: store i32* [[ADDPTR]], i32** [[CL]]
1682ccc0f9c23e6b948a4db6ffe46aefa098e1a2956Fariborz Jahanian}
169ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian
170ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanianvoid test6(void)
171ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian{
17293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @test6(
173ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  int n = 20, **a, i=0;
174ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK: [[N:%.*]] = alloca i32, align 4
175ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[A:%.*]] = alloca i32**, align 4
176ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
177ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian (int (**)[i]){&a}[0][1][5] = 0;
178ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[CL:%.*]] = alloca i32**, align 4
179ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: store i32 20, i32* [[N]], align 4
180ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: store i32 0, i32* [[I]], align 4
181ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[Z:%.*]] = load i32* [[I]], align 4
182ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[O:%.*]] = bitcast i32*** [[A]] to i32**
183ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: store i32** [[O]], i32*** [[CL]]
184ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[T:%.*]] = load i32*** [[CL]]
185ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[IX:%.*]] = getelementptr inbounds i32** [[T]], i32 0
186ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[TH:%.*]] = load i32** [[IX]], align 4
187ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[F:%.*]] = mul nsw i32 1, [[Z]]
188ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[IX1:%.*]] = getelementptr inbounds i32* [[TH]], i32 [[F]]
189ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: [[IX2:%.*]] = getelementptr inbounds i32* [[IX1]], i32 5
190ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian  // CHECK-NEXT: store i32 0, i32* [[IX2]], align 4
191ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian}
192ec22f56f2031c3e61100d42133b06f9b9f020ee6Fariborz Jahanian
193f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman// Follow gcc's behavior for VLAs in parameter lists.  PR9559.
194f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedmanvoid test7(int a[b(0)]) {
19593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @test7(
196f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman  // CHECK: call i32 @b(i8* null)
197f5bf912767ba19832bba7694fc679a5ec3c055ffEli Friedman}
198