1 // RUN: %clang_cc1 -fsyntax-only -Wunused-private-field -Wused-but-marked-unused -verify -std=c++11 %s 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; 96 attr_used_ = 42; // expected-warning{{'attr_used_' was marked unused but was used}} 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(); 110 Trivial trivial_initializer_ = Trivial(); // expected-warning{{private field 'trivial_initializer_' is not used}} 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_; 119 120 int attr_ __attribute__((unused)); 121 int attr_used_ __attribute__((unused)); 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 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 154 namespace templates { 155 class B { 156 template <typename T> void f(T t); 157 int a; 158 }; 159 } // namespace templates 160 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 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 } 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 } 247