[patch] Fix PR c++/27278: ICE with invalid operator declaration

Volker Reichelt reichelt@igpm.rwth-aachen.de
Sun Apr 30 10:45:00 GMT 2006


On 28 Apr, Mark Mitchell wrote:
> Volker Reichelt wrote:
> 
>> I could have checked for error_mark_nodes in this loop. However, the
>> patch below goes for the more drastic fix and skips the whole function
>> on invalid arguments. This prevents future ICEs in that function and
>> bogus error messages based on bad guesses what was intended by the
>> invalid arguments.
> * decl.c (grok_op_properties): Skip operators with invalid args.
> 
> I think this is dangerous; we'll now have operators around, without
> appropriate properties set.  For example, we'll not call
> SET_OVERLOADED_OPERATOR_CODE on an operator.  I think that in this case,
> the safer fix is to do as you suggest: check for error_mark_node in the
> loop, and return.
> 
> That patch is pre-approved.

So here's what I committed to mainline, 4.1 branch and 4.0 branch.
Bootstrapped and regtested on x86_64-unknown-linux-gnu.

Regards,
Volker


2006-04-30  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>

	PR c++/27278
	* decl.c (grok_op_properties): Skip operators with invalid args
	when checking for class-type or enum-type args.

===================================================================
--- gcc/gcc/cp/decl.c	2006-04-23 04:48:46 +0200
+++ gcc/gcc/cp/decl.c	2006-04-23 04:49:17 +0200
@@ -9072,6 +9072,9 @@ grok_op_properties (tree decl, bool comp
 	      for (p = argtypes; p && p != void_list_node; p = TREE_CHAIN (p))
 		{
 		  tree arg = non_reference (TREE_VALUE (p));
+		  if (arg == error_mark_node)
+		    return;
+
 		  /* IS_AGGR_TYPE, rather than CLASS_TYPE_P, is used
 		     because these checks are performed even on
 		     template functions.  */
===================================================================

2006-04-30  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>

	PR c++/27278
	* g++.dg/parse/operator7.C: New test.

===================================================================
--- gcc/gcc/testsuite/g++.dg/parse/operator7.C	2005-08-29 00:25:44 +0200
+++ gcc/gcc/testsuite/g++.dg/parse/operator7.C	2006-04-24 11:36:49 +0200
@@ -0,0 +1,4 @@
+// PR c++/27278
+// { dg-do compile }
+
+int operator+(void,void);  // { dg-error "incomplete type|invalid use" }
===================================================================




More information about the Gcc-patches mailing list