[Bug c++/87066] New: new expression and potential destructor invokation

okannen at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Aug 22 22:14:00 GMT 2018


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

            Bug ID: 87066
           Summary: new expression and potential destructor invokation
           Product: gcc
           Version: 8.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: okannen at gmail dot com
  Target Milestone: ---

In the c++ standard [expr.new]:

>> if the new-expression creates an array of objects of class type, the destructor is potentially invoked.

And potentially invoked means that it is odr-used [basic.odr.def].

Gcc seems to apply this rule chaotically:

#include <string>

struct A
{
    ~A() = delete;
    std::string s;
};

struct B
{
    ~B() = delete;
};

int main()
{
    new A{}; //accepted
    new B{}; //error: use of deleted function ~B()
             //this is not a odr-use of ~B because this is not
             //an array creation
    new B;   //accepted
    new B[1]{}; //wrongly accepted: array creation odr-use the deleted
destructor
    new B[1]; //wrongly accepted: array creation odr-use the deleted 
}


More information about the Gcc-bugs mailing list