142cbd782cf17223076e5b6c0607414d9d68aae19Argyrios Kyrtzidis// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function %s 2bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 3bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic void f1(); // expected-warning{{unused}} 4bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 5bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace { 6bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void f2(); // expected-warning{{unused}} 7bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 8bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void f3() { } // expected-warning{{unused}} 9bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 10bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct S { 11bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m1() { } // expected-warning{{unused}} 12bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m2(); // expected-warning{{unused}} 13bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m3(); 1406999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis S(const S&); 1506999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis void operator=(const S&); 16bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 17bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 18bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <typename T> 19bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct TS { 20bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m(); 21bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 22bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <> void TS<int>::m() { } // expected-warning{{unused}} 23bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 24bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <typename T> 25bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void tf() { } 26bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <> void tf<int>() { } // expected-warning{{unused}} 27bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 28bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct VS { 29bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis virtual void vm() { } 30bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 31bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 32bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct SVS : public VS { 33bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void vm() { } 34bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 35bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis} 36bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 37bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisvoid S::m3() { } // expected-warning{{unused}} 38bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 39bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic inline void f4() { } 40bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisconst unsigned int cx = 0; 41bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 42bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic int x1; // expected-warning{{unused}} 43bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 44bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace { 45bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis int x2; // expected-warning{{unused}} 46bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 47bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct S2 { 48bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis static int x; // expected-warning{{unused}} 49bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 50bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 51bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <typename T> 52bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct TS2 { 53bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis static int x; 54bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 55bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <> int TS2<int>::x; // expected-warning{{unused}} 56bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis} 57ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth 58ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruthnamespace PR8841 { 59ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth // Ensure that friends of class templates are considered to have a dependent 60ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth // context and not marked unused. 61ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth namespace { 62ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth template <typename T> struct X { 63ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth friend bool operator==(const X&, const X&) { return false; } 64ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth }; 65ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth } 66ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth template <typename T> void template_test(X<T> x) { 67ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth (void)(x == x); 68ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth } 69af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall void test() { 70af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall X<int> x; 71ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth template_test(x); 72ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth } 73ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth} 74af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall 75af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCallnamespace test4 { 76af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall namespace { struct A {}; } 77af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall 78af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall void test(A a); // expected-warning {{unused function}} 79af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall extern "C" void test4(A a); 80af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall} 816b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis 826b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidisnamespace rdar8733476 { 836b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis static void foo() { } // expected-warning {{not needed and will not be emitted}} 846b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis 856b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis template <int> 866b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis void bar() { 876b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis foo(); 886b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } 896b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis} 90