[PATCH] Implement sane variant converting constructor (P0608R3)
Rainer Orth
ro@CeBiTec.Uni-Bielefeld.DE
Fri May 17 13:55:00 GMT 2019
Hi Jonathan,
> * include/std/variant (__overload_set): Remove.
> (_Arr): New helper.
> (_Build_FUN): New class template to define a single FUN overload,
> with specializations to prevent unwanted conversions, as per P0608R3.
> (_Build_FUNs): New class template to build an overload set of FUN.
> (_FUN_type): New alias template to perform overload resolution.
> (__accepted_type): Use integer_constant base for failure case. Use
> _FUN_type for successful case.
> (variant::__accepted_index): Use _Tp instead of _Tp&&.
> (variant::variant(_Tp&&)): Likewise.
> (variant::operator=(_Tp&&)): Likewise.
>
> Tested powerpc64le-linux, committed to trunk.
[...]
> diff --git a/libstdc++-v3/testsuite/20_util/variant/compile.cc b/libstdc++-v3/testsuite/20_util/variant/compile.cc
> index c6b18d08258..4560f774452 100644
> --- a/libstdc++-v3/testsuite/20_util/variant/compile.cc
> +++ b/libstdc++-v3/testsuite/20_util/variant/compile.cc
> @@ -142,6 +142,11 @@ void arbitrary_ctor()
> static_assert(noexcept(variant<int, DefaultNoexcept>(int{})));
> static_assert(!noexcept(variant<int, Empty>(Empty{})));
> static_assert(noexcept(variant<int, DefaultNoexcept>(DefaultNoexcept{})));
> +
> + // P0608R3 disallow narrowing conversions and boolean conversions
> + static_assert(!is_constructible_v<variant<int>, long>);
> + static_assert(!is_constructible_v<variant<bool>, int>);
> + static_assert(!is_constructible_v<variant<bool>, void*>);
this test (which didn't make it into the ChangeLog, btw.) FAILs on
32-bit targets (seen on i386-pc-solaris2.11, sparc-sun-solaris.11, and
x86_64-pc-linux-gnu -m32):
+FAIL: 20_util/variant/compile.cc (test for excess errors)
Excess errors:
/vol/gcc/src/hg/trunk/local/libstdc++-v3/testsuite/20_util/variant/compile.cc:147: error: static assertion failed
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University
More information about the Gcc-patches
mailing list