diff options
author | J"orn Rennecke <joern.rennecke@st.com> | 2006-08-25 18:51:57 +0000 |
---|---|---|
committer | J"orn Rennecke <joern.rennecke@st.com> | 2006-08-25 18:51:57 +0000 |
commit | c6e283eda44ad7d9ea9b019debb4828885021278 (patch) | |
tree | eed397adf865113ef36920dec15715a8ad02e926 | |
parent | 005423b659972a167837efc3baff1c158f963809 (diff) |
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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@116424 138bc75d-0d04-0410-961f-82ee72b054a4
-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 c228c3c3626..987e7c29c36 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 c55bcad89c9..42e01d2af52 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 2a3192d9a44..8b2850a34e0 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 00000000000..9587849b2fc --- /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); +} |