aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2007-10-26 18:32:41 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2007-10-26 18:32:41 +0000
commit07021f8c632eb69b3f4082acd8af08a484fcdc21 (patch)
treea4e9a38ac896b6bfc8e16bfbf28f3e21214b2405 /gcc
parent2b536806afcb297162fdc44e04cbf6f2c21e66aa (diff)
downloadgcc-07021f8c632eb69b3f4082acd8af08a484fcdc21.zip
gcc-07021f8c632eb69b3f4082acd8af08a484fcdc21.tar.gz
gcc-07021f8c632eb69b3f4082acd8af08a484fcdc21.tar.bz2
re PR c++/31988 (new operator should not permit default first parameter)
cp/ 2007-10-26 Paolo Carlini <pcarlini@suse.de> PR c++/31988 * decl2.c (coerce_new_type): Do not allow a default argument for the first parameter. testsuite/ 2007-10-26 Paolo Carlini <pcarlini@suse.de> PR c++/31988 * g++.dg/init/new25.C: New. From-SVN: r129657
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c32
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/new25.C29
4 files changed, 65 insertions, 7 deletions
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 <pcarlini@suse.de>
+
+ PR c++/31988
+ * decl2.c (coerce_new_type): Do not allow a default argument for
+ the first parameter.
+
2007-10-26 Douglas Gregor <doug.gregor@gmail.com>
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 ("%<operator new%> 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 ("%<operator new%> takes type %<size_t%> (%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 %<operator new%> 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 ("%<operator new%> takes type %<size_t%> (%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 <pcarlini@suse.de>
+
+ PR c++/31988
+ * g++.dg/init/new25.C: New.
+
2007-10-26 Douglas Gregor <doug.gregor@gmail.com>
* 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 <new>
+
+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" }
+};