// RUN: %clang_cc1 -std=c++2a -emit-pch %s -o %t-cxx2a // RUN: %clang_cc1 -std=c++2a -DUSE_PCH -include-pch %t-cxx2a %s -ast-print -verify | FileCheck %s // RUN: %clang_cc1 -std=c++2a -emit-pch -fpch-instantiate-templates %s -o %t-cxx2a // RUN: %clang_cc1 -std=c++2a -DUSE_PCH -include-pch %t-cxx2a %s -ast-print -verify | FileCheck %s #ifndef USE_PCH namespace inheriting_constructor { struct S {}; template struct T { template explicit((Y{}, true)) T(A &&a) {} }; template struct U : T { using T::T; }; U foo(char ch) { return U(ch); } } #else namespace inheriting_constructor { U a = foo('0'); } //CHECK: explicit((char{} , true)) #endif namespace basic { #ifndef USE_PCH struct B {}; struct A { explicit A(int); explicit(false) operator bool(); explicit(true) operator B(); }; #else //expected-note@-6+ {{candidate constructor}} //expected-note@-9+ {{candidate constructor}} //expected-note-re@-7+ {{explicit constructor is not a candidate{{$}}}} //expected-note@-7+ {{candidate function}} //expected-note@-7+ {{explicit conversion function is not a candidate (explicit specifier evaluates to true)}} //CHECK: explicit{{ +}}A( //CHECK-NEXT: explicit(false){{ +}}operator //CHECK-NEXT: explicit(true){{ +}}operator A a = 0; //expected-error {{no viable conversion}} A a1(0); bool b = a1; B b1 = a1; //expected-error {{no viable conversion}} #endif } namespace templ { #ifndef USE_PCH template struct B { static constexpr bool value = b; }; template struct A { explicit(b) A(B) {} template explicit(b ^ T::value) operator T(); }; B b_true; B b_false; #else //expected-note@-8 {{candidate template ignored}} //expected-note@-8 {{explicit constructor declared here}} //expected-note@-15+ {{candidate constructor}} //expected-note@-8+ {{explicit conversion function is not a candidate (explicit specifier}} //expected-note@-11 {{explicit constructor is not a candidate (explicit specifier}} //CHECK: explicit(b){{ +}}A //CHECK: explicit(b{{ +}}^{{ +}}T::value){{ +}}operator A a = { b_true }; //expected-error {{class template argument deduction}} A a0 = b_true; //expected-error {{no viable constructor or deduction guide}} A a_true(b_true); A a_false = b_false; B b = a_true; B b1 = a_false; //expected-error {{no viable conversion}} B b2(a_true); #endif } namespace guide { #ifndef USE_PCH template struct A { A(T); }; template explicit(true) A(T) -> A; explicit(false) A(int) -> A; #else //expected-note@-5 {{explicit deduction guide}} //CHECK: explicit(true){{ +}}A( //CHECK: explicit(false){{ +}}A( A a = { 0.0 }; //expected-error {{explicit deduction guide}} A a1 = { 0 }; #endif }