Daniel Jasper | 5c62ef5 | 2012-06-25 09:19:47 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fsyntax-only -Wunused-private-field -Wused-but-marked-unused -verify -std=c++11 %s |
Daniel Jasper | f8cc02e | 2012-06-06 08:32:04 +0000 | [diff] [blame] | 2 | |
| 3 | class NotFullyDefined { |
| 4 | public: |
| 5 | NotFullyDefined(); |
| 6 | private: |
| 7 | int y; |
| 8 | }; |
| 9 | |
| 10 | class HasUndefinedNestedClass { |
| 11 | class Undefined; |
| 12 | int unused_; |
| 13 | }; |
| 14 | |
| 15 | class HasUndefinedPureVirtualDestructor { |
| 16 | virtual ~HasUndefinedPureVirtualDestructor() = 0; |
| 17 | int unused_; |
| 18 | }; |
| 19 | |
| 20 | class HasDefinedNestedClasses { |
| 21 | class DefinedHere {}; |
| 22 | class DefinedOutside; |
| 23 | int unused_; // expected-warning{{private field 'unused_' is not used}} |
| 24 | }; |
| 25 | class HasDefinedNestedClasses::DefinedOutside {}; |
| 26 | |
| 27 | class HasUndefinedFriendFunction { |
| 28 | friend void undefinedFriendFunction(); |
| 29 | int unused_; |
| 30 | }; |
| 31 | |
| 32 | class HasUndefinedFriendClass { |
| 33 | friend class NotFullyDefined; |
| 34 | friend class NotDefined; |
| 35 | int unused_; |
| 36 | }; |
| 37 | |
| 38 | class HasFriend { |
| 39 | friend class FriendClass; |
| 40 | friend void friendFunction(HasFriend f); |
| 41 | int unused_; // expected-warning{{private field 'unused_' is not used}} |
| 42 | int used_by_friend_class_; |
| 43 | int used_by_friend_function_; |
| 44 | }; |
| 45 | |
| 46 | class ClassWithTemplateFriend { |
| 47 | template <typename T> friend class TemplateFriend; |
| 48 | int used_by_friend_; |
| 49 | int unused_; |
| 50 | }; |
| 51 | |
| 52 | template <typename T> class TemplateFriend { |
| 53 | public: |
| 54 | TemplateFriend(ClassWithTemplateFriend my_friend) { |
| 55 | int var = my_friend.used_by_friend_; |
| 56 | } |
| 57 | }; |
| 58 | |
| 59 | class FriendClass { |
| 60 | HasFriend my_friend_; |
| 61 | void use() { |
| 62 | my_friend_.used_by_friend_class_ = 42; |
| 63 | } |
| 64 | }; |
| 65 | |
| 66 | void friendFunction(HasFriend my_friend) { |
| 67 | my_friend.used_by_friend_function_ = 42; |
| 68 | } |
| 69 | |
| 70 | class NonTrivialConstructor { |
| 71 | public: |
| 72 | NonTrivialConstructor() {} |
| 73 | }; |
| 74 | |
| 75 | class NonTrivialDestructor { |
| 76 | public: |
| 77 | ~NonTrivialDestructor() {} |
| 78 | }; |
| 79 | |
| 80 | class Trivial { |
| 81 | public: |
| 82 | Trivial() = default; |
| 83 | Trivial(int a) {} |
| 84 | }; |
| 85 | |
| 86 | int side_effect() { |
| 87 | return 42; |
| 88 | } |
| 89 | |
| 90 | class A { |
| 91 | public: |
| 92 | A() : primitive_type_(42), default_initializer_(), other_initializer_(42), |
| 93 | trivial_(), user_constructor_(42), |
| 94 | initialized_with_side_effect_(side_effect()) { |
| 95 | used_ = 42; |
Daniel Jasper | 5c62ef5 | 2012-06-25 09:19:47 +0000 | [diff] [blame] | 96 | attr_used_ = 42; // expected-warning{{'attr_used_' was marked unused but was used}} |
Daniel Jasper | f8cc02e | 2012-06-06 08:32:04 +0000 | [diff] [blame] | 97 | } |
| 98 | |
| 99 | A(int x, A* a) : pointer_(a) {} |
| 100 | |
| 101 | private: |
| 102 | int primitive_type_; // expected-warning{{private field 'primitive_type_' is not used}} |
| 103 | A* pointer_; // expected-warning{{private field 'pointer_' is not used}} |
| 104 | int no_initializer_; // expected-warning{{private field 'no_initializer_' is not used}} |
| 105 | int default_initializer_; // expected-warning{{private field 'default_initializer_' is not used}} |
| 106 | int other_initializer_; // expected-warning{{private field 'other_initializer_' is not used}} |
| 107 | int used_, unused_; // expected-warning{{private field 'unused_' is not used}} |
| 108 | int in_class_initializer_ = 42; // expected-warning{{private field 'in_class_initializer_' is not used}} |
| 109 | int in_class_initializer_with_side_effect_ = side_effect(); |
Richard Smith | 0b8220a | 2012-08-07 21:30:42 +0000 | [diff] [blame] | 110 | Trivial trivial_initializer_ = Trivial(); // expected-warning{{private field 'trivial_initializer_' is not used}} |
Daniel Jasper | f8cc02e | 2012-06-06 08:32:04 +0000 | [diff] [blame] | 111 | Trivial non_trivial_initializer_ = Trivial(42); |
| 112 | int initialized_with_side_effect_; |
| 113 | static int static_fields_are_ignored_; |
| 114 | |
| 115 | Trivial trivial_; // expected-warning{{private field 'trivial_' is not used}} |
| 116 | Trivial user_constructor_; |
| 117 | NonTrivialConstructor non_trivial_constructor_; |
| 118 | NonTrivialDestructor non_trivial_destructor_; |
Daniel Jasper | 568eae4 | 2012-06-13 18:31:09 +0000 | [diff] [blame] | 119 | |
Daniel Jasper | 5c62ef5 | 2012-06-25 09:19:47 +0000 | [diff] [blame] | 120 | int attr_ __attribute__((unused)); |
| 121 | int attr_used_ __attribute__((unused)); |
Daniel Jasper | f8cc02e | 2012-06-06 08:32:04 +0000 | [diff] [blame] | 122 | }; |
| 123 | |
| 124 | class EverythingUsed { |
| 125 | public: |
| 126 | EverythingUsed() : as_array_index_(0), var_(by_initializer_) { |
| 127 | var_ = sizeof(sizeof_); |
| 128 | int *use = &by_reference_; |
| 129 | int test[2]; |
| 130 | test[as_array_index_] = 42; |
| 131 | } |
| 132 | |
| 133 | template<class T> |
| 134 | void useStuff(T t) { |
| 135 | by_template_function_ = 42; |
| 136 | } |
| 137 | |
| 138 | private: |
| 139 | int var_; |
| 140 | int sizeof_; |
| 141 | int by_reference_; |
| 142 | int by_template_function_; |
| 143 | int as_array_index_; |
| 144 | int by_initializer_; |
| 145 | }; |
| 146 | |
Daniel Jasper | 2dc509d | 2012-06-27 05:12:34 +0000 | [diff] [blame] | 147 | class HasFeatureTest { |
| 148 | #if __has_feature(attribute_unused_on_fields) |
| 149 | int unused_; // expected-warning{{private field 'unused_' is not used}} |
| 150 | int unused2_ __attribute__((unused)); // no-warning |
| 151 | #endif |
| 152 | }; |
| 153 | |
Daniel Jasper | 0e9e9f8 | 2012-06-14 20:56:06 +0000 | [diff] [blame] | 154 | namespace templates { |
| 155 | class B { |
| 156 | template <typename T> void f(T t); |
| 157 | int a; |
| 158 | }; |
| 159 | } // namespace templates |
| 160 | |
Daniel Jasper | f8cc02e | 2012-06-06 08:32:04 +0000 | [diff] [blame] | 161 | namespace mutual_friends { |
| 162 | // Undefined methods make mutual friends undefined. |
| 163 | class A { |
| 164 | int a; |
| 165 | friend class B; |
| 166 | void doSomethingToAOrB(); |
| 167 | }; |
| 168 | class B { |
| 169 | int b; |
| 170 | friend class A; |
| 171 | }; |
| 172 | |
| 173 | // Undefined friends do not make a mutual friend undefined. |
| 174 | class C { |
| 175 | int c; |
| 176 | void doSomethingElse() {} |
| 177 | friend class E; |
| 178 | friend class D; |
| 179 | }; |
| 180 | class D { |
| 181 | int d; // expected-warning{{private field 'd' is not used}} |
| 182 | friend class C; |
| 183 | }; |
| 184 | |
| 185 | // Undefined nested classes make mutual friends undefined. |
| 186 | class F { |
| 187 | int f; |
| 188 | class G; |
| 189 | friend class H; |
| 190 | }; |
| 191 | class H { |
| 192 | int h; |
| 193 | friend class F; |
| 194 | }; |
| 195 | } // namespace mutual_friends |
| 196 | |
| 197 | namespace anonymous_structs_unions { |
| 198 | class A { |
| 199 | private: |
| 200 | // FIXME: Look at the DeclContext for anonymous structs/unions. |
| 201 | union { |
| 202 | int *Aligner; |
| 203 | unsigned char Data[8]; |
| 204 | }; |
| 205 | }; |
| 206 | union S { |
| 207 | private: |
| 208 | int *Aligner; |
| 209 | unsigned char Data[8]; |
| 210 | }; |
| 211 | } // namespace anonymous_structs_unions |
Nico Weber | 381767f | 2012-07-20 03:39:05 +0000 | [diff] [blame] | 212 | |
| 213 | namespace pr13413 { |
| 214 | class A { |
| 215 | A() : p_(__null), b_(false), a_(this), p2_(nullptr) {} |
| 216 | void* p_; // expected-warning{{private field 'p_' is not used}} |
| 217 | bool b_; // expected-warning{{private field 'b_' is not used}} |
| 218 | A* a_; // expected-warning{{private field 'a_' is not used}} |
| 219 | void* p2_; // expected-warning{{private field 'p2_' is not used}} |
| 220 | }; |
| 221 | } |
Richard Smith | 0b8220a | 2012-08-07 21:30:42 +0000 | [diff] [blame] | 222 | |
| 223 | namespace pr13543 { |
| 224 | void f(int); |
| 225 | void f(char); |
| 226 | struct S { |
| 227 | S() : p(&f) {} |
| 228 | private: |
| 229 | void (*p)(int); // expected-warning{{private field 'p' is not used}} |
| 230 | }; |
| 231 | |
| 232 | struct A { int n; }; |
| 233 | struct B { |
| 234 | B() : a(A()) {} |
| 235 | B(char) {} |
| 236 | B(int n) : a{n}, b{(f(n), 0)} {} |
| 237 | private: |
| 238 | A a = A(); // expected-warning{{private field 'a' is not used}} |
| 239 | A b; |
| 240 | }; |
| 241 | |
| 242 | struct X { ~X(); }; |
| 243 | class C { |
| 244 | X x[4]; // no-warning |
| 245 | }; |
| 246 | } |