This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch for UNSAVE_EXPRs
- To: <gcc-patches at gcc dot gnu dot org>
- Subject: Patch for UNSAVE_EXPRs
- From: Gavin Romig-Koch <gavin at cygnus dot com>
- Date: Fri, 13 Aug 1999 14:59:22 -0400 (EDT)
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;
+ }
+