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]

Patch for UNSAVE_EXPRs



I've reciently commited this patch to correct a bug in g++'s handing
of UNSAVE_EXPRs.  It was approved by Jason Merrill and Jim Wilson.


For gcc:
	tree.c (lang_unsave_expr_now) : New.
	(unsave_expr_now): Call lang_unsave_expr_now.
	tree.h (lang_unsave_expr_now) : New.

For gcc/cp:
	cp-tree.h (init_cplus_unsave): New.
	(cplus_unsave_expr_now): New.
	lex.c (init_parse): Call init_cplus_unsave.
	tree.c (init_cplus_unsave): New.
	(cplus_unsave_expr_now): New.

Index: gcc/tree.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/tree.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -c -p -r1.67 -r1.68
*** tree.c	1999/08/04 20:47:45	1.67
--- tree.c	1999/08/13 18:22:52	1.68
*************** static void build_real_from_int_cst_1 PR
*** 269,274 ****
--- 269,278 ----
  extern char *mode_name[];
  
  void gcc_obstack_init ();
+ 
+ /* If non-null, a language specific helper for unsave_expr_now. */
+ 
+ int (*lang_unsave_expr_now) PROTO((tree));
  
  /* Init the principal obstacks.  */
  
*************** first_rtl_op (code)
*** 2426,2432 ****
  }
  
  /* Modify a tree in place so that all the evaluate only once things
!    are cleared out.  Return the EXPR given.  */
  
  tree
  unsave_expr_now (expr)
--- 2430,2440 ----
  }
  
  /* Modify a tree in place so that all the evaluate only once things
!    are cleared out.  Return the EXPR given.  
! 
!    LANG_UNSAVE_EXPR_NOW, if set, is a pointer to a function to handle
!    language specific nodes.
! */
  
  tree
  unsave_expr_now (expr)
*************** unsave_expr_now (expr)
*** 2473,2478 ****
--- 2481,2488 ----
        break;
  
      default:
+       if (lang_unsave_expr_now)
+ 	(*lang_unsave_expr_now) (expr);
        break;
      }
  
Index: gcc/tree.h
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/tree.h,v
retrieving revision 1.76
retrieving revision 1.77
diff -c -p -r1.76 -r1.77
*** tree.h	1999/08/09 23:38:41	1.76
--- tree.h	1999/08/13 18:22:53	1.77
*************** extern tree unsave_expr			PROTO((tree));
*** 1714,1719 ****
--- 1714,1723 ----
  
  extern tree unsave_expr_now		PROTO((tree));
  
+ /* If non-null, a language specific helper for unsave_expr_now. */
+ 
+ extern int (*lang_unsave_expr_now)      PROTO((tree));
+   
  /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
     or offset that depends on a field within a record.
  
Index: gcc/cp/cp-tree.h
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/cp-tree.h,v
retrieving revision 1.261
retrieving revision 1.262
diff -c -p -r1.261 -r1.262
*** cp-tree.h	1999/08/12 06:52:27	1.261
--- cp-tree.h	1999/08/13 18:22:58	1.262
*************** extern int yylex				PROTO((void));
*** 3350,3355 ****
--- 3350,3357 ----
  extern tree arbitrate_lookup			PROTO((tree, tree, tree));
  
  /* in tree.c */
+ extern void init_cplus_unsave			PROTO((void));
+ extern tree cplus_unsave_expr_now               PROTO((tree));
  extern int pod_type_p				PROTO((tree));
  extern void unshare_base_binfos			PROTO((tree));
  extern int member_p				PROTO((tree));
Index: gcc/cp/lex.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/lex.c,v
retrieving revision 1.133
retrieving revision 1.134
diff -c -p -r1.133 -r1.134
*** lex.c	1999/08/11 20:22:26	1.133
--- lex.c	1999/08/13 18:22:59	1.134
*************** init_parse (filename)
*** 524,529 ****
--- 524,530 ----
    set_identifier_size (sizeof (struct lang_identifier));
    decl_printable_name = lang_printable_name;
  
+   init_cplus_unsave ();
    init_cplus_expand ();
  
    bcopy (cplus_tree_code_type,
Index: gcc/cp/tree.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/cp/tree.c,v
retrieving revision 1.127
retrieving revision 1.128
diff -c -p -r1.127 -r1.128
*** tree.c	1999/08/11 20:22:39	1.127
--- tree.c	1999/08/13 18:22:59	1.128
*************** make_ptrmem_cst (type, member)
*** 2859,2861 ****
--- 2859,2899 ----
    return ptrmem_cst;
  }
  
+ /* Initialize unsave for C++. */
+ void
+ init_cplus_unsave ()
+ {
+   lang_unsave_expr_now = cplus_unsave_expr_now;
+ }
+ 
+ /* The C++ version of unsave_expr_now.
+    See gcc/tree.c:unsave_expr_now for comments. */
+ 
+ tree
+ cplus_unsave_expr_now (expr)
+      tree expr;
+ {
+   if (expr == NULL)
+     return expr;
+ 
+   else if (TREE_CODE (expr) == AGGR_INIT_EXPR)
+     {
+       unsave_expr_now (TREE_OPERAND (expr,0));
+       if (TREE_OPERAND (expr, 1)
+ 	  && TREE_CODE (TREE_OPERAND (expr, 1)) == TREE_LIST)
+ 	{
+ 	  tree exp = TREE_OPERAND (expr, 1);
+ 	  while (exp)
+ 	    {
+ 	      unsave_expr_now (TREE_VALUE (exp));
+ 	      exp = TREE_CHAIN (exp);
+ 	    }
+ 	}
+       unsave_expr_now (TREE_OPERAND (expr,2));
+       return expr;
+     }
+ 
+   else
+     return expr;
+ }
+ 


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