aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-03-19 09:47:14 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-03-19 09:47:14 +0100
commitf735a153482c5fd3b7f4055f910096730ed02f19 (patch)
treef8f50124b7cee68203bee922ac64a4b0c77721a4
parentc1ea78430722efa016fb62d2af76cfdbf31fec02 (diff)
downloadgcc-f735a153482c5fd3b7f4055f910096730ed02f19.zip
gcc-f735a153482c5fd3b7f4055f910096730ed02f19.tar.gz
gcc-f735a153482c5fd3b7f4055f910096730ed02f19.tar.bz2
re PR c/5656 (ICE in emit_move_insn, at expr.c:2748, regression from gcc 3.0)
PR c/5656 * langhooks.h (struct lang_hooks_for_tree_inlining): Add convert_parm_for_inlining. * c-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING): Define. * langhooks-def.h: Likewise. * objc/objc-lang.c: Likewise. * langhooks.c (lhd_tree_inlining_convert_parm_for_inlining): New function. * tree-inline.c (initialize_inlined_parameters): Call convert_parm_for_inlining lang hook if needed. * c-typeck.c (c_convert_parm_for_inlining): New function. * c-tree.h (c_convert_parm_for_inlining): Add prototype. * gcc.c-torture/compile/20020318-1.c: New test. From-SVN: r51025
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/c-lang.c3
-rw-r--r--gcc/c-tree.h1
-rw-r--r--gcc/c-typeck.c24
-rw-r--r--gcc/langhooks-def.h6
-rw-r--r--gcc/langhooks.c12
-rw-r--r--gcc/langhooks.h3
-rw-r--r--gcc/objc/objc-lang.c3
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020318-1.c16
-rw-r--r--gcc/tree-inline.c3
11 files changed, 89 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ecaedd0..795c75f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+2002-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/5656
+ * langhooks.h (struct lang_hooks_for_tree_inlining): Add
+ convert_parm_for_inlining.
+ * c-lang.c (LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING):
+ Define.
+ * langhooks-def.h: Likewise.
+ * objc/objc-lang.c: Likewise.
+ * langhooks.c (lhd_tree_inlining_convert_parm_for_inlining): New
+ function.
+ * tree-inline.c (initialize_inlined_parameters):
+ Call convert_parm_for_inlining lang hook if needed.
+ * c-typeck.c (c_convert_parm_for_inlining): New function.
+ * c-tree.h (c_convert_parm_for_inlining): Add prototype.
+
2002-03-18 Mark Mitchell <mark@codesourcery.com>
* calls.c (precompute_arguments): Do not assume that temporaries
diff --git a/gcc/c-lang.c b/gcc/c-lang.c
index bb26001..325ebd5 100644
--- a/gcc/c-lang.c
+++ b/gcc/c-lang.c
@@ -70,6 +70,9 @@ static void c_post_options PARAMS ((void));
#undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
#define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
anon_aggr_type_p
+#undef LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING
+#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
+ c_convert_parm_for_inlining
/* ### When changing hooks, consider if ObjC needs changing too!! ### */
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index d39e3ff..f01b523 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -270,6 +270,7 @@ extern void c_finish_case PARAMS ((void));
extern tree simple_asm_stmt PARAMS ((tree));
extern tree build_asm_stmt PARAMS ((tree, tree, tree,
tree, tree));
+extern tree c_convert_parm_for_inlining PARAMS ((tree, tree, tree));
/* Set to 0 at beginning of a function definition, set to 1 if
a return statement that specifies a return value is seen. */
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index b284661..1772557 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -4259,6 +4259,30 @@ convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
return error_mark_node;
}
+/* Convert VALUE for assignment into inlined parameter PARM. */
+
+tree
+c_convert_parm_for_inlining (parm, value, fn)
+ tree parm, value, fn;
+{
+ tree ret, type;
+
+ /* If FN was prototyped, the value has been converted already
+ in convert_arguments. */
+ if (! value || TYPE_ARG_TYPES (TREE_TYPE (fn)))
+ return value;
+
+ type = TREE_TYPE (parm);
+ ret = convert_for_assignment (type, value,
+ (char *) 0 /* arg passing */, fn,
+ DECL_NAME (fn), 0);
+ if (PROMOTE_PROTOTYPES
+ && INTEGRAL_TYPE_P (type)
+ && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
+ ret = default_conversion (ret);
+ return ret;
+}
+
/* Print a warning using MSGID.
It gets OPNAME as its one parameter.
If OPNAME is null, it is replaced by "passing arg ARGNUM of `FUNCTION'".
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index ffc86d3..abd2847 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -63,6 +63,7 @@ tree lhd_tree_inlining_copy_res_decl_for_inlining PARAMS ((tree, tree,
int lhd_tree_inlining_anon_aggr_type_p PARAMS ((tree));
int lhd_tree_inlining_start_inlining PARAMS ((tree));
void lhd_tree_inlining_end_inlining PARAMS ((tree));
+tree lhd_tree_inlining_convert_parm_for_inlining PARAMS ((tree, tree, tree));
#define LANG_HOOKS_NAME "GNU unknown"
#define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct lang_identifier)
@@ -107,6 +108,8 @@ void lhd_tree_inlining_end_inlining PARAMS ((tree));
lhd_tree_inlining_start_inlining
#define LANG_HOOKS_TREE_INLINING_END_INLINING \
lhd_tree_inlining_end_inlining
+#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
+ lhd_tree_inlining_convert_parm_for_inlining
#define LANG_HOOKS_TREE_INLINING_INITIALIZER { \
LANG_HOOKS_TREE_INLINING_WALK_SUBTREES, \
@@ -118,7 +121,8 @@ void lhd_tree_inlining_end_inlining PARAMS ((tree));
LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING, \
LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P, \
LANG_HOOKS_TREE_INLINING_START_INLINING, \
- LANG_HOOKS_TREE_INLINING_END_INLINING \
+ LANG_HOOKS_TREE_INLINING_END_INLINING, \
+ LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
} \
/* Tree dump hooks. */
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index a976d74..6be5304 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -277,6 +277,18 @@ lhd_tree_inlining_end_inlining (fn)
{
}
+/* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
+ language-specific conversion before assigning VALUE to PARM. */
+
+tree
+lhd_tree_inlining_convert_parm_for_inlining (parm, value, fndecl)
+ tree parm ATTRIBUTE_UNUSED;
+ tree value;
+ tree fndecl ATTRIBUTE_UNUSED;
+{
+ return value;
+}
+
/* lang_hooks.tree_dump.dump_tree: Dump language-specific parts of tree
nodes. Returns non-zero if it does not want the usual dumping of the
second argument. */
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index c7e43ce..902bb55 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -48,6 +48,9 @@ struct lang_hooks_for_tree_inlining
int (*anon_aggr_type_p) PARAMS ((union tree_node *));
int (*start_inlining) PARAMS ((union tree_node *));
void (*end_inlining) PARAMS ((union tree_node *));
+ union tree_node *(*convert_parm_for_inlining) PARAMS ((union tree_node *,
+ union tree_node *,
+ union tree_node *));
};
/* The following hooks are used by tree-dump.c. */
diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c
index 8f1a68b..d779e69 100644
--- a/gcc/objc/objc-lang.c
+++ b/gcc/objc/objc-lang.c
@@ -64,6 +64,9 @@ static void objc_post_options PARAMS ((void));
#undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P
#define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
anon_aggr_type_p
+#undef LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING
+#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
+ c_convert_parm_for_inlining
/* Each front end provides its own hooks, for toplev.c. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c25a2f4..f5cd64c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-03-19 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c-torture/compile/20020318-1.c: New test.
+
2002-03-18 Jakub Jelinek <jakub@redhat.com>
* g++.dg/opt/conj1.C: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020318-1.c b/gcc/testsuite/gcc.c-torture/compile/20020318-1.c
new file mode 100644
index 0000000..097a35d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020318-1.c
@@ -0,0 +1,16 @@
+/* PR c/5656
+ This testcase ICEd on IA-32 at -O3, due to tree inliner not converting
+ parameter assignment when using K&R syntax. */
+
+void foo (c)
+ char c;
+{
+ (void) &c;
+}
+
+int bar (void);
+
+void baz (void)
+{
+ foo (bar ());
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index ce54884..831f601 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -483,7 +483,8 @@ initialize_inlined_parameters (id, args, fn)
tree cleanup;
/* Find the initializer. */
- value = a ? TREE_VALUE (a) : NULL_TREE;
+ value = (*lang_hooks.tree_inlining.convert_parm_for_inlining)
+ (p, a ? TREE_VALUE (a) : NULL_TREE, fn);
/* If the parameter is never assigned to, we may not need to
create a new variable here at all. Instead, we may be able