annotate clang/test/SemaTemplate/instantiate-complete.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -triple %itanium_abi_triple -fsyntax-only -verify %s
anatofuz
parents:
diff changeset
2 // RUN: %clang_cc1 -triple %ms_abi_triple -DMSABI -fsyntax-only -verify %s
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 // Tests various places where requiring a complete type involves
anatofuz
parents:
diff changeset
5 // instantiation of that type.
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 template<typename T>
anatofuz
parents:
diff changeset
8 struct X {
anatofuz
parents:
diff changeset
9 X(T);
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 #ifdef MSABI
anatofuz
parents:
diff changeset
12 // expected-error@+2{{data member instantiated with function type 'long (long)'}}
anatofuz
parents:
diff changeset
13 #endif
anatofuz
parents:
diff changeset
14 T f; // expected-error{{data member instantiated with function type 'float (int)'}} \
anatofuz
parents:
diff changeset
15 // expected-error{{data member instantiated with function type 'int (int)'}} \
anatofuz
parents:
diff changeset
16 // expected-error{{data member instantiated with function type 'char (char)'}} \
anatofuz
parents:
diff changeset
17 // expected-error{{data member instantiated with function type 'short (short)'}} \
anatofuz
parents:
diff changeset
18 // expected-error{{data member instantiated with function type 'float (float)'}}
anatofuz
parents:
diff changeset
19 };
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 X<int> f() { return 0; }
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 struct XField {
anatofuz
parents:
diff changeset
24 X<float(int)> xf; // expected-note{{in instantiation of template class 'X<float (int)>' requested here}}
anatofuz
parents:
diff changeset
25 };
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 void test_subscript(X<double> *ptr1, X<int(int)> *ptr2, int i) {
anatofuz
parents:
diff changeset
28 (void)ptr1[i];
anatofuz
parents:
diff changeset
29 (void)ptr2[i]; // expected-note{{in instantiation of template class 'X<int (int)>' requested here}}
anatofuz
parents:
diff changeset
30 }
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 void test_arith(X<signed char> *ptr1, X<unsigned char> *ptr2,
anatofuz
parents:
diff changeset
33 X<char(char)> *ptr3, X<short(short)> *ptr4) {
anatofuz
parents:
diff changeset
34 (void)(ptr1 + 5);
anatofuz
parents:
diff changeset
35 (void)(5 + ptr2);
anatofuz
parents:
diff changeset
36 (void)(ptr3 + 5); // expected-note{{in instantiation of template class 'X<char (char)>' requested here}}
anatofuz
parents:
diff changeset
37 (void)(5 + ptr4); // expected-note{{in instantiation of template class 'X<short (short)>' requested here}}
anatofuz
parents:
diff changeset
38 }
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 void test_new() {
anatofuz
parents:
diff changeset
41 (void)new X<float>(0);
anatofuz
parents:
diff changeset
42 (void)new X<float(float)>; // expected-note{{in instantiation of template class 'X<float (float)>' requested here}}
anatofuz
parents:
diff changeset
43 }
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 void test_memptr(X<long> *p1, long X<long>::*pm1,
anatofuz
parents:
diff changeset
46 X<long(long)> *p2,
anatofuz
parents:
diff changeset
47 #ifdef MSABI
anatofuz
parents:
diff changeset
48 long (X<long(long)>::*pm2)(long)) { // expected-note{{in instantiation of template class 'X<long (long)>' requested here}}
anatofuz
parents:
diff changeset
49 #else
anatofuz
parents:
diff changeset
50 long (X<long(long)>::*pm2)(long)) {
anatofuz
parents:
diff changeset
51 #endif
anatofuz
parents:
diff changeset
52 (void)(p1->*pm1);
anatofuz
parents:
diff changeset
53 }
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 // Reference binding to a base
anatofuz
parents:
diff changeset
56 template<typename T>
anatofuz
parents:
diff changeset
57 struct X1 { };
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 template<typename T>
anatofuz
parents:
diff changeset
60 struct X2 : public T { };
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 void refbind_base(X2<X1<int> > &x2) {
anatofuz
parents:
diff changeset
63 X1<int> &x1 = x2;
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 // Enumerate constructors for user-defined conversion.
anatofuz
parents:
diff changeset
67 template<typename T>
anatofuz
parents:
diff changeset
68 struct X3 {
anatofuz
parents:
diff changeset
69 X3(T);
anatofuz
parents:
diff changeset
70 };
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 void enum_constructors(X1<float> &x1) {
anatofuz
parents:
diff changeset
73 X3<X1<float> > x3 = x1;
anatofuz
parents:
diff changeset
74 }
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 namespace PR6376 {
anatofuz
parents:
diff changeset
77 template<typename T, typename U> struct W { };
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 template<typename T>
anatofuz
parents:
diff changeset
80 struct X {
anatofuz
parents:
diff changeset
81 template<typename U>
anatofuz
parents:
diff changeset
82 struct apply {
anatofuz
parents:
diff changeset
83 typedef W<T, U> type;
anatofuz
parents:
diff changeset
84 };
anatofuz
parents:
diff changeset
85 };
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 template<typename T, typename U>
anatofuz
parents:
diff changeset
88 struct Y : public X<T>::template apply<U>::type { };
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 template struct Y<int, float>;
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 namespace TemporaryObjectCopy {
anatofuz
parents:
diff changeset
94 // Make sure we instantiate classes when we create a temporary copy.
anatofuz
parents:
diff changeset
95 template<typename T>
anatofuz
parents:
diff changeset
96 struct X {
anatofuz
parents:
diff changeset
97 X(T);
anatofuz
parents:
diff changeset
98 };
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 template<typename T>
anatofuz
parents:
diff changeset
101 void f(T t) {
anatofuz
parents:
diff changeset
102 const X<int> &x = X<int>(t);
anatofuz
parents:
diff changeset
103 }
anatofuz
parents:
diff changeset
104
anatofuz
parents:
diff changeset
105 template void f(int);
anatofuz
parents:
diff changeset
106 }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 namespace PR7080 {
anatofuz
parents:
diff changeset
109 template <class T, class U>
anatofuz
parents:
diff changeset
110 class X
anatofuz
parents:
diff changeset
111 {
anatofuz
parents:
diff changeset
112 typedef char true_t;
anatofuz
parents:
diff changeset
113 class false_t { char dummy[2]; };
anatofuz
parents:
diff changeset
114 static true_t dispatch(U);
anatofuz
parents:
diff changeset
115 static false_t dispatch(...);
anatofuz
parents:
diff changeset
116 static T trigger();
anatofuz
parents:
diff changeset
117 public:
anatofuz
parents:
diff changeset
118 enum { value = sizeof(dispatch(trigger())) == sizeof(true_t) };
anatofuz
parents:
diff changeset
119 };
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 template <class T>
anatofuz
parents:
diff changeset
122 class rv : public T
anatofuz
parents:
diff changeset
123 { };
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 bool x = X<int, rv<int>&>::value;
anatofuz
parents:
diff changeset
126 }
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 namespace pr7199 {
anatofuz
parents:
diff changeset
129 template <class T> class A; // expected-note {{template is declared here}}
anatofuz
parents:
diff changeset
130 template <class T> class B {
anatofuz
parents:
diff changeset
131 class A<T>::C field; // expected-error {{implicit instantiation of undefined template 'pr7199::A<int>'}}
anatofuz
parents:
diff changeset
132 };
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 template class B<int>; // expected-note {{in instantiation}}
anatofuz
parents:
diff changeset
135 }
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 namespace PR8425 {
anatofuz
parents:
diff changeset
138 template <typename T>
anatofuz
parents:
diff changeset
139 class BaseT {};
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 template <typename T>
anatofuz
parents:
diff changeset
142 class DerivedT : public BaseT<T> {};
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 template <typename T>
anatofuz
parents:
diff changeset
145 class FromT {
anatofuz
parents:
diff changeset
146 public:
anatofuz
parents:
diff changeset
147 operator DerivedT<T>() const { return DerivedT<T>(); }
anatofuz
parents:
diff changeset
148 };
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 void test() {
anatofuz
parents:
diff changeset
151 FromT<int> ft;
anatofuz
parents:
diff changeset
152 BaseT<int> bt(ft);
anatofuz
parents:
diff changeset
153 }
anatofuz
parents:
diff changeset
154 }