1 // RUN: %clang_cc1 -fsyntax-only -Wunused -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++11 %s
2 // RUN: %clang_cc1 -fsyntax-only -Wunused -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++17 %s
3 // RUN: %clang_cc1 -fsyntax-only -Wunused -Wused-but-marked-unused -Wno-uninitialized -verify -std=c++20 %s
5 #if __cplusplus >= 202002L
7 class EqDefaultCompare
{
11 EqDefaultCompare(int x
) : used(x
) {}
12 bool operator==(const EqDefaultCompare
&) const = default;
15 class SpaceShipDefaultCompare
{
19 SpaceShipDefaultCompare(int x
) : used(x
) {}
20 int operator<=>(const SpaceShipDefaultCompare
&) const = default;
23 class EqDefaultCompareOutOfClass
{
24 int used
; // no warning, the compiler generated AST for the comparison operator
25 // references the fields of the class, and this should be considered
27 // This test case is needed because clang does not emit the body
28 // of the defaulted operator when it is defined in-class until it
29 // finds a call to it. `-Wunused-private-field` is suppressed in
30 // a different way in that case.
31 bool operator==(const EqDefaultCompareOutOfClass
&) const;
34 bool EqDefaultCompareOutOfClass::operator==(const EqDefaultCompareOutOfClass
&) const = default;
36 class FriendEqDefaultCompareOutOfClass
{
37 int used
; // no warning, same reasoning just tested via a friend declaration.
38 friend bool operator==(const FriendEqDefaultCompareOutOfClass
&, const FriendEqDefaultCompareOutOfClass
&);
41 bool operator==(const FriendEqDefaultCompareOutOfClass
&, const FriendEqDefaultCompareOutOfClass
&) = default;
43 class HasUnusedField
{
44 int unused_
; // expected-warning{{private field 'unused_' is not used}}
47 class FriendEqDefaultCompare
{
49 friend auto operator==(FriendEqDefaultCompare
, FriendEqDefaultCompare
) -> bool = default;
52 class UnrelatedFriendEqDefaultCompare
{
53 friend auto operator==(UnrelatedFriendEqDefaultCompare
, UnrelatedFriendEqDefaultCompare
) -> bool = default;
54 int operator<=>(const UnrelatedFriendEqDefaultCompare
&) const = default;
59 class NotFullyDefined
{
66 class HasUndefinedNestedClass
{
71 class HasUndefinedPureVirtualDestructor
{
72 virtual ~HasUndefinedPureVirtualDestructor() = 0;
76 class HasDefinedNestedClasses
{
79 int unused_
; // expected-warning{{private field 'unused_' is not used}}
81 class HasDefinedNestedClasses::DefinedOutside
{};
83 class HasUndefinedFriendFunction
{
84 friend void undefinedFriendFunction();
88 class HasUndefinedFriendClass
{
89 friend class NotFullyDefined
;
90 friend class NotDefined
;
95 friend class FriendClass
;
96 friend void friendFunction(HasFriend f
);
97 int unused_
; // expected-warning{{private field 'unused_' is not used}}
98 int used_by_friend_class_
;
99 int used_by_friend_function_
;
102 class ClassWithTemplateFriend
{
103 template <typename T
> friend class TemplateFriend
;
108 template <typename T
> class TemplateFriend
{
110 TemplateFriend(ClassWithTemplateFriend my_friend
) {
111 int var
= my_friend
.used_by_friend_
; // expected-warning {{unused variable 'var'}}
116 HasFriend my_friend_
;
118 my_friend_
.used_by_friend_class_
= 42;
122 void friendFunction(HasFriend my_friend
) {
123 my_friend
.used_by_friend_function_
= 42;
126 class NonTrivialConstructor
{
128 NonTrivialConstructor() {}
131 class NonTrivialDestructor
{
133 ~NonTrivialDestructor() {}
148 A() : primitive_type_(42), default_initializer_(), other_initializer_(42),
149 trivial_(), user_constructor_(42),
150 initialized_with_side_effect_(side_effect()) {
152 attr_used_
= 42; // expected-warning{{'attr_used_' was marked unused but was used}}
155 A(int x
, A
* a
) : pointer_(a
) {}
158 int primitive_type_
; // expected-warning{{private field 'primitive_type_' is not used}}
159 A
* pointer_
; // expected-warning{{private field 'pointer_' is not used}}
160 int no_initializer_
; // expected-warning{{private field 'no_initializer_' is not used}}
161 int default_initializer_
; // expected-warning{{private field 'default_initializer_' is not used}}
162 int other_initializer_
; // expected-warning{{private field 'other_initializer_' is not used}}
163 int used_
, unused_
; // expected-warning{{private field 'unused_' is not used}}
164 int in_class_initializer_
= 42; // expected-warning{{private field 'in_class_initializer_' is not used}}
165 int in_class_initializer_with_side_effect_
= side_effect();
166 Trivial trivial_initializer_
= Trivial(); // expected-warning{{private field 'trivial_initializer_' is not used}}
167 Trivial non_trivial_initializer_
= Trivial(42);
168 int initialized_with_side_effect_
;
169 static int static_fields_are_ignored_
;
171 Trivial trivial_
; // expected-warning{{private field 'trivial_' is not used}}
172 Trivial user_constructor_
;
173 NonTrivialConstructor non_trivial_constructor_
;
174 NonTrivialDestructor non_trivial_destructor_
;
176 int attr_
__attribute__((unused
));
177 int attr_used_
__attribute__((unused
));
180 class EverythingUsed
{
182 EverythingUsed() : as_array_index_(0), var_(by_initializer_
) {
183 var_
= sizeof(sizeof_
);
184 int *use
= &by_reference_
; // expected-warning {{unused variable 'use'}}
186 test
[as_array_index_
] = 42;
187 int EverythingUsed::*ptr
= &EverythingUsed::by_pointer_to_member_
; // expected-warning {{unused variable 'ptr'}}
192 by_template_function_
= 42;
199 int by_template_function_
;
202 int by_pointer_to_member_
;
205 class HasFeatureTest
{
206 #if __has_feature(attribute_unused_on_fields)
207 int unused_
; // expected-warning{{private field 'unused_' is not used}}
208 int unused2_
__attribute__((unused
)); // no-warning
212 namespace templates
{
214 template <typename T
> void f(T t
);
217 } // namespace templates
219 namespace mutual_friends
{
220 // Undefined methods make mutual friends undefined.
224 void doSomethingToAOrB();
231 // Undefined friends do not make a mutual friend undefined.
234 void doSomethingElse() {}
239 int d
; // expected-warning{{private field 'd' is not used}}
243 // Undefined nested classes make mutual friends undefined.
253 } // namespace mutual_friends
255 namespace anonymous_structs_unions
{
258 // FIXME: Look at the DeclContext for anonymous structs/unions.
261 unsigned char Data
[8];
267 unsigned char Data
[8];
269 } // namespace anonymous_structs_unions
273 A() : p_(__null
), b_(false), a_(this), p2_(nullptr) {}
274 void* p_
; // expected-warning{{private field 'p_' is not used}}
275 bool b_
; // expected-warning{{private field 'b_' is not used}}
276 A
* a_
; // expected-warning{{private field 'a_' is not used}}
277 void* p2_
; // expected-warning{{private field 'p2_' is not used}}
287 void (*p
)(int); // expected-warning{{private field 'p' is not used}}
294 B(int n
) : a
{n
}, b
{(f(n
), 0)} {}
296 A a
= A(); // expected-warning{{private field 'a' is not used}}
302 X x
[4]; // no-warning
306 class implicit_special_member
{
308 static implicit_special_member
make() { return implicit_special_member(); }
311 int n
; // expected-warning{{private field 'n' is not used}}
314 class defaulted_special_member
{
316 defaulted_special_member(const defaulted_special_member
&) = default;
319 int n
; // expected-warning{{private field 'n' is not used}}
323 class [[maybe_unused
]] MaybeUnusedClass
{};
324 enum [[maybe_unused
]] MaybeUnusedEnum
{};
325 typedef int MaybeUnusedTypedef
[[maybe_unused
]];
327 MaybeUnusedClass c
; // no-warning
328 MaybeUnusedEnum e
; // no-warning
329 MaybeUnusedTypedef t
; // no-warning
334 class [[gnu::warn_unused
]] S
{
339 struct [[maybe_unused
]] T
{};
342 int i
= 0; // expected-warning {{unused variable 'i'}}
343 S s
; // expected-warning {{unused variable 's'}}
349 const int i
= 0; // expected-warning {{private field 'i' is not used}}
350 int j
= 0; // expected-warning {{private field 'j' is not used}}
351 const S s1
; // expected-warning {{private field 's1' is not used}}
353 S s2
; // expected-warning {{private field 's2' is not used}}