diff options
Diffstat (limited to 'test/SemaCXX/warn-unused-local-typedef.cpp')
-rw-r--r-- | test/SemaCXX/warn-unused-local-typedef.cpp | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/test/SemaCXX/warn-unused-local-typedef.cpp b/test/SemaCXX/warn-unused-local-typedef.cpp new file mode 100644 index 0000000..a940653 --- /dev/null +++ b/test/SemaCXX/warn-unused-local-typedef.cpp @@ -0,0 +1,242 @@ +// RUN: %clang_cc1 -fsyntax-only -Wunused-local-typedef -verify -std=c++1y %s + +struct S { + typedef int Foo; // no diag +}; + +namespace N { + typedef int Foo; // no diag + typedef int Foo2; // no diag +} + +template <class T> class Vec {}; + +typedef int global_foo; // no diag + +void f() { + typedef int foo0; // expected-warning {{unused typedef 'foo0'}} + using foo0alias = int ; // expected-warning {{unused type alias 'foo0alias'}} + + typedef int foo1 __attribute__((unused)); // no diag + + typedef int foo2; + { + typedef int foo2; // expected-warning {{unused typedef 'foo2'}} + } + typedef foo2 foo3; // expected-warning {{unused typedef 'foo3'}} + + typedef int foo2_2; // expected-warning {{unused typedef 'foo2_2'}} + { + typedef int foo2_2; + typedef foo2_2 foo3_2; // expected-warning {{unused typedef 'foo3_2'}} + } + + typedef int foo4; + foo4 the_thing; + + typedef int* foo5; + typedef foo5* foo6; // no diag + foo6 *myptr; + + struct S2 { + typedef int Foo; // no diag + typedef int Foo2; // expected-warning {{unused typedef 'Foo2'}} + + struct Deeper { + typedef int DeepFoo; // expected-warning {{unused typedef 'DeepFoo'}} + }; + }; + + S2::Foo s2foo; + + typedef struct {} foostruct; // expected-warning {{unused typedef 'foostruct'}} + + typedef struct {} foostruct2; // no diag + foostruct2 fs2; + + typedef int vecint; // no diag + Vec<vecint> v; + + N::Foo nfoo; + + typedef int ConstExprInt; + static constexpr int a = (ConstExprInt)4; +} + +int printf(char const *, ...); + +void test() { + typedef signed long int superint; // no diag + printf("%f", (superint) 42); + + typedef signed long int superint2; // no diag + printf("%f", static_cast<superint2>(42)); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-local-typedef" + typedef int trungl_bot_was_here; // no diag +#pragma clang diagnostic pop + + typedef int foo; // expected-warning {{unused typedef 'foo'}} +} + +template <class T> +void template_fun(T t) { + typedef int foo; // expected-warning {{unused typedef 'foo'}} + typedef int bar; // no-diag + bar asdf; + + struct S2 { + typedef int Foo; // no diag + + typedef int Foo2; // expected-warning {{unused typedef 'Foo2'}} + + typedef int Foo3; // no diag + }; + + typename S2::Foo s2foo; + typename T::Foo s3foo; + + typedef typename S2::Foo3 TTSF; // expected-warning {{unused typedef 'TTSF'}} +} +void template_fun_user() { + struct Local { + typedef int Foo; // no-diag + typedef int Bar; // expected-warning {{unused typedef 'Bar'}} + } p; + template_fun(p); +} + +void typedef_in_nested_name() { + typedef struct { + typedef int Foo; + } A; + A::Foo adsf; + + using A2 = struct { + typedef int Foo; + }; + A2::Foo adsf2; +} + +auto sneaky() { + struct S { + // Local typedefs can be used after the scope they were in has closed: + typedef int t; + + // Even if they aren't, this could be an inline function that could be used + // in another TU, so this shouldn't warn either: + typedef int s; + + private: + typedef int p; // expected-warning{{unused typedef 'p'}} + }; + return S(); +} +auto x = sneaky(); +decltype(x)::t y; + +static auto static_sneaky() { + struct S { + typedef int t; + // This function has internal linkage, so we can warn: + typedef int s; // expected-warning {{unused typedef 's'}} + }; + return S(); +} +auto sx = static_sneaky(); +decltype(sx)::t sy; + +auto sneaky_with_friends() { + struct S { + private: + friend class G; + // Can't warn if we have friends: + typedef int p; + }; + return S(); +} + +namespace { +auto nstatic_sneaky() { + struct S { + typedef int t; + // This function has internal linkage, so we can warn: + typedef int s; // expected-warning {{unused typedef 's'}} + }; + return S(); +} +auto nsx = nstatic_sneaky(); +decltype(nsx)::t nsy; +} + +// Like sneaky(), but returning pointer to local type +template<typename T> +struct remove_reference { typedef T type; }; +template<typename T> struct remove_reference<T&> { typedef T type; }; +auto pointer_sneaky() { + struct S { + typedef int t; + typedef int s; + }; + return (S*)nullptr; +} +remove_reference<decltype(*pointer_sneaky())>::type::t py; + +// Like sneaky(), but returning templated struct referencing local type. +template <class T> struct container { int a; T t; }; +auto template_sneaky() { + struct S { + typedef int t; + typedef int s; + }; + return container<S>(); +} +auto tx = template_sneaky(); +decltype(tx.t)::t ty; + +// Like sneaky(), but doing its sneakiness by returning a member function +// pointer. +auto sneaky_memfun() { + struct S { + typedef int type; + int n; + }; + return &S::n; +} + +template <class T> void sneaky_memfun_g(int T::*p) { + typename T::type X; +} + +void sneaky_memfun_h() { + sneaky_memfun_g(sneaky_memfun()); +} + +void typedefs_in_constructors() { + struct A {}; + struct B : public A { + // Neither of these two should warn: + typedef A INHERITED; + B() : INHERITED() {} + + typedef B SELF; + B(int) : SELF() {} + }; +} + +void *operator new(__SIZE_TYPE__, void *p) throw() { return p; } +void placement_new_and_delete() { + struct MyStruct { }; + char memory[sizeof(MyStruct)]; + void *p = memory; + + typedef MyStruct A_t1; + MyStruct *a = new (p) A_t1(); + + typedef MyStruct A_t2; + a->~A_t2(); +} + +// This should not disable any warnings: +#pragma clang diagnostic ignored "-Wunused-local-typedef" |