aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@st.com>2006-08-25 18:51:57 +0000
committerJ"orn Rennecke <joern.rennecke@st.com>2006-08-25 18:51:57 +0000
commitc6e283eda44ad7d9ea9b019debb4828885021278 (patch)
treeeed397adf865113ef36920dec15715a8ad02e926
parent005423b659972a167837efc3baff1c158f963809 (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/ChangeLog6
-rw-r--r--gcc/c-typeck.c14
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/noncompile/pr16876.c15
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);
+}