c-decl.c (start_function): Form composite type of function types rather than copying...
authorJoseph Myers <jsm@polyomino.org.uk>
Fri, 23 Jul 2004 19:22:13 +0000 (20:22 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 23 Jul 2004 19:22:13 +0000 (20:22 +0100)
* c-decl.c (start_function): Form composite type of function types
rather than copying type from previous prototype declaration.

testsuite:
* gcc.dg/comp-return-1.c: New test

From-SVN: r85093

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/comp-return-1.c [new file with mode: 0644]

index f5867e40c95578e468c4999245e4eacf87011d92..ce98498f3e99c1a4f735418cbc34a42286bb1d0c 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-23  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * c-decl.c (start_function): Form composite type of function types
+       rather than copying type from previous prototype declaration.
+
 2004-07-23  Janis Johnson  <janis187@us.ibm.com>
 
        * config/rs6000/altivec.h (vec_lvewx, vec_lvehx, vec_lvwbx): Remove
index ac812e3dea7d80428071183f8171149f2e56e8ff..93469d9885f0ea0f0f4f55b486fe89ce91869c4c 100644 (file)
@@ -5712,7 +5712,8 @@ start_function (tree declspecs, tree declarator, tree attributes)
                    TREE_TYPE (TREE_TYPE (old_decl)))
       && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0)
     {
-      TREE_TYPE (decl1) = TREE_TYPE (old_decl);
+      TREE_TYPE (decl1) = composite_type (TREE_TYPE (old_decl),
+                                         TREE_TYPE (decl1));
       current_function_prototype_locus = DECL_SOURCE_LOCATION (old_decl);
     }
 
index 512ac8ec2390533211287ef4d0ee54c0cdfe9398..ad8aacf17a9e2ba6afb0fc3f9c9a8a6d5c065a0f 100644 (file)
@@ -1,3 +1,7 @@
+2004-07-23  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * gcc.dg/comp-return-1.c: New test
+
 2004-07-23  Janis Johnson  <janis187@us.ibm.com>
 
        * gcc.dg/vmx/8-02a.c: Fix typo.
diff --git a/gcc/testsuite/gcc.dg/comp-return-1.c b/gcc/testsuite/gcc.dg/comp-return-1.c
new file mode 100644 (file)
index 0000000..82c3983
--- /dev/null
@@ -0,0 +1,31 @@
+/* When merging a nonprototype definition of a function with a prior
+   prototype declaration, the composite type of the return types must
+   be formed rather than just copying the function type.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+
+typedef int a[];
+typedef int a5[5];
+typedef int a10[10];
+
+a *f1 ();
+a5 *f1 () { return 0; }
+
+a *f2 (void);
+a5 *f2 () { return 0; }
+
+a *f3 ();
+a5 *f3 (void) { return 0; }
+
+a *f4 (void);
+a5 *f4 (void) { return 0; }
+
+void
+g (void)
+{
+  a10 *x;
+  x = f1 (); /* { dg-error "incompatible" "f1" } */
+  x = f2 (); /* { dg-error "incompatible" "f2" } */
+  x = f3 (); /* { dg-error "incompatible" "f3" } */
+  x = f4 (); /* { dg-error "incompatible" "f4" } */
+}