re PR c/30762 (IMA messes up with inlining)
authorJakub Jelinek <jakub@redhat.com>
Mon, 19 Mar 2007 23:26:14 +0000 (00:26 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 19 Mar 2007 23:26:14 +0000 (00:26 +0100)
PR c/30762
* c-typeck.c (convert_for_assignment): Call comptypes for
RECORD_TYPE or UNION_TYPE.

* gcc.dg/pr30762-1.c: New test.
* gcc.dg/pr30762-2.c: New test.

From-SVN: r123073

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr30762-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr30762-2.c [new file with mode: 0644]

index dc56f6d..849ab90 100644 (file)
@@ -1,5 +1,9 @@
 2007-03-20  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c/30762
+       * c-typeck.c (convert_for_assignment): Call comptypes for
+       RECORD_TYPE or UNION_TYPE.
+
        PR inline-asm/30505
        * reload1.c (reload): Do invalid ASM checking after
        cleanup_subreg_operands.
index 6986405..5976cb2 100644 (file)
@@ -3896,10 +3896,16 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
               || coder == BOOLEAN_TYPE))
     return convert_and_check (type, rhs);
 
+  /* Aggregates in different TUs might need conversion.  */
+  if ((codel == RECORD_TYPE || codel == UNION_TYPE)
+      && codel == coder
+      && comptypes (type, rhstype))
+    return convert_and_check (type, rhs);
+
   /* 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_nonproto))
+  if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type)
+      && (errtype == ic_argpass || errtype == ic_argpass_nonproto))
     {
       tree memb, marginal_memb = NULL_TREE;
 
index 9a6607f..0e772e4 100644 (file)
@@ -1,5 +1,9 @@
 2007-03-20  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c/30762
+       * gcc.dg/pr30762-1.c: New test.
+       * gcc.dg/pr30762-2.c: New test.
+
        PR inline-asm/30505
        * gcc.target/i386/pr30505.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr30762-1.c b/gcc/testsuite/gcc.dg/pr30762-1.c
new file mode 100644 (file)
index 0000000..97dca8c
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR c/30762 */
+/* { dg-do compile } */
+/* { dg-options "--combine -O3" } */
+/* { dg-additional-sources pr30762-2.c } */
+
+typedef struct { int i; } D;
+extern void foo (D);
+
+void
+bar (void)
+{
+  D d;
+  d.i = 1;
+  foo (d);
+}
diff --git a/gcc/testsuite/gcc.dg/pr30762-2.c b/gcc/testsuite/gcc.dg/pr30762-2.c
new file mode 100644 (file)
index 0000000..7e914eb
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR c/30762 */
+/* { dg-do compile } */
+
+typedef struct { int i; } D;
+
+void
+foo (D x)
+{
+}