// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s int b(char* x); // Extremely basic VLA test void a(int x) { char arry[x]; arry[0] = 10; b(arry); } int c(int n) { return sizeof(int[n]); } int f0(int x) { int vla[x]; return vla[x-1]; } void f(int count) { int a[count]; do { } while (0); if (a[0] != 3) { } } void g(int count) { // Make sure we emit sizes correctly in some obscure cases int (*a[5])[count]; int (*b)[][count]; } // rdar://8403108 // CHECK: define void @f_8403108 void f_8403108(unsigned x) { // CHECK: call i8* @llvm.stacksave() char s1[x]; while (1) { // CHECK: call i8* @llvm.stacksave() char s2[x]; if (1) break; // CHECK: call void @llvm.stackrestore(i8* } // CHECK: call void @llvm.stackrestore(i8* } // pr7827 void function(short width, int data[][width]) {} // expected-note {{passing argument to parameter 'data' here}} void test() { int bork[4][13]; // CHECK: call void @function(i16 signext 1, i32* null) function(1, 0); // CHECK: call void @function(i16 signext 1, i32* inttoptr function(1, 0xbadbeef); // expected-warning {{incompatible integer to pointer conversion passing}} // CHECK: call void @function(i16 signext 1, i32* {{.*}}) function(1, bork); } void function1(short width, int data[][width][width]) {} void test1() { int bork[4][13][15]; // CHECK: call void @function1(i16 signext 1, i32* {{.*}}) function1(1, bork); // CHECK: call void @function(i16 signext 1, i32* {{.*}}) function(1, bork[2]); } // rdar://8476159 static int GLOB; int test2(int n) { GLOB = 0; char b[1][n+3]; /* Variable length array. */ // CHECK: [[tmp_1:%.*]] = load i32* @GLOB, align 4 // CHECK-NEXT: add nsw i32 [[tmp_1]], 1 __typeof__(b[GLOB++]) c; return GLOB; } // http://llvm.org/PR8567 // CHECK: define double @test_PR8567 double test_PR8567(int n, double (*p)[n][5]) { // CHECK: store [[vla_type:.*]] %p, // CHECK: load i32* // CHECK-NEXT: mul i32 40 // CHECK-NEXT: [[byte_idx:%.*]] = mul i32 1 // CHECK-NEXT: [[tmp_1:%.*]] = load [[vla_type]]* // CHECK-NEXT: [[tmp_2:%.*]] = bitcast [[vla_type]] [[tmp_1]] to i8* // CHECK-NEXT: [[idx:%.*]] = getelementptr inbounds i8* [[tmp_2]], i32 [[byte_idx]] // CHECK-NEXT: bitcast i8* [[idx]] to [[vla_type]] return p[1][2][3]; }