cgraphunit.c (cgraph_node::expand_thunk): When expanding a GIMPLE thunk that returns...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 23 Jan 2019 11:07:56 +0000 (11:07 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 23 Jan 2019 11:07:56 +0000 (11:07 +0000)
* cgraphunit.c (cgraph_node::expand_thunk): When expanding a GIMPLE
thunk that returns by reference, use the type of the return object
of the thunk instead of that of the alias to build the dereference.

From-SVN: r268182

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/opt4.ads [new file with mode: 0644]

index f1522be..ef29cb0 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-23  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * cgraphunit.c (cgraph_node::expand_thunk): When expanding a GIMPLE
+       thunk that returns by reference, use the type of the return object
+       of the thunk instead of that of the alias to build the dereference.
+
 2019-01-23  Vineet Gupta  <vgupta@synopsys.com>
 
        * config/arc/atomic.md: Add operand to DMB instruction.
index 1cf9ac5..a7c9b9a 100644 (file)
@@ -1916,10 +1916,9 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
              restmp = gimple_fold_indirect_ref (resdecl);
              if (!restmp)
                restmp = build2 (MEM_REF,
-                                TREE_TYPE (TREE_TYPE (DECL_RESULT (alias))),
+                                TREE_TYPE (TREE_TYPE (resdecl)),
                                 resdecl,
-                                build_int_cst (TREE_TYPE
-                                  (DECL_RESULT (alias)), 0));
+                                build_int_cst (TREE_TYPE (resdecl), 0));
            }
          else if (!is_gimple_reg_type (restype))
            {
index 164c9bc..b1ad372 100644 (file)
@@ -1,3 +1,7 @@
+2019-01-23  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/specs/opt4.ads: New test.
+
 2019-01-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/88964
diff --git a/gcc/testsuite/gnat.dg/specs/opt4.ads b/gcc/testsuite/gnat.dg/specs/opt4.ads
new file mode 100644 (file)
index 0000000..b391950
--- /dev/null
@@ -0,0 +1,25 @@
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+package Opt4 is
+
+   type Rec (D : Boolean := False) is record
+      case D is
+         when False => null;
+         when True => I : Integer;
+      end case;
+   end record;
+
+   Null_Rec : constant Rec := (D => False);
+
+   type I1 is limited interface;
+
+   type I2 is limited interface;
+
+   function Func (Data : I2) return Rec is abstract;
+
+   type Ext is limited new I1 and I2 with null record;
+
+   overriding function Func (Data : Ext) return Rec is (Null_Rec);
+
+end Opt4;