From 07021f8c632eb69b3f4082acd8af08a484fcdc21 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 26 Oct 2007 18:32:41 +0000 Subject: [PATCH] re PR c++/31988 (new operator should not permit default first parameter) cp/ 2007-10-26 Paolo Carlini PR c++/31988 * decl2.c (coerce_new_type): Do not allow a default argument for the first parameter. testsuite/ 2007-10-26 Paolo Carlini PR c++/31988 * g++.dg/init/new25.C: New. From-SVN: r129657 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl2.c | 32 +++++++++++++++++++++++++------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/new25.C | 29 +++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/new25.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 191836d..99a2bc5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-10-26 Paolo Carlini + + PR c++/31988 + * decl2.c (coerce_new_type): Do not allow a default argument for + the first parameter. + 2007-10-26 Douglas Gregor PR c++/33839 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index ce5e528..0a97834 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1251,15 +1251,33 @@ coerce_new_type (tree type) error ("% must return type %qT", ptr_type_node); } - if (!args || args == void_list_node - || !same_type_p (TREE_VALUE (args), size_type_node)) + if (args && args != void_list_node) { - e = 2; - if (args && args != void_list_node) - args = TREE_CHAIN (args); - pedwarn ("% takes type % (%qT) " - "as first parameter", size_type_node); + if (TREE_PURPOSE (args)) + { + /* [basic.stc.dynamic.allocation] + + The first parameter shall not have an associated default + argument. */ + error ("the first parameter of % cannot " + "have a default argument"); + /* Throw away the default argument. */ + TREE_PURPOSE (args) = NULL_TREE; + } + + if (!same_type_p (TREE_VALUE (args), size_type_node)) + { + e = 2; + args = TREE_CHAIN (args); + } } + else + e = 2; + + if (e == 2) + pedwarn ("% takes type % (%qT) " + "as first parameter", size_type_node); + switch (e) { case 2: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1257d0b..02339a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-10-26 Paolo Carlini + + PR c++/31988 + * g++.dg/init/new25.C: New. + 2007-10-26 Douglas Gregor * g++.dg/cpp0x/pr33839.C: New. diff --git a/gcc/testsuite/g++.dg/init/new25.C b/gcc/testsuite/g++.dg/init/new25.C new file mode 100644 index 0000000..2d447f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new25.C @@ -0,0 +1,29 @@ +// PR c++/31988 +#include + +class C +{ +public: + void* operator new(std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" } + void* operator new[](std::size_t = 32) throw (std::bad_alloc); // { dg-error "first parameter" } + void* operator new(std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" } + void* operator new[](std::size_t = 32, const std::nothrow_t&) throw(); // { dg-error "first parameter" } +}; + +class D +{ +public: + void* operator new(std::size_t, + const std::nothrow_t& = std::nothrow_t()) throw(); + void* operator new[](std::size_t, + const std::nothrow_t& = std::nothrow_t()) throw(); +}; + +class E +{ +public: + void* operator new(std::size_t = 0, + const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" } + void* operator new[](std::size_t = 0, + const std::nothrow_t& = std::nothrow_t()) throw(); // { dg-error "first parameter" } +}; -- 2.7.4