209 lines
3.9 KiB
C
209 lines
3.9 KiB
C
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s
|
||
|
|
||
|
// PR1895
|
||
|
// sizeof function
|
||
|
int zxcv(void);
|
||
|
int x=sizeof(zxcv);
|
||
|
int y=__alignof__(zxcv);
|
||
|
|
||
|
|
||
|
void *test(int *i) {
|
||
|
short a = 1;
|
||
|
i += a;
|
||
|
i + a;
|
||
|
a + i;
|
||
|
}
|
||
|
|
||
|
_Bool test2b;
|
||
|
int test2() { if (test2b); return 0; }
|
||
|
|
||
|
// PR1921
|
||
|
int test3() {
|
||
|
const unsigned char *bp;
|
||
|
bp -= (short)1;
|
||
|
}
|
||
|
|
||
|
// PR2080 - sizeof void
|
||
|
int t1 = sizeof(void);
|
||
|
int t2 = __alignof__(void);
|
||
|
void test4() {
|
||
|
t1 = sizeof(void);
|
||
|
t2 = __alignof__(void);
|
||
|
|
||
|
t1 = sizeof(test4());
|
||
|
t2 = __alignof__(test4());
|
||
|
}
|
||
|
|
||
|
// 'const float' promotes to double in varargs.
|
||
|
int test5(const float x, float float_number) {
|
||
|
return __builtin_isless(x, float_number);
|
||
|
}
|
||
|
|
||
|
// this one shouldn't fold
|
||
|
int ola() {
|
||
|
int a=2;
|
||
|
if ((0, (int)a) & 2) { return 1; }
|
||
|
return 2;
|
||
|
}
|
||
|
|
||
|
// this one shouldn't fold as well
|
||
|
void eMaisUma() {
|
||
|
double t[1];
|
||
|
if (*t)
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// rdar://6520707
|
||
|
void f0(void (*fp)(void), void (*fp2)(void)) {
|
||
|
int x = fp - fp2;
|
||
|
}
|
||
|
|
||
|
// noop casts as lvalues.
|
||
|
struct X {
|
||
|
int Y;
|
||
|
};
|
||
|
struct X foo();
|
||
|
int bar() {
|
||
|
return ((struct X)foo()).Y + 1;
|
||
|
}
|
||
|
|
||
|
// PR3809: INC/DEC of function pointers.
|
||
|
void f2(void);
|
||
|
unsigned f1(void) {
|
||
|
void (*fp)(void) = f2;
|
||
|
|
||
|
++fp;
|
||
|
fp++;
|
||
|
--fp;
|
||
|
fp--;
|
||
|
return (unsigned) fp;
|
||
|
}
|
||
|
|
||
|
union f3_x {int x; float y;};
|
||
|
int f3() {return ((union f3_x)2).x;}
|
||
|
|
||
|
union f4_y {int x; _Complex float y;};
|
||
|
_Complex float f4() {return ((union f4_y)(_Complex float)2.0).y;}
|
||
|
|
||
|
struct f5_a { int a; } f5_a;
|
||
|
union f5_z {int x; struct f5_a y;};
|
||
|
struct f5_a f5() {return ((union f5_z)f5_a).y;}
|
||
|
|
||
|
// ?: in "lvalue"
|
||
|
struct s6 { int f0; };
|
||
|
int f6(int a0, struct s6 a1, struct s6 a2) {
|
||
|
return (a0 ? a1 : a2).f0;
|
||
|
}
|
||
|
|
||
|
// PR4026
|
||
|
void f7() {
|
||
|
__func__;
|
||
|
}
|
||
|
|
||
|
// PR4067
|
||
|
int f8() {
|
||
|
return ({ foo(); }).Y;
|
||
|
}
|
||
|
|
||
|
// rdar://6880558
|
||
|
struct S;
|
||
|
struct C {
|
||
|
int i;
|
||
|
struct S *tab[];
|
||
|
};
|
||
|
struct S { struct C c; };
|
||
|
void f9(struct S *x) {
|
||
|
foo(((void)1, x->c).tab[0]);
|
||
|
}
|
||
|
|
||
|
void f10() {
|
||
|
__builtin_sin(0);
|
||
|
}
|
||
|
|
||
|
// rdar://7530813
|
||
|
// CHECK-LABEL: define{{.*}} i32 @f11
|
||
|
int f11(long X) {
|
||
|
int A[100];
|
||
|
return A[X];
|
||
|
|
||
|
// CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8
|
||
|
// CHECK: [[A:%.*]] = alloca [100 x i32], align
|
||
|
// CHECK: [[X:%.*]] = load {{.*}}, {{.*}}* [[Xaddr]]
|
||
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [100 x i32], [100 x i32]* [[A]], i64 0, i64 [[X]]
|
||
|
// CHECK-NEXT: load i32, i32* [[T0]], align 4
|
||
|
}
|
||
|
|
||
|
int f12() {
|
||
|
// PR3150
|
||
|
// CHECK-LABEL: define{{.*}} i32 @f12
|
||
|
// CHECK: ret i32 1
|
||
|
return 1||1;
|
||
|
}
|
||
|
|
||
|
// Make sure negate of fp uses -0.0 for proper -0 handling.
|
||
|
double f13(double X) {
|
||
|
// CHECK-LABEL: define{{.*}} double @f13
|
||
|
// CHECK: fneg double
|
||
|
return -X;
|
||
|
}
|
||
|
|
||
|
// Check operations on incomplete types.
|
||
|
void f14(struct s14 *a) {
|
||
|
(void) &*a;
|
||
|
}
|
||
|
|
||
|
// CHECK-LABEL: define{{.*}} void @f15
|
||
|
void f15() {
|
||
|
extern void f15_start(void);
|
||
|
f15_start();
|
||
|
// CHECK: call void @f15_start()
|
||
|
|
||
|
extern void *f15_v(void);
|
||
|
extern const void *f15_cv(void);
|
||
|
extern volatile void *f15_vv(void);
|
||
|
*f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v();
|
||
|
*f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv();
|
||
|
*f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv();
|
||
|
// CHECK-NOT: load
|
||
|
// CHECK: ret void
|
||
|
}
|
||
|
|
||
|
// PR8967: this was crashing
|
||
|
// CHECK-LABEL: define{{.*}} void @f16()
|
||
|
void f16() {
|
||
|
__extension__({ goto lbl; });
|
||
|
lbl:
|
||
|
;
|
||
|
}
|
||
|
|
||
|
// PR13704: negative increment in i128 is not preserved.
|
||
|
// CHECK-LABEL: define{{.*}} void @f17()
|
||
|
void f17() {
|
||
|
extern void extfunc(__int128);
|
||
|
__int128 x = 2;
|
||
|
x--;
|
||
|
extfunc(x);
|
||
|
// CHECK: add nsw i128 %{{.}}, -1
|
||
|
}
|
||
|
|
||
|
// PR23597: We should evaluate union cast operands even if the cast is unused.
|
||
|
typedef union u {
|
||
|
int i;
|
||
|
} strct;
|
||
|
int returns_int(void);
|
||
|
void f18() {
|
||
|
(strct)returns_int();
|
||
|
}
|
||
|
// CHECK-LABEL: define{{.*}} void @f18()
|
||
|
// CHECK: call i32 @returns_int()
|
||
|
|
||
|
// Ensure the right stmt is returned
|
||
|
int f19() {
|
||
|
return ({ 3;;4;; });
|
||
|
}
|
||
|
// CHECK-LABEL: define{{.*}} i32 @f19()
|
||
|
// CHECK: [[T:%.*]] = alloca i32
|
||
|
// CHECK: store i32 4, i32* [[T]]
|
||
|
// CHECK: [[L:%.*]] = load i32, i32* [[T]]
|
||
|
// CHECK: ret i32 [[L]]
|