This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/86949] New: gcc generate an error because delete operator is private when it isn't needed
- From: "tyker at outlook dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 14 Aug 2018 12:02:21 +0000
- Subject: [Bug c++/86949] New: gcc generate an error because delete operator is private when it isn't needed
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86949
Bug ID: 86949
Summary: gcc generate an error because delete operator is
private when it isn't needed
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: tyker at outlook dot com
Target Milestone: ---
in this code:
#include <new>
struct X {
X() noexcept { }
private:
static void operator delete(void*);
};
int main() {
X* x = new(std::nothrow) X{};
}
the delete operator is private but it isn't needed because the contructor and
the allocator can't throw. but gcc generate an error complaining that the
delete operator is private.
all other majors complier complie this code without errors except gcc:
https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSAbAQwDtRkBSAJgCFufSAZ1QBXYskwgA5NwDMeFsgYisAag6yAwi0wB3Ddg4AGAILGTggsRHICqgBrqA7H1Or3DiAEpVLVJgAPCQAHOw4XZwARcw9VYOI8ADcmAkkYj0sUvGRVRNQ8dFVUYMxiFJJVLAZMVIg8goAqLw1XMydo2VbzBTsAWyYFb2cedTcPewbVAPVZSN89CEt0EBA/AgRiVF0fe3C%2BdpbRtsipL0ZpAFYpUhZpI2vUaU1%2BflVhMQl1Lllaa4I705nADWIFkXAAdAA2IwXGGyIwADgRABYuABOIzI85SZHXW5Se6kR5Sa6CEBGUj/AmnUhwWAwRAoVC9YJ4apkCgQNAstmlEDABFcUgAMzZqWIZIgACMAaQpQomMQAJ7SX6kbm9TAsAgAeRYDBV1NIWH6bGqsvwxEwtiSmDJRsC1pEqVV1x6mAYsqseF6rrOzDYKBevEYeClZMgZ2KBDwqBY9tJonEklo/sueNlxICCMhAFpIcjVMBkDkEeCuKoILhCBU5PRVJpmaz2V8fj5nrx%2BH8AV5gSAuLRwcjUZDZE40VxkU5ZBdaLRZNjcaRfci0eCnJCMRcfrQnE5BWj6PjCcTSeTKT3aQyIEhuc3SuRKHfecQUAxaGiAPoFkVi0qSmUjXlFhFUNNUNS1XV9UNQkTVYYBzSNS1rRjRI7VlR1kGdSQpDVd1PSNb1fVwmkA3YYMBAYMMI28IlQljeNpETD4UzTKQrhuTNpGzPMC1UABZABlAA1TRVA/VQuCMXdVAAJQAFQAdUrasiGIVt60bHkWzkLh2wo7tqV7UgEEwJgsFfWiCKXX1YXLeE0WRSEkS4AcnCPLiSSEc8qXuYyQVkWR12%2BSELgLWgkWRGcnAubFZAzI1TwvIyr3gOlGWfdlHy5JsXxAbJkAi38GHFADZWA0DXXVZlNW1PUDQtTBTQQnDYLwK0bTQ%2B1CUw7Cqvwr0EmI35/XgoNOxDKjw3gKN6LjBMhCTCQ6DYjjjwebic3zQsCvEssjHBIwVPwNSNNIBtcp075ZH0iaeEMvy%2B0C9c0QuWdBSMJwuAPehrOuFc10ii4uFCi4kUPJzOMSpjvIpXyaXSm8mW0h9OUyvklHg6EKVFEr/0oQDCQq5UqoguroMa5rELajrUPQh0AidF0SPIbUPUGn0/UYMbODu0NpsjOiY3mmH3mTFbsTWzyeO21RMbYVRIUOw7jprdS63OrT73V75kVuvheAewETLMizKDYmyQDsucLinWRhznRFtyxdaiVFnyeyeoLIXc9FMQnL7p0hSE4oSk8Yfh4yCK4MONq8yOzjQiUGJAZEgA%3D%3D
note that in this code:
#include <new>
struct X {
X() noexcept { }
static void operator delete(void*) = delete;
};
int main() {
X* x = new(std::nothrow) X{};
}
where the operator delete isn't needed and explicitly deleted gcc compiles
correctly.