llvm-project/clang/test/SemaCXX/cxx2a-explicit-bool-deferred.cpp
刘雨培 128b3b61fe
[Clang] Defer the instantiation of explicit-specifier until constraint checking completes (#70548)
Modifications:

- Skip the instantiation of the explicit-specifier during Decl
substitution if we are deducing template arguments and the
explicit-specifier is value dependent.

- Instantiate the explicit-specifier after the constraint checking
completes.

- Make `instantiateExplicitSpecifier` a member function in order to
instantiate the explicit-specifier in different stages.


This PR doesn’t defer the instantiation of the explicit specifier for
deduction guides, because I’m not familiar with deduction guides yet.
I’ll dig into it after this PR.

According to my local test, GCC 13 tuple works with this PR.

Fixes #59827.

---------

Co-authored-by: Erich Keane <ekeane@nvidia.com>
2023-11-01 06:45:48 -07:00

32 lines
924 B
C++

// RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s
template <typename T1, typename T2> struct is_same {
static constexpr bool value = false;
};
template <typename T> struct is_same<T, T> {
static constexpr bool value = true;
};
template <class T, class U>
concept SameHelper = is_same<T, U>::value;
template <class T, class U>
concept same_as = SameHelper<T, U> && SameHelper<U, T>;
namespace deferred_instantiation {
template <class X> constexpr X do_not_instantiate() { return nullptr; }
struct T {
template <same_as<float> X> explicit(do_not_instantiate<X>()) T(X) {}
T(int) {}
};
T t(5);
// expected-error@17{{cannot initialize}}
// expected-note@20{{in instantiation of function template specialization}}
// expected-note@30{{while substituting deduced template arguments}}
// expected-note@30{{in instantiation of function template specialization}}
T t2(5.0f);
} // namespace deferred_instantiation