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

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

https://gcc.gnu.org/g:a2746e4347076ea48f4aeb28e13e6337ff7799ad

commit r15-3721-ga2746e4347076ea48f4aeb28e13e6337ff7799ad
Author: Marek Polacek <pola...@redhat.com>
Date:   Mon Sep 9 14:23:33 2024 -0400

    c++: deleting explicitly-defaulted functions [PR116162]

    This PR points out the we're not implementing [dcl.fct.def.default]
    properly.  Consider e.g.

      struct C {
         C(const C&&) = default;
      };

    where we wrongly emit an error, but the move ctor should be just =deleted.
    According to [dcl.fct.def.default], if the type of the special member
    function differs from the type of the corresponding special member function
    that would have been implicitly declared in a way other than as allowed
    by 2.1-4, the function is defined as deleted.  There's an exception for
    assignment operators in which case the program is ill-formed.

    clang++ has a warning for when we delete an explicitly-defaulted function
    so this patch adds it too.

    When the code is ill-formed, we emit an error in all modes.  Otherwise,
    we emit a pedwarn in C++17 and a warning in C++20.

            PR c++/116162

    gcc/c-family/ChangeLog:

            * c.opt (Wdefaulted-function-deleted): New.

    gcc/cp/ChangeLog:

            * class.cc (check_bases_and_members): Don't set DECL_DELETED_FN
here,
            leave it to defaulted_late_check.
            * cp-tree.h (maybe_delete_defaulted_fn): Declare.
            (defaulted_late_check): Add a tristate parameter.
            * method.cc (maybe_delete_defaulted_fn): New.
            (defaulted_late_check): Add a tristate parameter.  Call
            maybe_delete_defaulted_fn instead of giving an error.

    gcc/ChangeLog:

            * doc/invoke.texi: Document -Wdefaulted-function-deleted.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/defaulted15.C: Add dg-warning/dg-error.
            * g++.dg/cpp0x/defaulted51.C: Likewise.
            * g++.dg/cpp0x/defaulted52.C: Likewise.
            * g++.dg/cpp0x/defaulted53.C: Likewise.
            * g++.dg/cpp0x/defaulted54.C: Likewise.
            * g++.dg/cpp0x/defaulted56.C: Likewise.
            * g++.dg/cpp0x/defaulted57.C: Likewise.
            * g++.dg/cpp0x/defaulted58.C: Likewise.
            * g++.dg/cpp0x/defaulted59.C: Likewise.
            * g++.dg/cpp0x/defaulted63.C: New test.
            * g++.dg/cpp0x/defaulted64.C: New test.
            * g++.dg/cpp0x/defaulted65.C: New test.
            * g++.dg/cpp0x/defaulted66.C: New test.
            * g++.dg/cpp0x/defaulted67.C: New test.
            * g++.dg/cpp0x/defaulted68.C: New test.
            * g++.dg/cpp0x/defaulted69.C: New test.
            * g++.dg/cpp23/defaulted1.C: New test.

Reply via email to