14fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: echo "GNU89 tests:"
265db61fdbb356994ed7b5387c02554c20028670dRafael Espindola// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=gnu89 | FileCheck %s --check-prefix=CHECK1
393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define i32 @foo()
493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define i32 @bar()
593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @unreferenced1()
63de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1-NOT: unreferenced2
793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @gnu_inline()
893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define i32 @test1
993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define i32 @test2
1093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @test3()
1193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define available_externally i32 @test4
1293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define available_externally i32 @test5
1393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define i32 @test6
1493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @test7
153de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1: define i{{..}} @strlcpy
163de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK1-NOT: test9
1793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @testA
1893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @testB
1993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define void @testC
2093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define available_externally void @gnu_ei_inline()
2193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK1-LABEL: define available_externally i32 @ei()
22a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
23a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman// RUN: echo "C99 tests:"
2465db61fdbb356994ed7b5387c02554c20028670dRafael Espindola// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=gnu99 | FileCheck %s --check-prefix=CHECK2
2593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define i32 @ei()
2693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define i32 @bar()
273de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2-NOT: unreferenced1
2893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @unreferenced2()
2993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @gnu_inline()
3093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define i32 @test1
3193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define i32 @test2
3293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @test3
3393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define available_externally i32 @test4
3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define available_externally i32 @test5
3593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define i32 @test6
3693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @test7
373de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK2: define available_externally i{{..}} @strlcpy
3893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @test9
3993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @testA
4093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @testB
4193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define void @testC
4293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define available_externally void @gnu_ei_inline()
4393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK2-LABEL: define available_externally i32 @foo()
44d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
45a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman// RUN: echo "C++ tests:"
4665db61fdbb356994ed7b5387c02554c20028670dRafael Espindola// 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
4793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK3-LABEL: define i32 @_Z3barv()
4893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK3-LABEL: define linkonce_odr i32 @_Z3foov()
493de93c883d3253c38e90d0a3a050899eeb806eeeDavid Blaikie// CHECK3-NOT: unreferenced
5093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK3-LABEL: define void @_Z10gnu_inlinev()
5193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK3-LABEL: define available_externally void @_Z13gnu_ei_inlinev()
5293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK3-LABEL: define linkonce_odr i32 @_Z2eiv()
53d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
5413163700843a0ad1df903bdadcce59ae86827d72David Majnemer// RUN: echo "MS C Mode tests:"
5565db61fdbb356994ed7b5387c02554c20028670dRafael Espindola// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=c99 -fms-compatibility | FileCheck %s --check-prefix=CHECK4
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK4-LABEL: define weak_odr i32 @ei()
5793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK4-LABEL: define i32 @bar()
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK4-NOT: unreferenced1
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK4-LABEL: define weak_odr void @unreferenced2()
6093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK4-LABEL: define void @gnu_inline()
6193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK4-LABEL: define available_externally void @gnu_ei_inline()
6293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK4-LABEL: define linkonce_odr i32 @foo()
6313163700843a0ad1df903bdadcce59ae86827d72David Majnemer
64eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline int ei() { return 123; }
65d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
66eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int foo() {
67d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner  return ei();
68d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner}
69d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
70d9d049a93c55624908e81cf3927b7905efeba05fChris Lattnerint bar() { return foo(); }
71d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
72d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
73eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline void unreferenced1() {}
74eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline void unreferenced2() {}
75d9d049a93c55624908e81cf3927b7905efeba05fChris Lattner
76cf2a7211b4785068c7efa836baab90b198a4d2a6Chris Lattner__inline __attribute((__gnu_inline__)) void gnu_inline() {}
77d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattner
78d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattner// PR3988
79eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline __attribute__((gnu_inline)) void gnu_ei_inline() {}
80d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattnervoid (*P)() = gnu_ei_inline;
81d55a71d852d4d8b785122b8d033a0c06b187067bChris Lattner
82b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor// <rdar://problem/6818429>
83b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorint test1();
84eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int test1() { return 4; }
85eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int test2() { return 5; }
86eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedman__inline int test2();
87b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorint test2();
88b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor
89b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorvoid test_test1() { test1(); }
90b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregorvoid test_test2() { test2(); }
91b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor
92b3efa98e320590e8be9d62818e89e599303e65b4Douglas Gregor// PR3989
93eb32fde032a250091134db56a3aeaea6b09f6594Eli Friedmanextern __inline void test3() __attribute__((gnu_inline));
941fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor__inline void __attribute__((gnu_inline)) test3() {}
959f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
969f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorextern int test4(void);
979f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorextern __inline __attribute__ ((__gnu_inline__)) int test4(void)
989f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor{
99c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
1009f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1019f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1029f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid test_test4() { test4(); }
1039f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1041fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregorextern __inline int test5(void)  __attribute__ ((__gnu_inline__));
1059f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorextern __inline int __attribute__ ((__gnu_inline__)) test5(void)
1069f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor{
107c36541e7bfa69cc63e2668a986bc99117559c545Mike Stump  return 0;
1089f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor}
1099f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor
1109f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregorvoid test_test5() { test5(); }
111dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky
112dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky// PR10233
113dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky
114dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewycky__inline int test6() { return 0; }
115dce67a70a86db8758c926a76fdd980f5369d5746Nick Lewyckyextern int test6();
116f57ef0516c011237a1b6a5b2585b99caf0396bd7Nick Lewycky
1173a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev
1183a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev// No PR#, but this once crashed clang in C99 mode due to buggy extern inline
1193a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsev// redeclaration detection.
1203a5aca8112e03814f78906dc5d032287adb272b5Anton Yartsevvoid test7() { }
121f57ef0516c011237a1b6a5b2585b99caf0396bd7Nick Lewyckyvoid test7();
1228a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedman
1238a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedman// PR11062; the fact that the function is named strlcpy matters here.
1248a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedmaninline __typeof(sizeof(int)) strlcpy(char *dest, const char *src, __typeof(sizeof(int)) size) { return 3; }
1258a1d6a5eec8287729084e2a79b39fac96a9c75cdEli Friedmanvoid test8() { strlcpy(0,0,0); }
126a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
127a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman// PR10657; the test crashed in C99 mode
128a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanextern inline void test9() { }
129a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanvoid test9();
130a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
131a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmaninline void testA() {}
132a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanvoid testA();
133a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
134a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanvoid testB();
135a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmaninline void testB() {}
136a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanextern void testB();
137a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedman
138a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmanextern inline void testC() {}
139a3b9fa2024accdc38e0c8458b5ffd6b5ec0580d5Eli Friedmaninline void testC();
140