| // RUN: %check_clang_tidy %s modernize-use-using %t -- -- -I %S/Inputs/modernize-use-using/ |
| |
| typedef int Type; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' [modernize-use-using] |
| // CHECK-FIXES: using Type = int; |
| |
| typedef long LL; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using LL = long; |
| |
| typedef int Bla; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Bla = int; |
| |
| typedef Bla Bla2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Bla2 = Bla; |
| |
| typedef void (*type)(int, int); |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using type = void (*)(int, int); |
| |
| typedef void (*type2)(); |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using type2 = void (*)(); |
| |
| class Class { |
| typedef long long Type; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Type = long long; |
| }; |
| |
| typedef void (Class::*MyPtrType)(Bla) const; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using MyPtrType = void (Class::*)(Bla)[[ATTR:( __attribute__\(\(thiscall\)\))?]] const; |
| |
| class Iterable { |
| public: |
| class Iterator {}; |
| }; |
| |
| template <typename T> |
| class Test { |
| typedef typename T::iterator Iter; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Iter = typename T::iterator; |
| }; |
| |
| using balba = long long; |
| |
| union A {}; |
| |
| typedef void (A::*PtrType)(int, int) const; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using PtrType = void (A::*)(int, int)[[ATTR]] const; |
| |
| typedef Class some_class; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using some_class = Class; |
| |
| typedef Class Cclass; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Cclass = Class; |
| |
| typedef Cclass cclass2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using cclass2 = Cclass; |
| |
| class cclass {}; |
| |
| typedef void (cclass::*MyPtrType3)(Bla); |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using MyPtrType3 = void (cclass::*)(Bla)[[ATTR]]; |
| |
| using my_class = int; |
| |
| typedef Test<my_class *> another; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using another = Test<my_class *>; |
| |
| typedef int* PInt; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using PInt = int *; |
| |
| typedef int bla1, bla2, bla3; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:17: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-3]]:23: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using bla1 = int; |
| // CHECK-FIXES-NEXT: using bla2 = int; |
| // CHECK-FIXES-NEXT: using bla3 = int; |
| |
| #define CODE typedef int INT |
| |
| CODE; |
| // CHECK-FIXES: #define CODE typedef int INT |
| // CHECK-FIXES: CODE; |
| |
| struct Foo; |
| #define Bar Baz |
| typedef Foo Bar; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: #define Bar Baz |
| // CHECK-FIXES: using Baz = Foo; |
| |
| #define TYPEDEF typedef |
| TYPEDEF Foo Bak; |
| // CHECK-FIXES: #define TYPEDEF typedef |
| // CHECK-FIXES: TYPEDEF Foo Bak; |
| |
| #define FOO Foo |
| typedef FOO Bam; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: #define FOO Foo |
| // CHECK-FIXES: using Bam = Foo; |
| |
| typedef struct Foo Bap; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Bap = struct Foo; |
| |
| struct Foo typedef Bap2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Bap2 = struct Foo; |
| |
| Foo typedef Bap3; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Bap3 = Foo; |
| |
| typedef struct Unknown Baq; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Baq = struct Unknown; |
| |
| struct Unknown2 typedef Baw; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Baw = struct Unknown2; |
| |
| int typedef Bax; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Bax = int; |
| |
| typedef struct Q1 { int a; } S1; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S1 = struct Q1 { int a; }; |
| typedef struct { int b; } S2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S2 = struct { int b; }; |
| struct Q2 { int c; } typedef S3; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S3 = struct Q2 { int c; }; |
| struct { int d; } typedef S4; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S4 = struct { int d; }; |
| |
| namespace my_space { |
| class my_cclass {}; |
| typedef my_cclass FuncType; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using FuncType = my_cclass; |
| } |
| |
| #define lol 4 |
| typedef unsigned Map[lol]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: typedef unsigned Map[lol]; |
| |
| typedef void (*fun_type)(); |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using fun_type = void (*)(); |
| |
| namespace template_instantiations { |
| template <typename T> |
| class C { |
| protected: |
| typedef C<T> super; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using super = C<T>; |
| virtual void f(); |
| |
| public: |
| virtual ~C(); |
| }; |
| |
| class D : public C<D> { |
| void f() override { super::f(); } |
| }; |
| class E : public C<E> { |
| void f() override { super::f(); } |
| }; |
| } |
| |
| template <typename T1, typename T2> |
| class TwoArgTemplate { |
| typedef TwoArgTemplate<T1, T2> self; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using self = TwoArgTemplate<T1, T2>; |
| }; |
| |
| template <bool B, typename T> |
| struct S {}; |
| |
| typedef S<(0 > 0), int> S_t, *S_p; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:28: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S_t = S<(0 > 0), int>; |
| // CHECK-FIXES-NEXT: using S_p = S_t*; |
| |
| typedef S<(0 < 0), int> S2_t, *S2_p; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:29: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S2_t = S<(0 < 0), int>; |
| // CHECK-FIXES-NEXT: using S2_p = S2_t*; |
| |
| typedef S<(0 > 0 && (3 > 1) && (1 < 1)), int> S3_t; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using S3_t = S<(0 > 0 && (3 > 1) && (1 < 1)), int>; |
| |
| template <bool B> |
| struct Q {}; |
| |
| constexpr bool b[1] = {true}; |
| |
| typedef Q<b[0 < 0]> Q_t, *Q_p; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:24: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Q_t = Q<b[0 < 0]>; |
| // CHECK-FIXES-NEXT: using Q_p = Q_t*; |
| |
| typedef Q<b[0 < 0]> Q2_t; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Q2_t = Q<b[0 < 0]>; |
| |
| struct T { |
| constexpr T(bool) {} |
| |
| static constexpr bool b = true; |
| }; |
| |
| typedef Q<T{0 < 0}.b> Q3_t, *Q3_p; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:27: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Q3_t = Q<T{0 < 0}.b>; |
| // CHECK-FIXES-NEXT: using Q3_p = Q3_t*; |
| |
| typedef Q<T{0 < 0}.b> Q3_t; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Q3_t = Q<T{0 < 0}.b>; |
| |
| typedef TwoArgTemplate<TwoArgTemplate<int, Q<T{0 < 0}.b> >, S<(0 < 0), Q<b[0 < 0]> > > Nested_t; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Nested_t = TwoArgTemplate<TwoArgTemplate<int, Q<T{0 < 0}.b>>, S<(0 < 0), Q<b[0 < 0]>>>; |
| |
| template <typename a> |
| class TemplateKeyword { |
| typedef typename a::template b<> d; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using d = typename a::template b<>; |
| |
| typedef typename a::template b<>::c d2; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using d2 = typename a::template b<>::c; |
| }; |
| |
| template <typename... Args> |
| class Variadic {}; |
| |
| typedef Variadic<Variadic<int, bool, Q<T{0 < 0}.b> >, S<(0 < 0), Variadic<Q<b[0 < 0]> > > > Variadic_t; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Variadic_t = Variadic<Variadic<int, bool, Q<T{0 < 0}.b>>, S<(0 < 0), Variadic<Q<b[0 < 0]>>>> |
| |
| typedef Variadic<Variadic<int, bool, Q<T{0 < 0}.b> >, S<(0 < 0), Variadic<Q<b[0 < 0]> > > > Variadic_t, *Variadic_p; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:103: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using Variadic_t = Variadic<Variadic<int, bool, Q<T{0 < 0}.b>>, S<(0 < 0), Variadic<Q<b[0 < 0]>>>>; |
| // CHECK-FIXES-NEXT: using Variadic_p = Variadic_t*; |
| |
| typedef struct { int a; } R_t, *R_p; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-MESSAGES: :[[@LINE-2]]:30: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using R_t = struct { int a; }; |
| // CHECK-FIXES-NEXT: using R_p = R_t*; |
| |
| typedef enum { ea1, eb1 } EnumT1; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using EnumT1 = enum { ea1, eb1 }; |
| |
| #include "modernize-use-using.h" |
| |
| typedef enum { ea2, eb2 } EnumT2_CheckTypedefImpactFromAnotherFile; |
| // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using EnumT2_CheckTypedefImpactFromAnotherFile = enum { ea2, eb2 }; |
| |
| template <int A> |
| struct InjectedClassName { |
| typedef InjectedClassName b; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using b = InjectedClassName; |
| }; |
| |
| template <int> |
| struct InjectedClassNameWithUnnamedArgument { |
| typedef InjectedClassNameWithUnnamedArgument b; |
| // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use 'using' instead of 'typedef' |
| // CHECK-FIXES: using b = InjectedClassNameWithUnnamedArgument; |
| }; |