re PR tree-optimization/16876 (ICE on testcase with -O3 in fold-const)

gcc:
	PR tree-optimization/16876
	* c-typeck.c (c_convert_parm_for_inlining): Don't take early
	exit if PARM doesn't match VALUE.

testsuite:
	gcc.dg/noncompile/pr16876.c: New test.

From-SVN: r116424
This commit is contained in:
J"orn Rennecke 2006-08-25 18:51:57 +00:00 committed by Joern Rennecke
parent d718b7aae7
commit e88e0907bd
4 changed files with 35 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2006-08-25 J"orn Rennecke <joern.rennecke@st.com>
PR tree-optimization/16876
* c-typeck.c (c_convert_parm_for_inlining): Don't take early
exit if PARM doesn't match VALUE.
2006-08-25 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.h (ASM_OUTPUT_POOL_PROLOGUE): Do not emit a

View File

@ -4243,7 +4243,7 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
}
/* Convert VALUE for assignment into inlined parameter PARM. ARGNUM
is used for error and waring reporting and indicates which argument
is used for error and warning reporting and indicates which argument
is being processed. */
tree
@ -4251,9 +4251,15 @@ c_convert_parm_for_inlining (tree parm, tree value, tree fn, int argnum)
{
tree ret, type;
/* If FN was prototyped, the value has been converted already
in convert_arguments. */
if (!value || TYPE_ARG_TYPES (TREE_TYPE (fn)))
/* If FN was prototyped at the call site, the value has been converted
already in convert_arguments.
However, we might see a prototype now that was not in place when
the function call was seen, so check that the VALUE actually matches
PARM before taking an early exit. */
if (!value
|| (TYPE_ARG_TYPES (TREE_TYPE (fn))
&& (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
== TYPE_MAIN_VARIANT (TREE_TYPE (value)))))
return value;
type = TREE_TYPE (parm);

View File

@ -1,3 +1,7 @@
2006-08-25 J"orn Rennecke <joern.rennecke@st.com>
gcc.dg/noncompile/pr16876.c: New test.
2006-08-25 Mark Mitchell <mark@codesourcery.com>
PR c++/28056

View File

@ -0,0 +1,15 @@
/* { dg-options "-O -finline-functions" } */
static void g();
struct bigstack {
char space[4096];
};
void f() {
g(0); /* { dg-error "incompatible type for argument 1 of 'g'" } */
}
static void g(struct bigstack bstack) {
g(bstack);
}