https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94149

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:62c25d7adb1a5664982449dda0e7f9ca63cf4735

commit r10-7681-g62c25d7adb1a5664982449dda0e7f9ca63cf4735
Author: Marek Polacek <pola...@redhat.com>
Date:   Thu Apr 9 16:31:59 2020 -0400

    c++: make __is_constructible work with paren-init of aggrs [PR94149]

    In C++20 this is well-formed:

      using T = int[2];
      T t(1, 2);

    which means that std::is_constructible_v<int[2], int, int> should be true.
    But constructible_expr immediately returned the error_mark_node when it
    saw a list with more than one element.  To give accurate results in
    C++20, we have to try initializing the aggregate from a parenthesized list
of
    values.

    To not repeat the same mistake as in c++/93790, if there's only one
    element, I'm trying {} only when () didn't succeed.  is_constructible5.C
    verifies this.

    In paren-init24.C std::is_nothrow_constructible_v doesn't work due to
     error: invalid 'static_cast' from type 'int' to type 'int [1]'
    and
     error: functional cast to array type 'int [2]'

    This needs to be fixed in libstdc++.

            PR c++/94149
            * method.c (constructible_expr): In C++20, try using parenthesized
            initialization of aggregates to determine the result of
            __is_constructible.

            * g++.dg/cpp2a/paren-init24.C: New test.
            * g++.dg/cpp2a/paren-init25.C: New test.
            * g++.dg/ext/is_constructible5.C: New test.

Reply via email to