This patch fixes a bug where an array object initialized with a
concatenation, and that has an aspect_specification for Alignment,
causes the compiler goes into an infinite loop.
Tested on x86_64-pc-linux-gnu, committed on trunk
2019-09-19 Bob Duff <d...@adacore.com>
gcc/ada/
* exp_ch3.adb (Rewrite_As_Renaming): Return False if there are
any aspect specifications, because otherwise Insert_Actions
blows up.
gcc/testsuite/
* gnat.dg/concat3.adb: New testcase.
--- gcc/ada/exp_ch3.adb
+++ gcc/ada/exp_ch3.adb
@@ -6318,7 +6318,8 @@ package body Exp_Ch3 is
-------------------------
function Rewrite_As_Renaming return Boolean is
- begin
+ Result : constant Boolean :=
+
-- If the object declaration appears in the form
-- Obj : Ctrl_Typ := Func (...);
@@ -6336,12 +6337,12 @@ package body Exp_Ch3 is
-- This part is disabled for now, because it breaks GPS builds
- return (False -- ???
- and then Nkind (Expr_Q) = N_Explicit_Dereference
- and then not Comes_From_Source (Expr_Q)
- and then Nkind (Original_Node (Expr_Q)) = N_Function_Call
- and then Nkind (Object_Definition (N)) in N_Has_Entity
- and then (Needs_Finalization (Entity (Object_Definition (N)))))
+ (False -- ???
+ and then Nkind (Expr_Q) = N_Explicit_Dereference
+ and then not Comes_From_Source (Expr_Q)
+ and then Nkind (Original_Node (Expr_Q)) = N_Function_Call
+ and then Nkind (Object_Definition (N)) in N_Has_Entity
+ and then (Needs_Finalization (Entity (Object_Definition (N)))))
-- If the initializing expression is for a variable with attribute
-- OK_To_Rename set, then transform:
@@ -6362,6 +6363,14 @@ package body Exp_Ch3 is
and then Ekind (Entity (Expr_Q)) = E_Variable
and then OK_To_Rename (Entity (Expr_Q))
and then Is_Entity_Name (Obj_Def));
+ begin
+ -- Return False if there are any aspect specifications, because
+ -- otherwise we duplicate that corresponding implicit attribute
+ -- definition, and call Insert_Action, which has no place to insert
+ -- the attribute definition. The attribute definition is stored in
+ -- Aspect_Rep_Item, which is not a list.
+
+ return Result and then No (Aspect_Specifications (N));
end Rewrite_As_Renaming;
-- Local variables
--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/concat3.adb
@@ -0,0 +1,14 @@
+-- { dg-do run }
+-- { dg-options "-g -O0 -gnata" }
+
+procedure Concat3 is
+ procedure Show_Bug (S : in String)
+ is
+ Str : constant String := S & "-" with Alignment => 4;
+ begin
+ null;
+ end Show_Bug;
+
+begin
+ Show_Bug ("BUG");
+end Concat3;
\ No newline at end of file