blob: 70ab696b64ee02044a8090f2997beb82759fd09d [file] [log] [blame]
Daniel Dunbar4fcfde42009-11-08 01:45:36 +00001// RUN: echo "GNU89 tests:"
Rafael Espindola65db61f2013-09-04 04:55:03 +00002// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=gnu89 | FileCheck %s --check-prefix=CHECK1
Stephen Lin93ab6bf2013-08-15 06:47:53 +00003// CHECK1-LABEL: define i32 @foo()
4// CHECK1-LABEL: define i32 @bar()
5// CHECK1-LABEL: define void @unreferenced1()
David Blaikie3de93c82013-01-05 18:22:42 +00006// CHECK1-NOT: unreferenced2
Stephen Lin93ab6bf2013-08-15 06:47:53 +00007// 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
David Blaikie3de93c82013-01-05 18:22:42 +000015// CHECK1: define i{{..}} @strlcpy
16// CHECK1-NOT: test9
Stephen Lin93ab6bf2013-08-15 06:47:53 +000017// CHECK1-LABEL: define void @testA
18// CHECK1-LABEL: define void @testB
19// CHECK1-LABEL: define void @testC
20// CHECK1-LABEL: define available_externally void @gnu_ei_inline()
21// CHECK1-LABEL: define available_externally i32 @ei()
Chris Lattnerd9d049a2009-04-14 06:27:57 +000022
Eli Friedmana3b9fa22012-02-07 03:50:18 +000023// RUN: echo "C99 tests:"
Rafael Espindola65db61f2013-09-04 04:55:03 +000024// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=gnu99 | FileCheck %s --check-prefix=CHECK2
Stephen Lin93ab6bf2013-08-15 06:47:53 +000025// CHECK2-LABEL: define i32 @ei()
26// CHECK2-LABEL: define i32 @bar()
David Blaikie3de93c82013-01-05 18:22:42 +000027// CHECK2-NOT: unreferenced1
Stephen Lin93ab6bf2013-08-15 06:47:53 +000028// 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
David Blaikie3de93c82013-01-05 18:22:42 +000037// CHECK2: define available_externally i{{..}} @strlcpy
Stephen Lin93ab6bf2013-08-15 06:47:53 +000038// 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 void @gnu_ei_inline()
43// CHECK2-LABEL: define available_externally i32 @foo()
Chris Lattnerd9d049a2009-04-14 06:27:57 +000044
Eli Friedmana3b9fa22012-02-07 03:50:18 +000045// RUN: echo "C++ tests:"
Rafael Espindola65db61f2013-09-04 04:55:03 +000046// 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
Stephen Lin93ab6bf2013-08-15 06:47:53 +000047// CHECK3-LABEL: define i32 @_Z3barv()
48// CHECK3-LABEL: define linkonce_odr i32 @_Z3foov()
David Blaikie3de93c82013-01-05 18:22:42 +000049// CHECK3-NOT: unreferenced
Stephen Lin93ab6bf2013-08-15 06:47:53 +000050// CHECK3-LABEL: define void @_Z10gnu_inlinev()
51// CHECK3-LABEL: define available_externally void @_Z13gnu_ei_inlinev()
52// CHECK3-LABEL: define linkonce_odr i32 @_Z2eiv()
Chris Lattnerd9d049a2009-04-14 06:27:57 +000053
David Majnemer13163702013-08-01 17:26:42 +000054// RUN: echo "MS C Mode tests:"
Rafael Espindola65db61f2013-09-04 04:55:03 +000055// RUN: %clang_cc1 %s -triple i386-unknown-unknown -O1 -disable-llvm-optzns -emit-llvm -o - -std=c99 -fms-compatibility | FileCheck %s --check-prefix=CHECK4
Stephen Lin93ab6bf2013-08-15 06:47:53 +000056// CHECK4-LABEL: define i32 @bar()
57// CHECK4-LABEL: define void @gnu_inline()
58// CHECK4-LABEL: define available_externally void @gnu_ei_inline()
59// CHECK4-LABEL: define linkonce_odr i32 @foo()
David Majnemer13163702013-08-01 17:26:42 +000060// CHECK4-NOT: unreferenced
Stephen Lin93ab6bf2013-08-15 06:47:53 +000061// CHECK4-LABEL: define linkonce_odr i32 @ei()
David Majnemer13163702013-08-01 17:26:42 +000062
Eli Friedmaneb32fde2009-04-28 03:13:54 +000063extern __inline int ei() { return 123; }
Chris Lattnerd9d049a2009-04-14 06:27:57 +000064
Eli Friedmaneb32fde2009-04-28 03:13:54 +000065__inline int foo() {
Chris Lattnerd9d049a2009-04-14 06:27:57 +000066 return ei();
67}
68
69int bar() { return foo(); }
70
71
Eli Friedmaneb32fde2009-04-28 03:13:54 +000072__inline void unreferenced1() {}
73extern __inline void unreferenced2() {}
Chris Lattnerd9d049a2009-04-14 06:27:57 +000074
Chris Lattnercf2a7212009-04-20 19:12:28 +000075__inline __attribute((__gnu_inline__)) void gnu_inline() {}
Chris Lattnerd55a71d2009-04-22 00:03:30 +000076
77// PR3988
Eli Friedmaneb32fde2009-04-28 03:13:54 +000078extern __inline __attribute__((gnu_inline)) void gnu_ei_inline() {}
Chris Lattnerd55a71d2009-04-22 00:03:30 +000079void (*P)() = gnu_ei_inline;
80
Douglas Gregorb3efa982009-04-23 18:22:55 +000081// <rdar://problem/6818429>
82int test1();
Eli Friedmaneb32fde2009-04-28 03:13:54 +000083__inline int test1() { return 4; }
84__inline int test2() { return 5; }
85__inline int test2();
Douglas Gregorb3efa982009-04-23 18:22:55 +000086int test2();
87
88void test_test1() { test1(); }
89void test_test2() { test2(); }
90
91// PR3989
Eli Friedmaneb32fde2009-04-28 03:13:54 +000092extern __inline void test3() __attribute__((gnu_inline));
Douglas Gregor1fc09a92009-09-13 07:46:26 +000093__inline void __attribute__((gnu_inline)) test3() {}
Douglas Gregor9f9bf252009-04-28 06:37:30 +000094
95extern int test4(void);
96extern __inline __attribute__ ((__gnu_inline__)) int test4(void)
97{
Mike Stumpc36541e2009-07-21 20:52:43 +000098 return 0;
Douglas Gregor9f9bf252009-04-28 06:37:30 +000099}
100
101void test_test4() { test4(); }
102
Douglas Gregor1fc09a92009-09-13 07:46:26 +0000103extern __inline int test5(void) __attribute__ ((__gnu_inline__));
Douglas Gregor9f9bf252009-04-28 06:37:30 +0000104extern __inline int __attribute__ ((__gnu_inline__)) test5(void)
105{
Mike Stumpc36541e2009-07-21 20:52:43 +0000106 return 0;
Douglas Gregor9f9bf252009-04-28 06:37:30 +0000107}
108
109void test_test5() { test5(); }
Nick Lewyckydce67a72011-07-18 05:26:13 +0000110
111// PR10233
112
113__inline int test6() { return 0; }
114extern int test6();
Nick Lewyckyf57ef052011-07-18 07:11:55 +0000115
Anton Yartsev3a5aca82012-02-02 06:06:34 +0000116
117// No PR#, but this once crashed clang in C99 mode due to buggy extern inline
118// redeclaration detection.
119void test7() { }
Nick Lewyckyf57ef052011-07-18 07:11:55 +0000120void test7();
Eli Friedman8a1d6a52011-10-11 22:09:24 +0000121
122// PR11062; the fact that the function is named strlcpy matters here.
123inline __typeof(sizeof(int)) strlcpy(char *dest, const char *src, __typeof(sizeof(int)) size) { return 3; }
124void test8() { strlcpy(0,0,0); }
Eli Friedmana3b9fa22012-02-07 03:50:18 +0000125
126// PR10657; the test crashed in C99 mode
127extern inline void test9() { }
128void test9();
129
130inline void testA() {}
131void testA();
132
133void testB();
134inline void testB() {}
135extern void testB();
136
137extern inline void testC() {}
138inline void testC();