+2014-10-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * calls.c (expand_call): Do not use the target as the return slot if
+ it is not sufficiently aligned.
+
2014-10-06 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* config/rs6000/rs6000.c (analyze_swaps commentary): Add
{
struct_value_size = int_size_in_bytes (rettype);
- if (target && MEM_P (target) && CALL_EXPR_RETURN_SLOT_OPT (exp))
+ /* Even if it is semantically safe to use the target as the return
+ slot, it may be not sufficiently aligned for the return type. */
+ if (CALL_EXPR_RETURN_SLOT_OPT (exp)
+ && target
+ && MEM_P (target)
+ && !(MEM_ALIGN (target) < TYPE_ALIGN (rettype)
+ && SLOW_UNALIGNED_ACCESS (TYPE_MODE (rettype),
+ MEM_ALIGN (target))))
structure_value_addr = XEXP (target, 0);
else
{
+2014-10-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/return4.adb: New test.
+ * gnat.dg/return4_pkg.ad[sb]: New helper.
+
2014-10-06 Edward Smith-Rowland <3dw4rd@verizon.net>
* g++.dg/cpp1y/attr-deprecated-neg.C: Attribute no longer ignored.
--- /dev/null
+-- { dg-do run }
+-- { dg-options "-O" }
+
+with Return4_Pkg; use Return4_Pkg;
+
+procedure Return4 is
+
+ type Local_Rec is record
+ C : Character;
+ R : Rec;
+ end record;
+ pragma Pack (Local_Rec);
+
+ L : Local_Rec;
+ for L'Alignment use 2;
+
+begin
+ L.R := Get_Value (0);
+ if L.R.I1 /= 0 then
+ raise Program_Error;
+ end if;
+end;
--- /dev/null
+package body Return4_Pkg is
+
+ function Get_Value (I : Integer) return Rec is
+ Value : Rec := (I1 => I, I2 => I, I3 => I);
+ begin
+ return Value;
+ end;
+
+end Return4_Pkg;
--- /dev/null
+package Return4_Pkg is
+
+ type Rec is record
+ I1, I2, I3 : Integer;
+ end record;
+
+ function Get_Value (I : Integer) return Rec;
+
+end Return4_Pkg;