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