From 6dcc04b0603acb478023cd019af32eb5ca99e85f Mon Sep 17 00:00:00 2001
From: Joseph Myers <jsm@polyomino.org.uk>
Date: Fri, 8 Oct 2004 20:52:04 +0100
Subject: [PATCH] c-typeck.c (enum impl_conv): Add ic_argpass_nonproto.

	* c-typeck.c (enum impl_conv): Add ic_argpass_nonproto.
	(convert_for_assignment): Handle ic_argpass_nonproto.  Add
	comments about its relevance to errors.
	(c_convert_parm_for_inlining): Use ic_argpass_nonproto.

testsuite:
	* gcc.dg/assign-warn-3.c: New test.

From-SVN: r88784
---
 gcc/ChangeLog                        |  7 +++++++
 gcc/c-typeck.c                       | 20 +++++++++++++++++---
 gcc/testsuite/ChangeLog              |  4 ++++
 gcc/testsuite/gcc.dg/assign-warn-3.c | 13 +++++++++++++
 4 files changed, 41 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/assign-warn-3.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3f1b1a7909b6..1b644f4b42c9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-10-08  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+	* c-typeck.c (enum impl_conv): Add ic_argpass_nonproto.
+	(convert_for_assignment): Handle ic_argpass_nonproto.  Add
+	comments about its relevance to errors.
+	(c_convert_parm_for_inlining): Use ic_argpass_nonproto.
+
 2004-10-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	PR c/16999
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 64669c88ca38..5fe3b9d19c77 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -59,6 +59,7 @@ enum lvalue_use {
    diagnostic messages in convert_for_assignment.  */
 enum impl_conv {
   ic_argpass,
+  ic_argpass_nonproto,
   ic_assign,
   ic_init,
   ic_return
@@ -3435,7 +3436,7 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
   enum tree_code coder;
   tree rname = NULL_TREE;
 
-  if (errtype == ic_argpass)
+  if (errtype == ic_argpass || errtype == ic_argpass_nonproto)
     {
       tree selector;
       /* Change pointer to function to the function itself for
@@ -3464,6 +3465,9 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
       case ic_argpass:				\
 	pedwarn (AR, parmnum, rname);		\
 	break;					\
+      case ic_argpass_nonproto:			\
+	warning (AR, parmnum, rname);		\
+	break;					\
       case ic_assign:				\
 	pedwarn (AS);				\
 	break;					\
@@ -3509,6 +3513,11 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
 
   if (coder == VOID_TYPE)
     {
+      /* Except for passing an argument to an unprototyped function,
+	 this is a constraint violation.  When passing an argument to
+	 an unprototyped function, it is compile-time undefined;
+	 making it a constraint in that case was rejected in
+	 DR#252.  */
       error ("void value not ignored as it ought to be");
       return error_mark_node;
     }
@@ -3554,7 +3563,7 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
   /* Conversion to a transparent union from its member types.
      This applies only to function arguments.  */
   else if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type)
-	   && errtype == ic_argpass)
+	   && (errtype == ic_argpass || errtype == ic_argpass_nonproto))
     {
       tree memb_types;
       tree marginal_memb_type = 0;
@@ -3760,6 +3769,8 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
     }
   else if (codel == POINTER_TYPE && coder == ARRAY_TYPE)
     {
+      /* ??? This should not be an error when inlining calls to
+	 unprototyped functions.  */
       error ("invalid use of non-lvalue array");
       return error_mark_node;
     }
@@ -3803,6 +3814,9 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
   switch (errtype)
     {
     case ic_argpass:
+    case ic_argpass_nonproto:
+      /* ??? This should not be an error when inlining calls to
+	 unprototyped functions.  */
       error ("incompatible type for argument %d of %qE", parmnum, rname);
       break;
     case ic_assign:
@@ -3837,7 +3851,7 @@ c_convert_parm_for_inlining (tree parm, tree value, tree fn, int argnum)
 
   type = TREE_TYPE (parm);
   ret = convert_for_assignment (type, value,
-				ic_argpass, fn,
+				ic_argpass_nonproto, fn,
 				fn, argnum);
   if (targetm.calls.promote_prototypes (TREE_TYPE (fn))
       && INTEGRAL_TYPE_P (type)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bf8231b73574..82f1f09d14c0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-10-08  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+	* gcc.dg/assign-warn-3.c: New test.
+
 2004-10-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	PR c/16999
diff --git a/gcc/testsuite/gcc.dg/assign-warn-3.c b/gcc/testsuite/gcc.dg/assign-warn-3.c
new file mode 100644
index 000000000000..1463fce0f68d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/assign-warn-3.c
@@ -0,0 +1,13 @@
+/* Test diagnostics for bad type conversion when inlining unprototyped
+   functions: should not be errors with -pedantic-errors.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-O3 -std=c99 -pedantic-errors" } */
+
+/* This is valid to execute, so maybe shouldn't warn at all.  */
+void f0(x) signed char *x; { }
+void g0(unsigned char *x) { f0(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f0' differ in signedness" } */
+
+/* This is undefined on execution but still must compile.  */
+void f1(x) int *x; { }
+void g1(unsigned int *x) { f1(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f1' differ in signedness" } */
-- 
GitLab