This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: P1285R0 and type_traits hardening discussion
On Wed, Apr 10, 2019, 23:43 Jonathan Wakely <jwakely@redhat.com> wrote:
> On 10/04/19 23:25 +0300, Antony Polukhin wrote:
> >2) The check does not do memoization of the result, so it may produce
> >different results with the same template arguments. This works on GCC and
> >Clang, but is this feature desired?
>
> It will only produce different results when UB has been detected,
> right? In other words, if all such assertions pass, the results are
> the same. If one fails because a type is incomplete at one point and
> complete later we have an ODR violation, but that's OK because we've
> already terminated compilation due to the failed assertion. Do I
> understand correctly?
>
> I think that's OK as long as we only use the __is_size_known function
> in static assertions. If we used it in other contexts, we'd have ODR
> violations for valid code, which would be bad.
>
Yes, I was thinking in the same way.
But some experiments showed that there is a difference:
struct X;
// produces an error, OK
constexpr bool res1 = std::is_move_constructible<X>::value;
struct X{};
// With memoization produces an incorrect error, because
// __is_size_konwn remebered the result for X.
constexpr bool res2 = std::is_copy_constructible<X>::value;
So without memoization the errors are produced only for the incorrect
usages rather than for all the type triats usages after the first failure.
>