xref: /llvm-project/clang/test/CXX/temp/temp.spec/temp.expl.spec/p4.cpp (revision 53851923d5c9f9ebb3a4d708db0c1cab30ca1d33)
1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
3 // RUN: %clang_cc1 -fsyntax-only -verify %s
4 
5 struct IntHolder { // expected-note 0-1{{here}} expected-note 2-4{{candidate constructor (the implicit}}
6   IntHolder(int); // expected-note 2{{candidate constructor}}
7 };
8 
9 template<typename T, typename U>
10 struct X { // expected-note{{here}}
fX11   void f() {
12     T t; // expected-error{{no matching}}
13   }
14 
gX15   void g() { }
16 
17   struct Inner {
18 #if __cplusplus >= 201103L
19     T value; 	// expected-note {{has no default constructor}}
20 #else
21     // expected-error@-4 {{implicit default}}
22     T value; 	// expected-note {{member is declared here}}
23 #endif
24   };
25 
26   static T value;
27 };
28 
29 template<typename T, typename U>
30 T X<T, U>::value; // expected-error{{no matching constructor}}
31 
test_X_IntHolderInt(X<IntHolder,int> xih)32 IntHolder &test_X_IntHolderInt(X<IntHolder, int> xih) {
33   xih.g(); // okay
34   xih.f(); // expected-note{{instantiation}}
35 
36   X<IntHolder, int>::Inner inner;
37 #if __cplusplus >= 201103L
38   // expected-error@-2 {{call to implicitly-deleted}}
39 #else
40   // expected-note@-4 {{first required here}}
41 #endif
42 
43   return X<IntHolder, int>::value; // expected-note{{instantiation}}
44 }
45 
46 // Explicitly specialize the members of X<IntHolder, long> to not cause
47 // problems with instantiation.
48 template<>
f()49 void X<IntHolder, long>::f() { }
50 
51 template<>
52 struct X<IntHolder, long>::Inner {
InnerX::Inner53   Inner() : value(17) { }
54   IntHolder value;
55 };
56 
57 template<>
58 IntHolder X<IntHolder, long>::value = 17;
59 
test_X_IntHolderInt(X<IntHolder,long> xih)60 IntHolder &test_X_IntHolderInt(X<IntHolder, long> xih) {
61   xih.g(); // okay
62   xih.f(); // okay, uses specialization
63 
64   X<IntHolder, long>::Inner inner; // okay, uses specialization
65 
66   return X<IntHolder, long>::value; // okay, uses specialization
67 }
68 
69 template<>
X()70 X<IntHolder, long>::X() { } // expected-error{{instantiated member}}
71