public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "m.cencora at gmail dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/113064] New: assignement from temporary sometimes invokes copy-assign instead of move-assign operator
Date: Mon, 18 Dec 2023 12:04:36 +0000	[thread overview]
Message-ID: <bug-113064-4@http.gcc.gnu.org/bugzilla/> (raw)

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

            Bug ID: 113064
           Summary: assignement from temporary sometimes invokes
                    copy-assign instead of move-assign operator
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: m.cencora at gmail dot com
  Target Milestone: ---

Following code fails to compile on any gcc version with any selected language
version. Works with clang.

When invoking the conversion operator the problem does not occur.
Also the mere existence of second overloaded conversion operator is
problematic.
Even though this conversion operator does not participate in overload
resolution due to being && qualified.
I marked it as deleted to show that this is not the overload being chosen by
compiler but just declaring it normally is enough to trigger the bug.

Compilation fails with error:
<source>: In function 'void test()':
<source>:31:10: error: use of deleted function 'no_copy&
no_copy::operator=(const no_copy&)'
   31 |     nc = f;
      |          ^
<source>:9:14: note: declared here
    9 |     no_copy& operator=(const no_copy&) = delete;
      |              ^~~~~~~~
Compiler returned: 1



// test.cpp
struct no_copy
{
    no_copy() = default;

    no_copy(const no_copy&) = delete;
    no_copy(no_copy&&);

    no_copy& operator=(const no_copy&) = delete;
    no_copy& operator=(no_copy&&);
};

struct foo
{
    operator no_copy() &
    {
        return no_copy();
    }

#ifndef WORKAROUND1
    operator no_copy&&() && = delete;
#endif
};

void test()
{
    foo f;
    no_copy nc;

#ifndef WORKAROUND2
    nc = f;
#else
    nc = f.operator bar();
#endif
}

             reply	other threads:[~2023-12-18 12:04 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-18 12:04 m.cencora at gmail dot com [this message]
2023-12-18 12:41 ` [Bug c++/113064] " m.cencora at gmail dot com
2023-12-18 13:00 ` m.cencora at gmail dot com
2023-12-18 19:58 ` mpolacek at gcc dot gnu.org
2023-12-19  9:10 ` m.cencora at gmail dot com
2023-12-19 11:39 ` m.cencora at gmail dot com
2023-12-19 15:54 ` mpolacek at gcc dot gnu.org
2024-01-03 20:43 ` cvs-commit at gcc dot gnu.org
2024-01-03 22:35 ` ppalka at gcc dot gnu.org
2024-01-03 22:36 ` ppalka at gcc dot gnu.org
2024-01-03 22:50 ` ppalka at gcc dot gnu.org
2024-01-04  8:24 ` m.cencora at gmail dot com

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-113064-4@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).