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

            Bug ID: 108594
           Summary: GCC ignores deleted movement constructor is not used
                    on return
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dev at gutoehrlein dot eu
  Target Milestone: ---

Hello,

im not 100% certain, but the following code should probably not compile, but
instead produce an error. In gcc (Version 12.2, also in trunk) the code
compiles. Both the MSVC compiler and clang (Version 15.0.0) produce an error:

* MSVC: error C2280: 'ClassA::ClassA(ClassA &&)': attempting to reference a
deleted function
* CLANG: error: call to delete constructor of 'Class A'

Since the movement constructor in class a is defined but deleted, shouldn't it
be selected by the return in the function fA to avoid copying? If so, the
return should produce an error, because the constructor is deleted.

Sincerly
Robin

Example in godbold.org: https://godbolt.org/z/1fnr6zKx4

--------------------

class ClassA
{
    public:
        ClassA() {}
        ClassA(const ClassA& v) {}
        ClassA(ClassA&& v) = delete;
};


ClassA fA() { return ClassA(); } // Here the movement constructor should be
selected

int main()
{
    ClassA a { fA() };
    return 0;
}

Reply via email to