blob: 1c9c96ea0940b001f318ca8e796f227875e26463 [file] [log] [blame]
Alexander Kornienkob816ba02016-01-08 16:37:11 +00001// RUN: %check_clang_tidy %s misc-definitions-in-headers %t
2
3int f() {
4// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f' defined in a header file; function definitions in header files can lead to ODR violations [misc-definitions-in-headers]
5// CHECK-FIXES: inline int f() {
6 return 1;
7}
8
9class CA {
10 void f1() {} // OK: inline class member function definition.
11 void f2();
12 template<typename T>
13 T f3() {
14 T a = 1;
15 return a;
16 }
17 template<typename T>
18 struct CAA {
19 struct CAB {
20 void f4();
21 };
22 };
23};
24
25void CA::f2() { }
26// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: function 'f2' defined in a header file;
27// CHECK-FIXES: inline void CA::f2() {
28
29template <>
30int CA::f3() {
Benjamin Kramera62e2232016-04-07 14:55:25 +000031// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: function 'f3<int>' defined in a header file;
Haojian Wu0b067c12016-07-13 13:55:29 +000032// CHECK-FIXES: inline int CA::f3() {
Alexander Kornienkob816ba02016-01-08 16:37:11 +000033 int a = 1;
34 return a;
35}
36
37template <typename T>
38void CA::CAA<T>::CAB::f4() {
39// OK: member function definition of a nested template class in a class.
40}
41
42template <typename T>
43struct CB {
44 void f1();
45 struct CCA {
46 void f2(T a);
47 };
48 struct CCB; // OK: forward declaration.
49 static int a; // OK: class static data member declaration.
50};
51
52template <typename T>
53void CB<T>::f1() { // OK: Member function definition of a class template.
54}
55
56template <typename T>
57void CB<T>::CCA::f2(T a) {
58// OK: member function definition of a nested class in a class template.
59}
60
61template <typename T>
62struct CB<T>::CCB {
63 void f3();
64};
65
66template <typename T>
67void CB<T>::CCB::f3() {
68// OK: member function definition of a nested class in a class template.
69}
70
71template <typename T>
72int CB<T>::a = 2; // OK: static data member definition of a class template.
73
74template <typename T>
75T tf() { // OK: template function definition.
76 T a;
77 return a;
78}
79
80
81namespace NA {
82 int f() { return 1; }
83// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: function 'f' defined in a header file;
84// CHECK-FIXES: inline int f() { return 1; }
85}
86
87template <typename T>
88T f3() {
89 T a = 1;
90 return a;
91}
92
93template <>
Alexander Kornienkob816ba02016-01-08 16:37:11 +000094int f3() {
Haojian Wu0b067c12016-07-13 13:55:29 +000095// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: function 'f3<int>' defined in a header file;
96// CHECK-FIXES: inline int f3() {
Alexander Kornienkob816ba02016-01-08 16:37:11 +000097 int a = 1;
98 return a;
99}
100
101int f5(); // OK: function declaration.
102inline int f6() { return 1; } // OK: inline function definition.
103namespace {
104 int f7() { return 1; }
105// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: function 'f7' defined in a header file;
106}
107
Haojian Wuba992cf2016-06-07 08:55:38 +0000108int f8() = delete; // OK: the function being marked delete is not callable.
109
Alexander Kornienkob816ba02016-01-08 16:37:11 +0000110int a = 1;
111// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: variable 'a' defined in a header file; variable definitions in header files can lead to ODR violations [misc-definitions-in-headers]
112CA a1;
113// CHECK-MESSAGES: :[[@LINE-1]]:4: warning: variable 'a1' defined in a header file;
114
115namespace NB {
116 int b = 1;
117// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'b' defined in a header file;
118 const int c = 1; // OK: internal linkage variable definition.
119}
120
121class CC {
122 static int d; // OK: class static data member declaration.
123};
124
125int CC::d = 1;
126// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: variable 'd' defined in a header file;
127
128const char* ca = "foo";
129// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: variable 'ca' defined in a header file;
130
131namespace {
132 int e = 2;
133// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: variable 'e' defined in a header file;
134}
135
136const char* const g = "foo"; // OK: internal linkage variable definition.
137static int h = 1; // OK: internal linkage variable definition.
138const int i = 1; // OK: internal linkage variable definition.
139extern int j; // OK: internal linkage variable definition.
Haojian Wu29634fe2016-02-03 12:10:27 +0000140
141template <typename T, typename U>
142struct CD {
143 int f();
144};
145
146template <typename T>
147struct CD<T, int> {
148 int f();
149};
150
151template <>
152struct CD<int, int> {
153 int f();
154};
155
156int CD<int, int>::f() {
157// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: function 'f' defined in a header file;
Haojian Wu0b067c12016-07-13 13:55:29 +0000158// CHECK-FIXES: inline int CD<int, int>::f() {
Haojian Wu29634fe2016-02-03 12:10:27 +0000159 return 0;
160}
161
162template <typename T>
163int CD<T, int>::f() { // OK: partial template specialization.
164 return 0;
165}