HomeFreeBSD

<type_traits>: Avoid instantiating a pointer type in std::decay<>.

Description

<type_traits>: 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<llvm::CHIArg&, true>':
/usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/type_traits:1591:89: required from 'struct std::1::decay<llvm::CHIArg&&>'
/usr/obj/usr/src/amd64.amd64/tmp/usr/include/c++/v1/
utility/pair.h:132:16: required by substitution of 'template<class _Tuple, typename std::1::enable_if<typename std::1::conditional<(std::1::tuple_like_with_size<_Tuple, 2, typename std::1::uncvref<_Tp>::type>::value && (! std::1::is_same<typename std::1::decay<_Tp>::type, std::1::pair<llvm::BasicBlock*, llvm::SmallVector<llvm::CHIArg, 2> > >::value)), std::1::pair<llvm::BasicBlock*, llvm::SmallVector<llvm::CHIArg, 2> >::_CheckTupleLikeConstructor, std::1::check_tuple_constructor_fail>::type::enable_implicit<_Tuple>(), void>::type* <anonymous> > constexpr std::1::pair<llvm::BasicBlock*, llvm::SmallVector<llvm::CHIArg, 2> >::pair(_Tuple&&) [with _Tuple = llvm::CHIArg&&; typename std::1::enable_if<typename std::1::conditional<(std::1::tuple_like_with_size<_Tuple, 2, typename std::1::uncvref<_Tp>::type>::value && (! std::1::is_same<typename std::1::decay<_Tp>::type, std::1::pair<llvm::BasicBlock*, llvm::SmallVector<llvm::CHIArg, 2> > >::value)), std::1::pair<llvm::BasicBlock*, llvm::SmallVector<llvm::CHIArg, 2> >::_CheckTupleLikeConstructor, std::1::check_tuple_constructor_fail>::type::enable_implicit<_Tuple>(), void>::type* <anonymous> = <missing>]'
/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<llvm::CHIArg&>::type' {aka 'llvm::CHIArg&'}
1582 | >::type type;

|                              ^~~~

Reviewed by: dim
Differential Revision: https://reviews.freebsd.org/D36898

Details

Provenance
jhbAuthored on Nov 24 2022, 12:10 AM
Reviewer
dim
Differential Revision
D36898: <type_traits>: Avoid instantiating a pointer type in std::decay<>.
Parents
rG88be8b8e5479: Fix igor and mandoc -T lint low-hanging fruit in hier(7)
Branches
Unknown
Tags
Unknown