annotate clang/test/PCH/cxx-explicit-specifier.cpp @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -std=c++2a -emit-pch %s -o %t-cxx2a
anatofuz
parents:
diff changeset
2 // RUN: %clang_cc1 -std=c++2a -DUSE_PCH -include-pch %t-cxx2a %s -ast-print -verify | FileCheck %s
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 #ifndef USE_PCH
anatofuz
parents:
diff changeset
5 namespace inheriting_constructor {
anatofuz
parents:
diff changeset
6 struct S {};
anatofuz
parents:
diff changeset
7
anatofuz
parents:
diff changeset
8 template<typename X, typename Y> struct T {
anatofuz
parents:
diff changeset
9 template<typename A>
anatofuz
parents:
diff changeset
10 explicit((Y{}, true)) T(A &&a) {}
anatofuz
parents:
diff changeset
11 };
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 template<typename X, typename Y> struct U : T<X, Y> {
anatofuz
parents:
diff changeset
14 using T<X, Y>::T;
anatofuz
parents:
diff changeset
15 };
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 U<S, char> foo(char ch) {
anatofuz
parents:
diff changeset
18 return U<S, char>(ch);
anatofuz
parents:
diff changeset
19 }
anatofuz
parents:
diff changeset
20 }
anatofuz
parents:
diff changeset
21 #else
anatofuz
parents:
diff changeset
22 namespace inheriting_constructor {
anatofuz
parents:
diff changeset
23 U<S, char> a = foo('0');
anatofuz
parents:
diff changeset
24 }
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 //CHECK: explicit((char{} , true))
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 #endif
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 namespace basic {
anatofuz
parents:
diff changeset
31 #ifndef USE_PCH
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 struct B {};
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 struct A {
anatofuz
parents:
diff changeset
36 explicit A(int);
anatofuz
parents:
diff changeset
37 explicit(false) operator bool();
anatofuz
parents:
diff changeset
38 explicit(true) operator B();
anatofuz
parents:
diff changeset
39 };
anatofuz
parents:
diff changeset
40 #else
anatofuz
parents:
diff changeset
41 //expected-note@-6+ {{candidate constructor}}
anatofuz
parents:
diff changeset
42 //expected-note@-9+ {{candidate constructor}}
anatofuz
parents:
diff changeset
43 //expected-note-re@-7+ {{explicit constructor is not a candidate{{$}}}}
anatofuz
parents:
diff changeset
44 //expected-note@-7+ {{candidate function}}
anatofuz
parents:
diff changeset
45 //expected-note@-7+ {{explicit conversion function is not a candidate (explicit specifier evaluates to true)}}
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 //CHECK: explicit{{ +}}A(
anatofuz
parents:
diff changeset
48 //CHECK-NEXT: explicit(false){{ +}}operator
anatofuz
parents:
diff changeset
49 //CHECK-NEXT: explicit(true){{ +}}operator
anatofuz
parents:
diff changeset
50 A a = 0; //expected-error {{no viable conversion}}
anatofuz
parents:
diff changeset
51 A a1(0);
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 bool b = a1;
anatofuz
parents:
diff changeset
54 B b1 = a1; //expected-error {{no viable conversion}}
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 #endif
anatofuz
parents:
diff changeset
57 }
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 namespace templ {
anatofuz
parents:
diff changeset
61 #ifndef USE_PCH
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 template<bool b>
anatofuz
parents:
diff changeset
64 struct B {
anatofuz
parents:
diff changeset
65 static constexpr bool value = b;
anatofuz
parents:
diff changeset
66 };
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 template<bool b>
anatofuz
parents:
diff changeset
69 struct A {
anatofuz
parents:
diff changeset
70 explicit(b) A(B<b>) {}
anatofuz
parents:
diff changeset
71 template<typename T>
anatofuz
parents:
diff changeset
72 explicit(b ^ T::value) operator T();
anatofuz
parents:
diff changeset
73 };
anatofuz
parents:
diff changeset
74 B<true> b_true;
anatofuz
parents:
diff changeset
75 B<false> b_false;
anatofuz
parents:
diff changeset
76 #else
anatofuz
parents:
diff changeset
77 //expected-note@-8 {{candidate template ignored}}
anatofuz
parents:
diff changeset
78 //expected-note@-8 {{explicit constructor declared here}}
anatofuz
parents:
diff changeset
79 //expected-note@-15+ {{candidate constructor}}
anatofuz
parents:
diff changeset
80 //expected-note@-8+ {{explicit conversion function is not a candidate (explicit specifier}}
anatofuz
parents:
diff changeset
81 //expected-note@-11 {{explicit constructor is not a candidate (explicit specifier}}
anatofuz
parents:
diff changeset
82
anatofuz
parents:
diff changeset
83 //CHECK: explicit(b){{ +}}A
anatofuz
parents:
diff changeset
84 //CHECK: explicit(b{{ +}}^{{ +}}T::value){{ +}}operator
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 A a = { b_true }; //expected-error {{class template argument deduction}}
anatofuz
parents:
diff changeset
87 A a0 = b_true; //expected-error {{no viable constructor or deduction guide}}
anatofuz
parents:
diff changeset
88 A a_true(b_true);
anatofuz
parents:
diff changeset
89 A a_false = b_false;
anatofuz
parents:
diff changeset
90
anatofuz
parents:
diff changeset
91 B<true> b = a_true;
anatofuz
parents:
diff changeset
92 B<true> b1 = a_false; //expected-error {{no viable conversion}}
anatofuz
parents:
diff changeset
93 B<false> b2(a_true);
anatofuz
parents:
diff changeset
94
anatofuz
parents:
diff changeset
95 #endif
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 }
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 namespace guide {
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 #ifndef USE_PCH
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 template<typename T>
anatofuz
parents:
diff changeset
104 struct A {
anatofuz
parents:
diff changeset
105 A(T);
anatofuz
parents:
diff changeset
106 };
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 template<typename T>
anatofuz
parents:
diff changeset
109 explicit(true) A(T) -> A<T>;
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 explicit(false) A(int) -> A<int>;
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 #else
anatofuz
parents:
diff changeset
114 //expected-note@-5 {{explicit deduction guide}}
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 //CHECK: explicit(true){{ +}}A(
anatofuz
parents:
diff changeset
117 //CHECK: explicit(false){{ +}}A(
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 A a = { 0.0 }; //expected-error {{explicit deduction guide}}
anatofuz
parents:
diff changeset
120 A a1 = { 0 };
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 #endif
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 }