14fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: echo "GNU89 tests:"
23de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// RUN: %clang %s -target i386-unknown-unknown -O1 -emit-llvm -S -o - -std=gnu89 | FileCheck %s --check-prefix=CHECK1
33de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i32 @foo()
43de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i32 @bar()
53de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @unreferenced1()
63de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1-NOT: unreferenced2
73de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @gnu_inline()
83de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i32 @test1
93de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i32 @test2
103de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @test3()
113de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define available_externally i32 @test4
123de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define available_externally i32 @test5
133de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i32 @test6
143de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @test7
153de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i{{..}} @strlcpy
163de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1-NOT: test9
173de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @testA
183de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @testB
193de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define void @testC
203de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define available_externally void @gnu_ei_inline()
213de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define available_externally i32 @ei()
22a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
23a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman// RUN: echo "C99 tests:"
243de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// RUN: %clang %s -target i386-unknown-unknown -O1 -emit-llvm -S -o - -std=gnu99 | FileCheck %s --check-prefix=CHECK2
253de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define i32 @ei()
263de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define i32 @bar()
273de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2-NOT: unreferenced1
283de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @unreferenced2()
293de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @gnu_inline()
303de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define i32 @test1
313de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define i32 @test2
323de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @test3
333de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define available_externally i32 @test4
343de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define available_externally i32 @test5
353de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define i32 @test6
363de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @test7
373de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define available_externally i{{..}} @strlcpy
383de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @test9
393de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @testA
403de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @testB
413de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define void @testC
423de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define available_externally void @gnu_ei_inline()
433de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define available_externally i32 @foo()
44d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
45a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman// RUN: echo "C++ tests:"
463de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// RUN: %clang -x c++ %s -target i386-unknown-unknown -O1 -emit-llvm -S -o - -std=c++98 | FileCheck %s --check-prefix=CHECK3
473de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3: define i32 @_Z3barv()
483de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3: define linkonce_odr i32 @_Z3foov()
493de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3-NOT: unreferenced
503de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3: define void @_Z10gnu_inlinev()
513de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3: define available_externally void @_Z13gnu_ei_inlinev()
523de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3: define linkonce_odr i32 @_Z2eiv()
53d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
5413163700843a0ad1df903bdadcce59ae86827d72David Majnemer// RUN: echo "MS C Mode tests:"
5513163700843a0ad1df903bdadcce59ae86827d72David Majnemer// RUN: %clang %s -target i386-unknown-unknown -O1 -emit-llvm -S -o - -std=c99 -fms-compatibility | FileCheck %s --check-prefix=CHECK4
5613163700843a0ad1df903bdadcce59ae86827d72David Majnemer// CHECK4: define i32 @bar()
5713163700843a0ad1df903bdadcce59ae86827d72David Majnemer// CHECK4: define void @gnu_inline()
5813163700843a0ad1df903bdadcce59ae86827d72David Majnemer// CHECK4: define available_externally void @gnu_ei_inline()
5913163700843a0ad1df903bdadcce59ae86827d72David Majnemer// CHECK4: define linkonce_odr i32 @foo()
6013163700843a0ad1df903bdadcce59ae86827d72David Majnemer// CHECK4-NOT: unreferenced
6113163700843a0ad1df903bdadcce59ae86827d72David Majnemer// CHECK4: define linkonce_odr i32 @ei()
6213163700843a0ad1df903bdadcce59ae86827d72David Majnemer
63eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline int ei() { return 123; }
64d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
65eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int foo() {
66d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner  return ei();
67d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner}
68d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
69d9d049a93c55624908e81cf3927b7905efeba05fChris Lattnerint bar() { return foo(); }
70d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
71d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
72eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline void unreferenced1() {}
73eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline void unreferenced2() {}
74d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
75cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner__inline __attribute((__gnu_inline__)) void gnu_inline() {}
76d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattner
77d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattner// PR3988
78eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline __attribute__((gnu_inline)) void gnu_ei_inline() {}
79d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattnervoid (*P)() = gnu_ei_inline;
80d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattner
81b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor// <rdar://problem/6818429>
82b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorint test1();
83eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int test1() { return 4; }
84eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int test2() { return 5; }
85eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int test2();
86b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorint test2();
87b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor
88b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorvoid test_test1() { test1(); }
89b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorvoid test_test2() { test2(); }
90b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor
91b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor// PR3989
92eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline void test3() __attribute__((gnu_inline));
931fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor__inline void __attribute__((gnu_inline)) test3() {}
949f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
959f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorextern int test4(void);
969f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorextern __inline __attribute__ ((__gnu_inline__)) int test4(void)
979f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor{
98c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
999f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid test_test4() { test4(); }
1029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1031fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregorextern __inline int test5(void)  __attribute__ ((__gnu_inline__));
1049f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorextern __inline int __attribute__ ((__gnu_inline__)) test5(void)
1059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor{
106c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
1079f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1089f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1099f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid test_test5() { test5(); }
110dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky
111dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky// PR10233
112dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky
113dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky__inline int test6() { return 0; }
114dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewyckyextern int test6();
115f57ef0516c011237a1b6a5b2585b99caf0396bd7Nick Lewycky
1163a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev
1173a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev// No PR#, but this once crashed clang in C99 mode due to buggy extern inline
1183a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev// redeclaration detection.
1193a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsevvoid test7() { }
120f57ef0516c011237a1b6a5b2585b99caf0396bd7Nick Lewyckyvoid test7();
1218a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedman
1228a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedman// PR11062; the fact that the function is named strlcpy matters here.
1238a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedmaninline __typeof(sizeof(int)) strlcpy(char *dest, const char *src, __typeof(sizeof(int)) size) { return 3; }
1248a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedmanvoid test8() { strlcpy(0,0,0); }
125a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
126a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman// PR10657; the test crashed in C99 mode
127a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanextern inline void test9() { }
128a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanvoid test9();
129a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
130a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmaninline void testA() {}
131a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanvoid testA();
132a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
133a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanvoid testB();
134a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmaninline void testB() {}
135a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanextern void testB();
136a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
137a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanextern inline void testC() {}
138a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmaninline void testC();
139