1*67e74705SXin Li // RUN: echo "GNU89 tests:" 2*67e74705SXin Li // RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=gnu89 | FileCheck %s --check-prefix=CHECK1 3*67e74705SXin Li // CHECK1-LABEL: define i32 @foo() 4*67e74705SXin Li // CHECK1-LABEL: define i32 @bar() 5*67e74705SXin Li // CHECK1-LABEL: define void @unreferenced1() 6*67e74705SXin Li // CHECK1-NOT: unreferenced2 7*67e74705SXin Li // CHECK1-LABEL: define void @gnu_inline() 8*67e74705SXin Li // CHECK1-LABEL: define i32 @test1 9*67e74705SXin Li // CHECK1-LABEL: define i32 @test2 10*67e74705SXin Li // CHECK1-LABEL: define void @test3() 11*67e74705SXin Li // CHECK1-LABEL: define available_externally i32 @test4 12*67e74705SXin Li // CHECK1-LABEL: define available_externally i32 @test5 13*67e74705SXin Li // CHECK1-LABEL: define i32 @test6 14*67e74705SXin Li // CHECK1-LABEL: define void @test7 15*67e74705SXin Li // CHECK1: define i{{..}} @strlcpy 16*67e74705SXin Li // CHECK1-NOT: test9 17*67e74705SXin Li // CHECK1-LABEL: define void @testA 18*67e74705SXin Li // CHECK1-LABEL: define void @testB 19*67e74705SXin Li // CHECK1-LABEL: define void @testC 20*67e74705SXin Li // CHECK1-LABEL: define available_externally i32 @ei() 21*67e74705SXin Li // CHECK1-LABEL: define available_externally void @gnu_ei_inline() 22*67e74705SXin Li 23*67e74705SXin Li // RUN: echo "C99 tests:" 24*67e74705SXin Li // RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=gnu99 | FileCheck %s --check-prefix=CHECK2 25*67e74705SXin Li // CHECK2-LABEL: define i32 @ei() 26*67e74705SXin Li // CHECK2-LABEL: define i32 @bar() 27*67e74705SXin Li // CHECK2-NOT: unreferenced1 28*67e74705SXin Li // CHECK2-LABEL: define void @unreferenced2() 29*67e74705SXin Li // CHECK2-LABEL: define void @gnu_inline() 30*67e74705SXin Li // CHECK2-LABEL: define i32 @test1 31*67e74705SXin Li // CHECK2-LABEL: define i32 @test2 32*67e74705SXin Li // CHECK2-LABEL: define void @test3 33*67e74705SXin Li // CHECK2-LABEL: define available_externally i32 @test4 34*67e74705SXin Li // CHECK2-LABEL: define available_externally i32 @test5 35*67e74705SXin Li // CHECK2-LABEL: define i32 @test6 36*67e74705SXin Li // CHECK2-LABEL: define void @test7 37*67e74705SXin Li // CHECK2: define available_externally i{{..}} @strlcpy 38*67e74705SXin Li // CHECK2-LABEL: define void @test9 39*67e74705SXin Li // CHECK2-LABEL: define void @testA 40*67e74705SXin Li // CHECK2-LABEL: define void @testB 41*67e74705SXin Li // CHECK2-LABEL: define void @testC 42*67e74705SXin Li // CHECK2-LABEL: define available_externally i32 @foo() 43*67e74705SXin Li // CHECK2-LABEL: define available_externally void @gnu_ei_inline() 44*67e74705SXin Li 45*67e74705SXin Li // RUN: echo "C++ tests:" 46*67e74705SXin Li // RUN: %clang_cc1 -x c++ %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=c++98 | FileCheck %s --check-prefix=CHECK3 47*67e74705SXin Li // CHECK3-LABEL: define i32 @_Z3barv() 48*67e74705SXin Li // CHECK3-LABEL: define linkonce_odr i32 @_Z3foov() 49*67e74705SXin Li // CHECK3-NOT: unreferenced 50*67e74705SXin Li // CHECK3-LABEL: define void @_Z10gnu_inlinev() 51*67e74705SXin Li // CHECK3-LABEL: define available_externally void @_Z13gnu_ei_inlinev() 52*67e74705SXin Li // CHECK3-NOT: @_Z5testCv 53*67e74705SXin Li // CHECK3-LABEL: define linkonce_odr i32 @_Z2eiv() 54*67e74705SXin Li 55*67e74705SXin Li // RUN: echo "MS C Mode tests:" 56*67e74705SXin Li // RUN: %clang_cc1 %s -triple i386-pc-win32 -O1 -disable-llvm-optzns -emit-llvm -o - -std=c99 | FileCheck %s --check-prefix=CHECK4 57*67e74705SXin Li // CHECK4-NOT: define weak_odr void @_Exit( 58*67e74705SXin Li // CHECK4-LABEL: define weak_odr i32 @ei() 59*67e74705SXin Li // CHECK4-LABEL: define i32 @bar() 60*67e74705SXin Li // CHECK4-NOT: unreferenced1 61*67e74705SXin Li // CHECK4-LABEL: define weak_odr void @unreferenced2() 62*67e74705SXin Li // CHECK4-LABEL: define void @gnu_inline() 63*67e74705SXin Li // CHECK4-LABEL: define linkonce_odr i32 @foo() 64*67e74705SXin Li // CHECK4-LABEL: define available_externally void @gnu_ei_inline() 65*67e74705SXin Li 66*67e74705SXin Li __attribute__((noreturn)) void __cdecl _exit(int _Code); _Exit(int status)67*67e74705SXin Li__inline void __cdecl _Exit(int status) { _exit(status); } 68*67e74705SXin Li ei()69*67e74705SXin Liextern __inline int ei() { return 123; } 70*67e74705SXin Li foo()71*67e74705SXin Li__inline int foo() { 72*67e74705SXin Li return ei(); 73*67e74705SXin Li } 74*67e74705SXin Li bar()75*67e74705SXin Liint bar() { return foo(); } 76*67e74705SXin Li 77*67e74705SXin Li unreferenced1()78*67e74705SXin Li__inline void unreferenced1() {} unreferenced2()79*67e74705SXin Liextern __inline void unreferenced2() {} 80*67e74705SXin Li gnu_inline()81*67e74705SXin Li__inline __attribute((__gnu_inline__)) void gnu_inline() {} 82*67e74705SXin Li 83*67e74705SXin Li // PR3988 gnu_ei_inline()84*67e74705SXin Liextern __inline __attribute__((gnu_inline)) void gnu_ei_inline() {} 85*67e74705SXin Li void (*P)() = gnu_ei_inline; 86*67e74705SXin Li 87*67e74705SXin Li // <rdar://problem/6818429> 88*67e74705SXin Li int test1(); test1()89*67e74705SXin Li__inline int test1() { return 4; } test2()90*67e74705SXin Li__inline int test2() { return 5; } 91*67e74705SXin Li __inline int test2(); 92*67e74705SXin Li int test2(); 93*67e74705SXin Li test_test1()94*67e74705SXin Livoid test_test1() { test1(); } test_test2()95*67e74705SXin Livoid test_test2() { test2(); } 96*67e74705SXin Li 97*67e74705SXin Li // PR3989 98*67e74705SXin Li extern __inline void test3() __attribute__((gnu_inline)); test3()99*67e74705SXin Li__inline void __attribute__((gnu_inline)) test3() {} 100*67e74705SXin Li 101*67e74705SXin Li extern int test4(void); test4(void)102*67e74705SXin Liextern __inline __attribute__ ((__gnu_inline__)) int test4(void) 103*67e74705SXin Li { 104*67e74705SXin Li return 0; 105*67e74705SXin Li } 106*67e74705SXin Li test_test4()107*67e74705SXin Livoid test_test4() { test4(); } 108*67e74705SXin Li 109*67e74705SXin Li extern __inline int test5(void) __attribute__ ((__gnu_inline__)); test5(void)110*67e74705SXin Liextern __inline int __attribute__ ((__gnu_inline__)) test5(void) 111*67e74705SXin Li { 112*67e74705SXin Li return 0; 113*67e74705SXin Li } 114*67e74705SXin Li test_test5()115*67e74705SXin Livoid test_test5() { test5(); } 116*67e74705SXin Li 117*67e74705SXin Li // PR10233 118*67e74705SXin Li test6()119*67e74705SXin Li__inline int test6() { return 0; } 120*67e74705SXin Li extern int test6(); 121*67e74705SXin Li 122*67e74705SXin Li 123*67e74705SXin Li // No PR#, but this once crashed clang in C99 mode due to buggy extern inline 124*67e74705SXin Li // redeclaration detection. test7()125*67e74705SXin Livoid test7() { } 126*67e74705SXin Li void test7(); 127*67e74705SXin Li 128*67e74705SXin Li // PR11062; the fact that the function is named strlcpy matters here. strlcpy(char * dest,const char * src,__typeof(sizeof (int)) size)129*67e74705SXin Liinline __typeof(sizeof(int)) strlcpy(char *dest, const char *src, __typeof(sizeof(int)) size) { return 3; } test8()130*67e74705SXin Livoid test8() { strlcpy(0,0,0); } 131*67e74705SXin Li 132*67e74705SXin Li // PR10657; the test crashed in C99 mode test9()133*67e74705SXin Liextern inline void test9() { } 134*67e74705SXin Li void test9(); 135*67e74705SXin Li testA()136*67e74705SXin Liinline void testA() {} 137*67e74705SXin Li void testA(); 138*67e74705SXin Li 139*67e74705SXin Li void testB(); testB()140*67e74705SXin Liinline void testB() {} 141*67e74705SXin Li extern void testB(); 142*67e74705SXin Li testC()143*67e74705SXin Liextern inline void testC() {} 144*67e74705SXin Li inline void testC(); 145