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