This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

C++ PATCH: Fix PR 8534


This program was causing conflicting alias sets to be generated on
some systems, due to the fact that the same pointer to member type was
being created more than once.

Tested on i686-pc-linux-gnu, applied on the mainline and on the
branch.

--
Mark Mitchell
CodeSourcery, LLC
mark at codesourcery dot com

2003-03-09  Mark Mitchell  <mark at codesourcery dot com>

	PR c++/8534
	* decl.c (build_ptrmemfunc_type): Do not allow default arugments
	in pointer-to-member-function types.

2003-03-09  Mark Mitchell  <mark at codesourcery dot com>

	PR c++/8534
	* g++.dg/opt/ptrmem1.C: New test.

Index: testsuite/g++.dg/opt/ptrmem1.C
===================================================================
RCS file: testsuite/g++.dg/opt/ptrmem1.C
diff -N testsuite/g++.dg/opt/ptrmem1.C
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/opt/ptrmem1.C	10 Mar 2003 06:18:26 -0000
***************
*** 0 ****
--- 1,12 ----
+ // { dg-options "-O2" }
+ 
+ class QWidget
+ {
+   public: void repaint( bool erase  = 1 );
+ };
+ void f (void)
+ {
+   typedef void (QWidget::*A)(bool);
+   A b = &QWidget::repaint;
+ }
+  
Index: cp/decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v
retrieving revision 1.1016
diff -c -5 -p -r1.1016 decl.c
*** cp/decl.c	9 Mar 2003 14:30:18 -0000	1.1016
--- cp/decl.c	10 Mar 2003 06:18:32 -0000
*************** grokvardecl (tree type,
*** 9294,9307 ****
--- 9294,9345 ----
  tree
  build_ptrmemfunc_type (tree type)
  {
    tree field, fields;
    tree t;
+   tree method_type;
+   tree arg_type;
    tree unqualified_variant = NULL_TREE;
  
    if (type == error_mark_node)
      return type;
+ 
+   /* If the METHOD_TYPE has any default parameters, make a copy that
+      does not have the default parameters.  The pointer-to-member type
+      never has default parameters.  */
+   method_type = TREE_TYPE (type);
+   for (arg_type = TYPE_ARG_TYPES (method_type);
+        arg_type;
+        arg_type = TREE_CHAIN (arg_type))
+     if (TREE_PURPOSE (arg_type))
+       {
+ 	/* At least one parameter has a default argument.  */
+ 	tree arg_types = NULL_TREE;
+ 	tree *arg_type_p = &arg_types;
+ 
+ 	/* Copy the parameter types.  The "this" parameter will be
+ 	   added by build_cplus_method_type.  */
+ 	for (arg_type = TREE_CHAIN (TYPE_ARG_TYPES (method_type));
+ 	     arg_type;
+ 	     arg_type = TREE_CHAIN (arg_type))
+ 	  {
+ 	    if (arg_type == void_list_node)
+ 	      *arg_type_p = void_list_node;
+ 	    else
+ 	      *arg_type_p = build_tree_list (NULL_TREE,
+ 					     TREE_VALUE (arg_type));
+ 	    arg_type_p = &TREE_CHAIN (*arg_type_p);
+ 	  }
+ 	/* Build the new METHOD_TYPE.  */
+ 	method_type = build_cplus_method_type (TYPE_METHOD_BASETYPE (method_type), 
+ 					       TREE_TYPE (method_type), 
+ 					       arg_types);
+ 	/* Build the new POINTER_TYPE.  */
+ 	type = cp_build_qualified_type (build_pointer_type (method_type),
+ 					cp_type_quals (type));
+ 	break;
+       }
  
    /* If a canonical type already exists for this type, use it.  We use
       this method instead of type_hash_canon, because it only does a
       simple equality check on the list of field members.  */
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]