Skip to content

Commit 074f5e5

Browse files
committed
Add tests for templates
1 parent a7a2fbe commit 074f5e5

File tree

1 file changed

+86
-1
lines changed

1 file changed

+86
-1
lines changed

clang/test/SemaCXX/unique_object_duplication.h

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,89 @@ namespace GlobalTest {
154154
};
155155

156156
inline float Test::disallowedStaticMember2 = 2.3; // hidden-warning {{'disallowedStaticMember2' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
157-
} // namespace GlobalTest
157+
} // namespace GlobalTest
158+
159+
/******************************************************************************
160+
* Case three: Inside templates
161+
******************************************************************************/
162+
163+
namespace TemplateTest {
164+
165+
template <typename T>
166+
int disallowedTemplate1 = 0; // hidden-warning {{'disallowedTemplate1<int>' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
167+
168+
template int disallowedTemplate1<int>; // hidden-note {{in instantiation of}}
169+
170+
171+
// Should work for implicit instantiation as well
172+
template <typename T>
173+
int disallowedTemplate2 = 0; // hidden-warning {{'disallowedTemplate2<int>' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
174+
175+
int implicit_instantiate() {
176+
return disallowedTemplate2<int>; // hidden-note {{in instantiation of}}
177+
}
178+
179+
180+
// Ensure we only get warnings for templates that are actually instantiated
181+
template <typename T>
182+
int maybeAllowedTemplate = 0; // Not instantiated, so no warning here
183+
184+
template <typename T>
185+
int maybeAllowedTemplate<T*> = 1; // hidden-warning {{'maybeAllowedTemplate<int *>' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
186+
187+
template <>
188+
int maybeAllowedTemplate<bool> = 2; // hidden-warning {{'maybeAllowedTemplate<bool>' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
189+
190+
template int maybeAllowedTemplate<int*>; // hidden-note {{in instantiation of}}
191+
192+
193+
194+
// Should work the same for static class members
195+
template <class T>
196+
struct S {
197+
static int staticMember;
198+
};
199+
200+
template <class T>
201+
int S<T>::staticMember = 0; // Never instantiated
202+
203+
// T* specialization
204+
template <class T>
205+
struct S<T*> {
206+
static int staticMember;
207+
};
208+
209+
template <class T>
210+
int S<T*>::staticMember = 1; // hidden-warning {{'staticMember' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
211+
212+
template class S<int*>; // hidden-note {{in instantiation of}}
213+
214+
// T& specialization, implicitly instantiated
215+
template <class T>
216+
struct S<T&> {
217+
static int staticMember;
218+
};
219+
220+
template <class T>
221+
int S<T&>::staticMember = 2; // hidden-warning {{'staticMember' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
222+
223+
int implicit_instantiate2() {
224+
return S<bool&>::staticMember; // hidden-note {{in instantiation of}}
225+
}
226+
227+
228+
// Should work for static locals as well
229+
template <class T>
230+
int* wrapper() {
231+
static int staticLocal; // hidden-warning {{'staticLocal' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
232+
return &staticLocal;
233+
}
234+
235+
template <>
236+
int* wrapper<int*>() {
237+
static int staticLocal; // hidden-warning {{'staticLocal' may be duplicated when built into a shared library: it is mutable, has hidden visibility, and external linkage}}
238+
return &staticLocal;
239+
}
240+
241+
auto dummy = wrapper<bool>(); // hidden-note {{in instantiation of}}
242+
} // namespace TemplateTest

0 commit comments

Comments
 (0)