From 33b91f7e4881d2c9149c0aa62066d668e4353f3d Mon Sep 17 00:00:00 2001 From: reichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed, 22 Feb 2006 17:22:08 +0000 Subject: [PATCH] PR c++/26291 * decl.c (grok_op_properties): Check for ellipsis in arguments of operators. * g++.dg/other/ellipsis1.C: New test. * g++.dg/parse/operator4.C: Adjust error marker. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111367 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 13 ++++++++++--- gcc/cp/decl.c | 7 ++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/other/ellipsis1.C | 12 ++++++++++++ gcc/testsuite/g++.dg/parse/operator4.C | 2 +- 5 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/ellipsis1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6a1e2f1d4610..c888a09acc24 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,13 @@ -2006-02-20 Rafael Ávila de Espíndola <rafael.espindola@gmail.com> - * Make-lang.in (C++): Remove - (.PHONY): Remove C++ +2006-02-22 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + PR c++/26291 + * decl.c (grok_op_properties): Check for ellipsis in arguments of + operators. + +2006-02-20 Rafael Ávila de Espíndola <rafael.espindola@gmail.com> + + * Make-lang.in (C++): Remove. + (.PHONY): Remove C++. 2006-02-18 Mark Mitchell <mark@codesourcery.com> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 35dc38c0a455..c803a84bac1a 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8828,13 +8828,15 @@ grok_op_properties (tree decl, bool complain) tree name = DECL_NAME (decl); enum tree_code operator_code; int arity; + bool ellipsis_p; tree class_type; - /* Count the number of arguments. */ + /* Count the number of arguments and check for ellipsis. */ for (argtype = argtypes, arity = 0; argtype && argtype != void_list_node; argtype = TREE_CHAIN (argtype)) ++arity; + ellipsis_p = !argtype; class_type = DECL_CONTEXT (decl); if (class_type && !CLASS_TYPE_P (class_type)) @@ -9000,11 +9002,14 @@ grok_op_properties (tree decl, bool complain) "conversion operator", ref ? "a reference to " : "", what); } + if (operator_code == COND_EXPR) { /* 13.4.0.3 */ error ("ISO C++ prohibits overloading operator ?:"); } + else if (ellipsis_p) + error ("%qD must not have variable number of arguments", decl); else if (ambi_op_p (operator_code)) { if (arity == 1) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6d36553f9f60..951bc113265c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-02-22 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + PR c++/26291 + * g++.dg/other/ellipsis1.C: New test. + * g++.dg/parse/operator4.C: Adjust error marker. + 2006-02-22 H.J. Lu <hongjiu.lu@intel.com> PR target/25603 diff --git a/gcc/testsuite/g++.dg/other/ellipsis1.C b/gcc/testsuite/g++.dg/other/ellipsis1.C new file mode 100644 index 000000000000..d2501ca85e2c --- /dev/null +++ b/gcc/testsuite/g++.dg/other/ellipsis1.C @@ -0,0 +1,12 @@ +// PR c++/26291 +// { dg-do compile } + +struct A +{ + A& operator= (A,...); // { dg-error "variable number of arguments" } + A operator+ (...); // { dg-error "variable number of arguments" } + operator int(...); // { dg-error "variable number of arguments" } + int operator() (...); +}; + +A operator- (A,...); // { dg-error "variable number of arguments" } diff --git a/gcc/testsuite/g++.dg/parse/operator4.C b/gcc/testsuite/g++.dg/parse/operator4.C index 9395ccdd1b23..054ddc8354f2 100644 --- a/gcc/testsuite/g++.dg/parse/operator4.C +++ b/gcc/testsuite/g++.dg/parse/operator4.C @@ -1 +1 @@ -int operator *(int, ...); // { dg-error "class" } +int operator *(int, ...); // { dg-error "class|variable number of arguments" } -- GitLab