+2012-12-08 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/trans.c (Subprogram_Body_to_gnu): Be prepared for a
+ by-ref VAR_DECL in the case of an Out parameter passed by copy.
+
2012-12-05 Robert Dewar <dewar@adacore.com>
* par_sco.adb, sem_prag.adb, put_scos.adb, get_scos.adb: Minor
if (!present_gnu_tree (gnat_param))
{
tree gnu_cico_entry = gnu_cico_list;
+ tree gnu_decl;
/* Skip any entries that have been already filled in; they must
correspond to In Out parameters. */
while (gnu_cico_entry && TREE_VALUE (gnu_cico_entry))
gnu_cico_entry = TREE_CHAIN (gnu_cico_entry);
+ /* Do any needed dereferences for by-ref objects. */
+ gnu_decl = gnat_to_gnu_entity (gnat_param, NULL_TREE, 1);
+ gcc_assert (DECL_P (gnu_decl));
+ if (DECL_BY_REF_P (gnu_decl))
+ gnu_decl = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_decl);
+
/* Do any needed references for padded types. */
TREE_VALUE (gnu_cico_entry)
- = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_entry)),
- gnat_to_gnu_entity (gnat_param, NULL_TREE, 1));
+ = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_entry)), gnu_decl);
}
}
else
2012-12-08 Eric Botcazou <ebotcazou@adacore.com>
+ * gnat.dg/vect10.ad[sb]: New test.
+
+2012-12-08 Eric Botcazou <ebotcazou@adacore.com>
+
* gnat.dg/vect9.ad[sb]: New test.
* gnat.dg/vect9_pkg.ads: New helper.
--- /dev/null
+-- { dg-do compile }
+
+package body Vect10 is
+
+ procedure Add_Mul (X : in out Unit; Y, Z : in Unit) is
+ begin
+ X := X + Y * Z;
+ end;
+ pragma Inline_Always (Add_Mul);
+
+ procedure Proc
+ (F : in Rec_Vector;
+ First_Index : in Natural;
+ Last_Index : in Natural;
+ Result : out Unit)
+ is
+ begin
+ Result := (others => 0.0);
+
+ for I in First_Index + 1 .. Last_Index loop
+ declare
+ Local : Rec renames F (I);
+ begin
+ Add_Mul (Result, Local.Val, Local.Val);
+ end;
+ end loop;
+ end;
+
+end Vect10;
--- /dev/null
+with Vect9_Pkg; use Vect9_Pkg;
+
+package Vect10 is
+
+ type Rec is record
+ Val : Unit;
+ end record;
+
+ type Rec_Vector is array (Positive range <>) of Rec;
+
+ procedure Proc
+ (F : in Rec_Vector;
+ First_Index : in Natural;
+ Last_Index : in Natural;
+ Result : out Unit);
+
+end Vect10;