re PR c/3116 (Bug with using oldstyle prototype declarations)
authorJoseph Myers <jsm28@cam.ac.uk>
Mon, 11 Jun 2001 13:26:19 +0000 (14:26 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Mon, 11 Jun 2001 13:26:19 +0000 (14:26 +0100)
* c-decl.c (store_parm_decls): When comparing types in an
old-style function declaration with those from a previous
prototype, compare the unqualified versions of parameter types.
Fixes PR c/3116.

testsuite:
* gcc.c-torture/compile/20010611-1.c: New test.

From-SVN: r43186

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20010611-1.c [new file with mode: 0644]

index 20948adc2287e1465fa5cbec8a609c3c2ed81e9e..c39562b2ca44b593ed8824b849c031b3e9a9363f 100644 (file)
@@ -1,3 +1,10 @@
+2001-06-11  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * c-decl.c (store_parm_decls): When comparing types in an
+       old-style function declaration with those from a previous
+       prototype, compare the unqualified versions of parameter types.
+       Fixes PR c/3116.
+
 2001-06-11  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * doc/objc.texi: Use more logical markup.  Use TeX dashes.
index b68f7721a587dc9de04cff844a65e1272fcc6eb8..5d50394d551e0202554c9616fb72b4a0ebf22cb6 100644 (file)
@@ -6436,9 +6436,11 @@ store_parm_decls ()
                                            "prototype declaration");
                  break;
                }
-             /* Type for passing arg must be consistent
-                with that declared for the arg.  */
-             if (! comptypes (DECL_ARG_TYPE (parm), TREE_VALUE (type)))
+             /* Type for passing arg must be consistent with that
+                declared for the arg.  ISO C says we take the unqualified
+                type for parameters declared with qualified type.  */
+             if (! comptypes (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm)),
+                              TYPE_MAIN_VARIANT (TREE_VALUE (type))))
                {
                  if (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
                      == TYPE_MAIN_VARIANT (TREE_VALUE (type)))
index d1255208049272a2c2690d09b182be396e505911..fd0720c740be63462418e3ac7160e054f6c3bb32 100644 (file)
@@ -1,3 +1,7 @@
+2001-06-11  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * gcc.c-torture/compile/20010611-1.c: New test.
+
 2001-06-11  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * gcc.dg/c99-tag-1.c: Add more tests.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20010611-1.c b/gcc/testsuite/gcc.c-torture/compile/20010611-1.c
new file mode 100644 (file)
index 0000000..87723bd
--- /dev/null
@@ -0,0 +1,24 @@
+/* Origin: PR c/3116 from Andreas Jaeger <aj@suse.de>.  */
+/* When determining type compatibility of function types, we must remove
+   qualifiers from argument types.  We used to fail to do this properly
+   in store_parm_decls when comparing prototype and non-prototype
+   declarations.  */
+struct _IO_FILE {
+  int _flags;
+};
+
+typedef struct _IO_FILE __FILE;
+typedef struct _IO_FILE _IO_FILE;
+typedef long int wchar_t;
+
+extern wchar_t *fgetws (wchar_t *__restrict __ws, int __n,
+                        __FILE *__restrict __stream);
+
+wchar_t *
+fgetws (buf, n, fp)
+     wchar_t *buf;
+     int n;
+     _IO_FILE *fp;
+{
+  return (wchar_t *)0;
+}