From c36de97088a2b9141cdaf2fae2a7f41bf820ffa0 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 23 Nov 2022 16:10:05 -0800 Subject: [PATCH] : Avoid instantiating a pointer type in std::decay<>. GCC expands the pointer type in this conditional expression even for template types _Up that are not arrays. This raises an error when std::decay<> is used with reference types (as is done in LLVM's sources). Using add_pointer<> causes GCC to only instantiate a pointer type for array types. A similar change to this commit (albeit reworked due to upstream changes) has been merged to libc++ in commit 26068c6e60324ed866a1ca2afb5cb5eb0aaf015b. In file included from /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/__compare/ordering.h:13, from /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/__compare/common_comparison_category.h:12, from /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/tuple:168, from /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/DenseMapInfo.h:20, from /usr/src/contrib/llvm-project/llvm/include/llvm/ADT/DenseMap.h:17, from /usr/src/contrib/llvm-project/llvm/lib/Transforms/Scalar/GVNHoist.cpp:36: /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/type_traits: In instantiation of 'struct std::__1::__decay': /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/type_traits:1591:89: required from 'struct std::__1::decay' /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/__utility/pair.h:132:16: required by substitution of 'template::type>::value && (! std::__1::is_same::type, std::__1::pair > >::value)), std::__1::pair >::_CheckTupleLikeConstructor, std::__1::__check_tuple_constructor_fail>::type::__enable_implicit<_Tuple>(), void>::type* > constexpr std::__1::pair >::pair(_Tuple&&) [with _Tuple = llvm::CHIArg&&; typename std::__1::enable_if::type>::value && (! std::__1::is_same::type, std::__1::pair > >::value)), std::__1::pair >::_CheckTupleLikeConstructor, std::__1::__check_tuple_constructor_fail>::type::__enable_implicit<_Tuple>(), void>::type* = ]' /usr/src/contrib/llvm-project/llvm/lib/Transforms/Scalar/GVNHoist.cpp:892:51: required from here /usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/type_traits:1582:30: error: forming pointer to reference type 'std::__1::remove_extent::type' {aka 'llvm::CHIArg&'} 1582 | >::type type; | ^~~~ Reviewed by: dim Differential Revision: https://reviews.freebsd.org/D36898 --- contrib/llvm-project/libcxx/include/type_traits | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/llvm-project/libcxx/include/type_traits b/contrib/llvm-project/libcxx/include/type_traits index 3391999675a..daf031e475f 100644 --- a/contrib/llvm-project/libcxx/include/type_traits +++ b/contrib/llvm-project/libcxx/include/type_traits @@ -1572,7 +1572,7 @@ public: typedef _LIBCPP_NODEBUG typename conditional < is_array<_Up>::value, - typename remove_extent<_Up>::type*, + typename add_pointer::type>::type, typename conditional < is_function<_Up>::value,