diff options
author | J"orn Rennecke <joern.rennecke@st.com> | 2006-08-25 18:51:57 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 2006-08-25 19:51:57 +0100 |
commit | e88e0907bd713ba3f9b3ebc952dab17b86588f44 (patch) | |
tree | eed397adf865113ef36920dec15715a8ad02e926 | |
parent | d718b7aae71d3d8b46c09a499a9c669a58f2af1f (diff) | |
download | gcc-e88e0907bd713ba3f9b3ebc952dab17b86588f44.zip gcc-e88e0907bd713ba3f9b3ebc952dab17b86588f44.tar.gz gcc-e88e0907bd713ba3f9b3ebc952dab17b86588f44.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-typeck.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/noncompile/pr16876.c | 15 |
4 files changed, 35 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c228c3c..987e7c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index c55bcad..42e01d2 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a3192d..8b2850a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.dg/noncompile/pr16876.c b/gcc/testsuite/gcc.dg/noncompile/pr16876.c new file mode 100644 index 0000000..9587849 --- /dev/null +++ b/gcc/testsuite/gcc.dg/noncompile/pr16876.c @@ -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); +} |