1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -Wno-c++11-extensions -std=c++98 %s 2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify -Wunused -Wunused-member-function -Wno-unused-local-typedefs -std=c++11 %s 3bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 439bd371610af27b073c792c54c6c28133329f6adEli Friedman#ifdef HEADER 539bd371610af27b073c792c54c6c28133329f6adEli Friedman 639bd371610af27b073c792c54c6c28133329f6adEli Friedmanstatic void headerstatic() {} // expected-warning{{unused}} 739bd371610af27b073c792c54c6c28133329f6adEli Friedmanstatic inline void headerstaticinline() {} 839bd371610af27b073c792c54c6c28133329f6adEli Friedman 939bd371610af27b073c792c54c6c28133329f6adEli Friedmannamespace { 1039bd371610af27b073c792c54c6c28133329f6adEli Friedman void headeranon() {} // expected-warning{{unused}} 1139bd371610af27b073c792c54c6c28133329f6adEli Friedman inline void headerinlineanon() {} 1239bd371610af27b073c792c54c6c28133329f6adEli Friedman} 1339bd371610af27b073c792c54c6c28133329f6adEli Friedman 1439bd371610af27b073c792c54c6c28133329f6adEli Friedmannamespace test7 1539bd371610af27b073c792c54c6c28133329f6adEli Friedman{ 1639bd371610af27b073c792c54c6c28133329f6adEli Friedman template<typename T> 1739bd371610af27b073c792c54c6c28133329f6adEli Friedman static inline void foo(T) { } 1839bd371610af27b073c792c54c6c28133329f6adEli Friedman 1939bd371610af27b073c792c54c6c28133329f6adEli Friedman // This should not emit an unused-function warning since it inherits 2039bd371610af27b073c792c54c6c28133329f6adEli Friedman // the static storage type from the base template. 2139bd371610af27b073c792c54c6c28133329f6adEli Friedman template<> 2239bd371610af27b073c792c54c6c28133329f6adEli Friedman inline void foo(int) { } 2339bd371610af27b073c792c54c6c28133329f6adEli Friedman 2439bd371610af27b073c792c54c6c28133329f6adEli Friedman // Partial specialization 2539bd371610af27b073c792c54c6c28133329f6adEli Friedman template<typename T, typename U> 2639bd371610af27b073c792c54c6c28133329f6adEli Friedman static inline void bar(T, U) { } 2739bd371610af27b073c792c54c6c28133329f6adEli Friedman 2839bd371610af27b073c792c54c6c28133329f6adEli Friedman template<typename U> 2939bd371610af27b073c792c54c6c28133329f6adEli Friedman inline void bar(int, U) { } 3039bd371610af27b073c792c54c6c28133329f6adEli Friedman 3139bd371610af27b073c792c54c6c28133329f6adEli Friedman template<> 3239bd371610af27b073c792c54c6c28133329f6adEli Friedman inline void bar(int, int) { } 3339bd371610af27b073c792c54c6c28133329f6adEli Friedman}; 3439bd371610af27b073c792c54c6c28133329f6adEli Friedman 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace pr19713 { 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus >= 201103L 376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static constexpr int constexpr1() { return 1; } 386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines constexpr int constexpr2() { return 2; } 396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4239bd371610af27b073c792c54c6c28133329f6adEli Friedman#else 4339bd371610af27b073c792c54c6c28133329f6adEli Friedman#define HEADER 4439bd371610af27b073c792c54c6c28133329f6adEli Friedman#include "warn-unused-filescoped.cpp" 4539bd371610af27b073c792c54c6c28133329f6adEli Friedman 46bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic void f1(); // expected-warning{{unused}} 47bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 48bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace { 49bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void f2(); // expected-warning{{unused}} 50bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 51bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void f3() { } // expected-warning{{unused}} 52bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 53bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct S { 54bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m1() { } // expected-warning{{unused}} 55bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m2(); // expected-warning{{unused}} 56bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m3(); 5706999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis S(const S&); 5806999f8ff61de3c63a52871bd7ac61e7ada9180bArgyrios Kyrtzidis void operator=(const S&); 59bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 60bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 61bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <typename T> 62bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct TS { 63bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void m(); 64bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 65bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <> void TS<int>::m() { } // expected-warning{{unused}} 66bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 67bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <typename T> 68bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void tf() { } 69bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <> void tf<int>() { } // expected-warning{{unused}} 70bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 71bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct VS { 72bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis virtual void vm() { } 73bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 74bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 75bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct SVS : public VS { 76bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis void vm() { } 77bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 78bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis} 79bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 80bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisvoid S::m3() { } // expected-warning{{unused}} 81bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 8239bd371610af27b073c792c54c6c28133329f6adEli Friedmanstatic inline void f4() { } // expected-warning{{unused}} 8339bd371610af27b073c792c54c6c28133329f6adEli Friedmanconst unsigned int cx = 0; // expected-warning{{unused}} 8439bd371610af27b073c792c54c6c28133329f6adEli Friedmanconst unsigned int cy = 0; 8539bd371610af27b073c792c54c6c28133329f6adEli Friedmanint f5() { return cy; } 86bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 87bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisstatic int x1; // expected-warning{{unused}} 88bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 89bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidisnamespace { 90bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis int x2; // expected-warning{{unused}} 91bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 92bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct S2 { 93bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis static int x; // expected-warning{{unused}} 94bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 95bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 96bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <typename T> 97bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis struct TS2 { 98bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis static int x; 99bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis }; 100bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis template <> int TS2<int>::x; // expected-warning{{unused}} 101bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis} 102ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth 103ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruthnamespace PR8841 { 104ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth // Ensure that friends of class templates are considered to have a dependent 105ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth // context and not marked unused. 106ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth namespace { 107ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth template <typename T> struct X { 108ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth friend bool operator==(const X&, const X&) { return false; } 109ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth }; 110ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth } 111ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth template <typename T> void template_test(X<T> x) { 112ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth (void)(x == x); 113ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth } 114af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall void test() { 115af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall X<int> x; 116ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth template_test(x); 117ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth } 118ef9d09c4699a2a61d6f28b59b7583b2b28c0a531Chandler Carruth} 119af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall 120af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCallnamespace test4 { 121af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall namespace { struct A {}; } 122af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall 123af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall void test(A a); // expected-warning {{unused function}} 124af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall extern "C" void test4(A a); 125af8ca37a7fa45bff84831706c6d85f9e5b4e1d15John McCall} 1266b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis 1276b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidisnamespace rdar8733476 { 1286b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis static void foo() { } // expected-warning {{not needed and will not be emitted}} 1296b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis 1306b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis template <int> 1316b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis void bar() { 1326b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis foo(); 1336b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } 1346b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis} 135623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith 136623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smithnamespace test5 { 137623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith static int n = 0; 138623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith static int &r = n; 139623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith int f(int &); 140623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith int k = f(r); 141623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith 142c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith // FIXME: We should produce warnings for both of these. 143c36e3596be351a557cc81c8db3ea75fa4bd54c7aRichard Smith static const int m = n; 144623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith int x = sizeof(m); 14539bd371610af27b073c792c54c6c28133329f6adEli Friedman static const double d = 0.0; // expected-warning{{not needed and will not be emitted}} 146623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith int y = sizeof(d); 147623ef4bf31bc5ec14ed9b5645921a0a2e0d00ee4Richard Smith} 14866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie 14966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace unused_nested { 15066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie class outer { 15166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie void func1(); 15266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie struct { 15366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie void func2() { 15466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie } 15566cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie } x; 15666cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie }; 15766cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie} 15866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie 15966cff7257698d5528632917d38f9a3037bb1506dDavid Blaikienamespace unused { 16066cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie struct { 16166cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie void func() { // expected-warning {{unused member function}} 16266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie } 16366cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie } x; // expected-warning {{unused variable}} 16466cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie} 16587b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola 16687b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindolanamespace test6 { 16787b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola typedef struct { 16887b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola void bar(); 16987b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola } A; 17087b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola 17187b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola typedef struct { 17287b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola void bar(); // expected-warning {{unused member function 'bar'}} 17387b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola } *B; 17487b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola 17587b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola struct C { 17687b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola void bar(); 17787b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola }; 17887b8127c2c65c8229e5b874c10a33f1ce13493adRafael Espindola} 1796769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola 1806769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindolanamespace pr14776 { 1816769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola namespace { 1826769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola struct X {}; 1836769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola } 1846769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola X a = X(); // expected-warning {{unused variable 'a'}} 1856769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola auto b = X(); // expected-warning {{unused variable 'b'}} 1866769ccb6853871c085c8366ab5e993841ad56d00Rafael Espindola} 18739bd371610af27b073c792c54c6c28133329f6adEli Friedman 1881507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedmannamespace UndefinedInternalStaticMember { 1891507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman namespace { 1901507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman struct X { 1911507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman static const unsigned x = 3; 1921507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman int y[x]; 1931507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman }; 1941507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman } 1951507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman} 1961507bf55c958bdd4b14a3ee49f66af874f179cf2Eli Friedman 197101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolanamespace test8 { 198101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolastatic void func(); 199101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolavoid bar() { void func() __attribute__((used)); } 200101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindolastatic void func() {} 201101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindola} 202101e9dc388c92d1e58bf977ff9697572cbe8b422Rafael Espindola 2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace pr19713 { 2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#if __cplusplus >= 201103L 2056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: We should warn on both of these. 2066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static constexpr int constexpr3() { return 1; } // expected-warning {{unused}} 2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines constexpr int constexpr4() { return 2; } 2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 21139bd371610af27b073c792c54c6c28133329f6adEli Friedman#endif 212