forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			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]]
 |