aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVolker Reichelt <reichelt@gcc.gnu.org>2006-02-22 17:22:08 +0000
committerVolker Reichelt <reichelt@gcc.gnu.org>2006-02-22 17:22:08 +0000
commit6484413978b4b3ede2bfe2b67c3a64c65bc0f28b (patch)
tree97d14c6fc2b1b36249dd0c7282e7310a42090995 /gcc
parentf8190ffc6cf4cb616b423b930395ffd284688e28 (diff)
downloadgcc-6484413978b4b3ede2bfe2b67c3a64c65bc0f28b.zip
gcc-6484413978b4b3ede2bfe2b67c3a64c65bc0f28b.tar.gz
gcc-6484413978b4b3ede2bfe2b67c3a64c65bc0f28b.tar.bz2
re PR c++/26291 (Invalid ellipsis in operator not diagnosed)
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. From-SVN: r111367
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/decl.c7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/other/ellipsis1.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/operator4.C2
5 files changed, 35 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6a1e2f1..c888a09 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 35dc38c..c803a84 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 6d36553..951bc11 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 0000000..d2501ca
--- /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 9395ccd..054ddc8 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" }