xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-function-2.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li template <typename T> struct S {
SS6*67e74705SXin Li   S() { }
7*67e74705SXin Li   S(T t);
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li template struct S<int>;
11*67e74705SXin Li 
f()12*67e74705SXin Li void f() {
13*67e74705SXin Li   S<int> s1;
14*67e74705SXin Li   S<int> s2(10);
15*67e74705SXin Li }
16*67e74705SXin Li 
17*67e74705SXin Li namespace PR7184 {
18*67e74705SXin Li   template<typename T>
f()19*67e74705SXin Li   void f() {
20*67e74705SXin Li     typedef T type;
21*67e74705SXin Li     void g(int array[sizeof(type)]);
22*67e74705SXin Li   }
23*67e74705SXin Li 
24*67e74705SXin Li   template void f<int>();
25*67e74705SXin Li }
26*67e74705SXin Li 
27*67e74705SXin Li namespace UsedAttr {
28*67e74705SXin Li   template<typename T>
foo()29*67e74705SXin Li   void __attribute__((used)) foo() {
30*67e74705SXin Li     T *x = 1; // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}}
31*67e74705SXin Li   }
32*67e74705SXin Li 
bar()33*67e74705SXin Li   void bar() {
34*67e74705SXin Li     foo<int>(); // expected-note{{instantiation of}}
35*67e74705SXin Li   }
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li namespace PR9654 {
39*67e74705SXin Li   typedef void ftype(int);
40*67e74705SXin Li 
41*67e74705SXin Li   template<typename T>
42*67e74705SXin Li   ftype f;
43*67e74705SXin Li 
g()44*67e74705SXin Li   void g() {
45*67e74705SXin Li     f<int>(0);
46*67e74705SXin Li   }
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li namespace AliasTagDef {
50*67e74705SXin Li   template<typename T>
f()51*67e74705SXin Li   T f() {
52*67e74705SXin Li     using S = struct {
53*67e74705SXin Li #if __cplusplus <= 199711L
54*67e74705SXin Li     // expected-warning@-2 {{alias declarations are a C++11 extension}}
55*67e74705SXin Li #endif
56*67e74705SXin Li       T g() {
57*67e74705SXin Li         return T();
58*67e74705SXin Li       }
59*67e74705SXin Li     };
60*67e74705SXin Li     return S().g();
61*67e74705SXin Li   }
62*67e74705SXin Li 
63*67e74705SXin Li   int n = f<int>();
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace PR10273 {
67*67e74705SXin Li   template<typename T> void (f)(T t) {}
68*67e74705SXin Li 
g()69*67e74705SXin Li   void g() {
70*67e74705SXin Li     (f)(17);
71*67e74705SXin Li   }
72*67e74705SXin Li }
73*67e74705SXin Li 
74*67e74705SXin Li namespace rdar15464547 {
75*67e74705SXin Li   class A {
76*67e74705SXin Li     A();
77*67e74705SXin Li   };
78*67e74705SXin Li 
79*67e74705SXin Li   template <typename R> class B {
80*67e74705SXin Li   public:
81*67e74705SXin Li     static void meth1();
82*67e74705SXin Li     static void meth2();
83*67e74705SXin Li   };
84*67e74705SXin Li 
A()85*67e74705SXin Li   A::A() {
86*67e74705SXin Li     extern int compile_time_assert_failed;
87*67e74705SXin Li     B<int>::meth2();
88*67e74705SXin Li   }
89*67e74705SXin Li 
meth1()90*67e74705SXin Li   template <typename R> void B<R>::meth1() {
91*67e74705SXin Li     extern int compile_time_assert_failed;
92*67e74705SXin Li   }
93*67e74705SXin Li 
meth2()94*67e74705SXin Li   template <typename R> void B<R>::meth2() {
95*67e74705SXin Li     extern int compile_time_assert_failed;
96*67e74705SXin Li   }
97*67e74705SXin Li }
98