brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.7 KiB · e7130a2 Raw
260 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -Wunused-local-typedef -verify -std=c++1y %s2 3struct S {4  typedef int Foo;  // no diag5};6 7namespace N {8  typedef int Foo;  // no diag9  typedef int Foo2;  // no diag10}11 12template <class T> class Vec {};13 14typedef int global_foo;  // no diag15 16void f() {17  typedef int foo0;  // expected-warning {{unused typedef 'foo0'}}18  using foo0alias = int ;  // expected-warning {{unused type alias 'foo0alias'}}19 20  typedef int foo1 __attribute__((unused));  // no diag21 22  typedef int foo2;23  {24    typedef int foo2;  // expected-warning {{unused typedef 'foo2'}}25  }26  typedef foo2 foo3; // expected-warning {{unused typedef 'foo3'}}27 28  typedef int foo2_2;  // expected-warning {{unused typedef 'foo2_2'}}29  {30    typedef int foo2_2;31    typedef foo2_2 foo3_2; // expected-warning {{unused typedef 'foo3_2'}}32  }33 34  typedef int foo4;35  foo4 the_thing;36 37  typedef int* foo5;38  typedef foo5* foo6;  // no diag39  foo6 *myptr;40 41  struct S2 {42    typedef int Foo; // no diag43    typedef int Foo2; // expected-warning {{unused typedef 'Foo2'}}44 45    struct Deeper {46      typedef int DeepFoo;  // expected-warning {{unused typedef 'DeepFoo'}}47    };48  };49 50  S2::Foo s2foo;51 52  typedef struct {} foostruct; // expected-warning {{unused typedef 'foostruct'}}53 54  typedef struct {} foostruct2; // no diag55  foostruct2 fs2;56 57  typedef int vecint;  // no diag58  Vec<vecint> v;59 60  N::Foo nfoo;61 62  typedef int ConstExprInt;63  static constexpr int a = (ConstExprInt)4;64}65 66int printf(char const *, ...);67 68void test() {69  typedef signed long int superint; // no diag70  printf("%ld", (superint)42);71 72  typedef signed long int superint2; // no diag73  printf("%ld", static_cast<superint2>(42));74 75#pragma clang diagnostic push76#pragma clang diagnostic ignored "-Wunused-local-typedef"77  typedef int trungl_bot_was_here; // no diag78#pragma clang diagnostic pop79 80  typedef int foo; // expected-warning {{unused typedef 'foo'}}81}82 83template <class T>84void template_fun(T t) {85  typedef int foo; // expected-warning {{unused typedef 'foo'}}86  typedef int bar; // no-diag87  bar asdf;88 89  struct S2 {90    typedef int Foo; // no diag91 92    typedef int Foo2; // expected-warning {{unused typedef 'Foo2'}}93 94    typedef int Foo3; // no diag95  };96 97  typename S2::Foo s2foo;98  typename T::Foo s3foo;99 100  typedef typename S2::Foo3 TTSF;  // expected-warning {{unused typedef 'TTSF'}}101}102void template_fun_user() {103  struct Local {104    typedef int Foo; // no-diag105    typedef int Bar; // expected-warning {{unused typedef 'Bar'}}106  } p;107  template_fun(p);108}109 110void typedef_in_nested_name() {111  typedef struct { // expected-warning {{add a tag name}}112    typedef int Foo; // expected-note {{}}113  } A; // expected-note {{}}114  A::Foo adsf;115 116  using A2 = struct { // expected-warning {{add a tag name}} expected-note {{this alias declaration}}117    typedef int Foo; // expected-note {{}}118  };119  A2::Foo adsf2;120}121 122auto sneaky() {123  struct S {124    // Local typedefs can be used after the scope they were in has closed:125    typedef int t;126 127    // Even if they aren't, this could be an inline function that could be used128    // in another TU, so this shouldn't warn either:129    typedef int s;130 131  private:132    typedef int p; // expected-warning{{unused typedef 'p'}}133  };134  return S();135}136auto x = sneaky();137decltype(x)::t y;138 139static auto static_sneaky() {140  struct S {141    typedef int t;142    // This function has internal linkage, so we can warn:143    typedef int s; // expected-warning {{unused typedef 's'}}144  };145  return S();146}147auto sx = static_sneaky();148decltype(sx)::t sy;149 150auto sneaky_with_friends() {151  struct S {152  private:153    friend class G;154    // Can't warn if we have friends:155    typedef int p;156  };157  return S();158}159 160namespace {161auto nstatic_sneaky() {162  struct S {163    typedef int t;164    // This function has internal linkage, so we can warn:165    typedef int s; // expected-warning {{unused typedef 's'}}166  };167  return S();168}169auto nsx = nstatic_sneaky();170decltype(nsx)::t nsy;171}172 173// Like sneaky(), but returning pointer to local type174template<typename T>175struct remove_reference { typedef T type; };176template<typename T> struct remove_reference<T&> { typedef T type; };177auto pointer_sneaky() {178  struct S {179    typedef int t;180    typedef int s;181  };182  return (S*)nullptr;183}184remove_reference<decltype(*pointer_sneaky())>::type::t py;185 186// Like sneaky(), but returning templated struct referencing local type.187template <class T> struct container { int a; T t; };188auto template_sneaky() {189  struct S {190    typedef int t;191    typedef int s;192  };193  return container<S>();194}195auto tx = template_sneaky();196decltype(tx.t)::t ty;197 198// Like sneaky(), but doing its sneakiness by returning a member function199// pointer.200auto sneaky_memfun() {201  struct S {202    typedef int type;203    int n;204  };205  return &S::n;206}207 208template <class T> void sneaky_memfun_g(int T::*p) {209  typename T::type X;210}211 212void sneaky_memfun_h() {213  sneaky_memfun_g(sneaky_memfun());214}215 216void typedefs_in_constructors() {217  struct A {};218  struct B : public A {219    // Neither of these two should warn:220    typedef A INHERITED;221    B() : INHERITED() {}222 223    typedef B SELF;224    B(int) : SELF() {}225  };226}227 228void *operator new(__SIZE_TYPE__, void *p) throw() { return p; }229void placement_new_and_delete() {230  struct MyStruct { };231  char memory[sizeof(MyStruct)];232  void *p = memory;233 234  typedef MyStruct A_t1;235  MyStruct *a = new (p) A_t1();236 237  typedef MyStruct A_t2;238  a->~A_t2();239}240 241namespace TypedefInLocalClassOfAMemberOfTemplateClass {242template<typename> struct A {243  void foo() {244    struct Inner {245      typedef int Int; // no-diag246      typedef char Char; // expected-warning {{unused typedef 'Char'}}247      Int m;248    } b;249  }250};251 252void foo() {253  A<int> x;254  x.foo();255}256} // TypedefInLocalClassOfTemplateClassMember257 258// This should not disable any warnings:259#pragma clang diagnostic ignored "-Wunused-local-typedef"260