1 // RUN: %check_clang_tidy -check-suffix=0-0 %s modernize-use-auto %t  -- -config="{CheckOptions: [{key: modernize-use-auto.RemoveStars, value: 0}, {key: modernize-use-auto.MinTypeNameLength, value: 0}]}" -- --std=c++11 -frtti
2 // RUN: %check_clang_tidy -check-suffix=0-8 %s modernize-use-auto %t  -- -config="{CheckOptions: [{key: modernize-use-auto.RemoveStars, value: 0}, {key: modernize-use-auto.MinTypeNameLength, value: 8}]}" -- --std=c++11 -frtti
3 // RUN: %check_clang_tidy -check-suffix=1-0 %s modernize-use-auto %t  -- -config="{CheckOptions: [{key: modernize-use-auto.RemoveStars, value: 1}, {key: modernize-use-auto.MinTypeNameLength, value: 0}]}" -- --std=c++11 -frtti
4 // RUN: %check_clang_tidy -check-suffix=1-8 %s modernize-use-auto %t  -- -config="{CheckOptions: [{key: modernize-use-auto.RemoveStars, value: 1}, {key: modernize-use-auto.MinTypeNameLength, value: 8}]}" -- --std=c++11 -frtti
5 
6 template <class T> extern T foo();
PP7 template <class T> struct P {  explicit P(T t) : t_(t) {}  T t_;};
8 template <class T> P<T> *foo_ptr();
9 template <class T> P<T> &foo_ref();
10 
bar()11 int bar() {
12   {
13     // Lenth(long) = 4
14     long i = static_cast<long>(foo<long>());
15     // CHECK-FIXES-0-0: auto i = {{.*}}
16     // CHECK-FIXES-0-8: long i = {{.*}}
17     // CHECK-FIXES-1-0: auto  i = {{.*}}
18     // CHECK-FIXES-1-8: long i = {{.*}}
19     const long ci = static_cast<long>(foo<const long>());
20     // CHECK-FIXES-0-0: auto ci = {{.*}}
21     // CHECK-FIXES-0-8: long ci = {{.*}}
22     // CHECK-FIXES-1-0: auto  ci = {{.*}}
23     // CHECK-FIXES-1-8: long ci = {{.*}}
24     long *pi = static_cast<long *>(foo<long *>());
25     // CHECK-FIXES-0-0: auto *pi = {{.*}}
26     // CHECK-FIXES-0-8: long *pi = {{.*}}
27     // CHECK-FIXES-1-0: auto pi = {{.*}}
28     // CHECK-FIXES-1-8: long *pi = {{.*}}
29 
30     // Length(long       *) is still 5
31     long      *     pi2 = static_cast<long *>(foo<long *>());
32     // CHECK-FIXES-0-0: auto      *     pi2 = {{.*}}
33     // CHECK-FIXES-0-8: long      *     pi2 = {{.*}}
34     // CHECK-FIXES-1-0: auto      pi2 = {{.*}}
35     // CHECK-FIXES-1-8: long      *     pi2 = {{.*}}
36 
37     // Length(long **) = 6
38     long **ppi = static_cast<long **>(foo<long **>());
39     // CHECK-FIXES-0-0: auto **ppi = {{.*}}
40     // CHECK-FIXES-0-8: long **ppi = {{.*}}
41     // CHECK-FIXES-1-0: auto ppi = {{.*}}
42     // CHECK-FIXES-1-8: long **ppi = {{.*}}
43   }
44 
45   {
46     // Lenth(long int) = 4 + 1 + 3 = 8
47     // Lenth(long        int) is still 8
48     long int i = static_cast<long int>(foo<long int>());
49     // CHECK-FIXES-0-0: auto i = {{.*}}
50     // CHECK-FIXES-0-8: auto i = {{.*}}
51     // CHECK-FIXES-1-0: auto  i = {{.*}}
52     // CHECK-FIXES-1-8: auto  i = {{.*}}
53 
54     long int *pi = static_cast<long int *>(foo<long int *>());
55     // CHECK-FIXES-0-0: auto *pi = {{.*}}
56     // CHECK-FIXES-0-8: auto *pi = {{.*}}
57     // CHECK-FIXES-1-0: auto pi = {{.*}}
58     // CHECK-FIXES-1-8: auto pi = {{.*}}
59   }
60 
61   // Templates
62   {
63     // Length(P<long>) = 7
64     P<long>& i = static_cast<P<long>&>(foo_ref<long>());
65     // CHECK-FIXES-0-0: auto& i = {{.*}}
66     // CHECK-FIXES-0-8: P<long>& i = {{.*}}
67     // CHECK-FIXES-1-0: auto & i = {{.*}}
68     // CHECK-FIXES-1-8: P<long>& i = {{.*}}
69 
70     // Length(P<long*>) = 8
71     P<long*>& pi = static_cast<P<long*> &>(foo_ref<long*>());
72     // CHECK-FIXES-0-0: auto& pi = {{.*}}
73     // CHECK-FIXES-0-8: auto& pi = {{.*}}
74     // CHECK-FIXES-1-0: auto & pi = {{.*}}
75     // CHECK-FIXES-1-8: auto & pi = {{.*}}
76 
77     P<long>* pi2 = static_cast<P<long>*>(foo_ptr<long>());
78     // CHECK-FIXES-0-0: auto* pi2 = {{.*}}
79     // CHECK-FIXES-0-8: P<long>* pi2 = {{.*}}
80     // CHECK-FIXES-1-0: auto  pi2 = {{.*}}
81     // CHECK-FIXES-1-8: auto  pi2 = {{.*}}
82   }
83 
84   return 1;
85 }
86