xref: /aosp_15_r20/external/clang/test/SemaTemplate/dependent-expr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // expected-no-diagnostics
3*67e74705SXin Li 
4*67e74705SXin Li // PR5908
5*67e74705SXin Li template <typename Iterator>
Test(Iterator it)6*67e74705SXin Li void Test(Iterator it) {
7*67e74705SXin Li   *(it += 1);
8*67e74705SXin Li }
9*67e74705SXin Li 
10*67e74705SXin Li namespace PR6045 {
11*67e74705SXin Li   template<unsigned int r>
12*67e74705SXin Li   class A
13*67e74705SXin Li   {
14*67e74705SXin Li     static const unsigned int member = r;
15*67e74705SXin Li     void f();
16*67e74705SXin Li   };
17*67e74705SXin Li 
18*67e74705SXin Li   template<unsigned int r>
19*67e74705SXin Li   const unsigned int A<r>::member;
20*67e74705SXin Li 
21*67e74705SXin Li   template<unsigned int r>
f()22*67e74705SXin Li   void A<r>::f()
23*67e74705SXin Li   {
24*67e74705SXin Li     unsigned k;
25*67e74705SXin Li     (void)(k % member);
26*67e74705SXin Li   }
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li namespace PR7198 {
30*67e74705SXin Li   struct A
31*67e74705SXin Li   {
~APR7198::A32*67e74705SXin Li     ~A() { }
33*67e74705SXin Li   };
34*67e74705SXin Li 
35*67e74705SXin Li   template<typename T>
36*67e74705SXin Li   struct B {
37*67e74705SXin Li     struct C : A {};
fPR7198::B38*67e74705SXin Li     void f()
39*67e74705SXin Li     {
40*67e74705SXin Li       C c = C();
41*67e74705SXin Li     }
42*67e74705SXin Li   };
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li namespace PR7724 {
myMethod()46*67e74705SXin Li   template<typename OT> int myMethod()
47*67e74705SXin Li   { return 2 && sizeof(OT); }
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li namespace test4 {
addressof(T & v)51*67e74705SXin Li   template <typename T> T *addressof(T &v) {
52*67e74705SXin Li     return reinterpret_cast<T*>(
53*67e74705SXin Li              &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
54*67e74705SXin Li   }
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li namespace test5 {
58*67e74705SXin Li   template <typename T> class chained_map {
59*67e74705SXin Li     int k;
lookup() const60*67e74705SXin Li     void lookup() const {
61*67e74705SXin Li       int &v = (int &)k;
62*67e74705SXin Li     }
63*67e74705SXin Li   };
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace PR8795 {
test(_CharT t)67*67e74705SXin Li   template <class _CharT> int test(_CharT t)
68*67e74705SXin Li   {
69*67e74705SXin Li     int data [] = {
70*67e74705SXin Li       sizeof(_CharT) > sizeof(char)
71*67e74705SXin Li     };
72*67e74705SXin Li     return data[0];
73*67e74705SXin Li   }
74*67e74705SXin Li }
75*67e74705SXin Li 
76*67e74705SXin Li template<typename T> struct CastDependentIntToPointer {
fCastDependentIntToPointer77*67e74705SXin Li   static void* f() {
78*67e74705SXin Li     T *x;
79*67e74705SXin Li     return ((void*)(((unsigned long)(x)|0x1ul)));
80*67e74705SXin Li   }
81*67e74705SXin Li };
82*67e74705SXin Li 
83*67e74705SXin Li // Regression test for crasher in r194540.
84*67e74705SXin Li namespace PR10837 {
85*67e74705SXin Li   typedef void t(int);
86*67e74705SXin Li   template<typename> struct A {
87*67e74705SXin Li     void f();
88*67e74705SXin Li     static t g;
89*67e74705SXin Li   };
90*67e74705SXin Li   t *p;
f()91*67e74705SXin Li   template<typename T> void A<T>::f() {
92*67e74705SXin Li     p = g;
93*67e74705SXin Li   }
94*67e74705SXin Li   template struct A<int>;
95*67e74705SXin Li }
96*67e74705SXin Li 
97*67e74705SXin Li namespace PR18152 {
98*67e74705SXin Li   template<int N> struct A {
99*67e74705SXin Li     static const int n = {N};
100*67e74705SXin Li   };
101*67e74705SXin Li   template struct A<0>;
102*67e74705SXin Li }
103