OSDN Git Service

* c-typeck.c (enum impl_conv): Add ic_argpass_nonproto.
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Oct 2004 19:52:04 +0000 (19:52 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Oct 2004 19:52:04 +0000 (19:52 +0000)
(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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88784 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/assign-warn-3.c [new file with mode: 0644]

index 3f1b1a7..1b644f4 100644 (file)
@@ -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
index 64669c8..5fe3b9d 100644 (file)
@@ -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)
index bf8231b..82f1f09 100644 (file)
@@ -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 (file)
index 0000000..1463fce
--- /dev/null
@@ -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" } */