Index: include/type_traits =================================================================== --- include/type_traits +++ include/type_traits @@ -4711,12 +4711,18 @@ #ifdef _LIBCPP_UNDERLYING_TYPE -template -struct underlying_type +template ::value> +struct __impl_underlying_type { typedef _LIBCPP_UNDERLYING_TYPE(_Tp) type; }; +template +struct __impl_underlying_type<_Tp, false> { }; + +template +struct underlying_type: __impl_underlying_type<_Tp> { }; + #if _LIBCPP_STD_VER > 11 template using underlying_type_t = typename underlying_type<_Tp>::type; #endif Index: test/std/utilities/meta/meta.trans/meta.trans.other/underlying_type.fail.cpp =================================================================== --- /dev/null +++ test/std/utilities/meta/meta.trans/meta.trans.other/underlying_type.fail.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// type_traits + +// underlying_type + +#include + +template +std::enable_if_t< + std::is_same_v, int> +> test_sfinae(T t); + +int main(int, char**) +{ + test_sfinae(0); // expected-error {{no matching function for call to 'test_sfinae'}} + + return 0; +} Index: test/std/utilities/meta/meta.trans/meta.trans.other/underlying_type.pass.cpp =================================================================== --- test/std/utilities/meta/meta.trans/meta.trans.other/underlying_type.pass.cpp +++ test/std/utilities/meta/meta.trans/meta.trans.other/underlying_type.pass.cpp @@ -27,6 +27,13 @@ enum F { W = UINT_MAX }; #endif // TEST_UNSIGNED_UNDERLYING_TYPE +template +std::enable_if_t< + std::is_same_v, int> +> test_sfinae(T t); + +void test_sfinae(int) { return; } + int main(int, char**) { static_assert((std::is_same::type, int>::value), @@ -52,6 +59,8 @@ static_assert((std::is_same, char>::value), ""); #endif // TEST_STD_VER > 11 #endif // TEST_STD_VER >= 11 + + test_sfinae(0); return 0; }