mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
Ada: Fix internal error on pragma Machine_Attribute with string constant
This was reported a long time ago and is a fairly pathological case, so the fix is purposely ad hoc: when the attribute name of a pragma Machine_Attribute is not a string literal, its processing needs to be delayed for the back-end. gcc/ada/ PR ada/13370 * sem_prag.adb (Analyze_Pragma) <Pragma_Machine_Attribute>: Set the Has_Delayed_Freeze flag if the argument is not a literal. gcc/testsuite/ * gnat.dg/machine_attr3.ads, gnat.dg/machine_attr3.adb: New test.
This commit is contained in:
@@ -21867,8 +21867,17 @@ package body Sem_Prag is
|
||||
|
||||
if Rep_Item_Too_Late (Def_Id, N) then
|
||||
return;
|
||||
else
|
||||
Set_Has_Gigi_Rep_Item (Def_Id);
|
||||
end if;
|
||||
|
||||
Set_Has_Gigi_Rep_Item (Def_Id);
|
||||
|
||||
-- The pragma is processed directly by the back end when Def_Id is
|
||||
-- translated. If the argument is not a string literal, it may be
|
||||
-- declared after Def_Id and before the pragma, which requires the
|
||||
-- processing of Def_Id to be delayed for the back end.
|
||||
|
||||
if Nkind (Get_Pragma_Arg (Arg2)) /= N_String_Literal then
|
||||
Set_Has_Delayed_Freeze (Def_Id);
|
||||
end if;
|
||||
end Machine_Attribute;
|
||||
|
||||
|
||||
7
gcc/testsuite/gnat.dg/machine_attr3.adb
Normal file
7
gcc/testsuite/gnat.dg/machine_attr3.adb
Normal file
@@ -0,0 +1,7 @@
|
||||
-- { dg-do compile }
|
||||
|
||||
package body Machine_Attr3 is
|
||||
|
||||
procedure Proc is null;
|
||||
|
||||
end Machine_Attr3;
|
||||
10
gcc/testsuite/gnat.dg/machine_attr3.ads
Normal file
10
gcc/testsuite/gnat.dg/machine_attr3.ads
Normal file
@@ -0,0 +1,10 @@
|
||||
package Machine_Attr3 is
|
||||
|
||||
procedure Proc;
|
||||
|
||||
private
|
||||
|
||||
Attr : constant String := "nothrow";
|
||||
pragma Machine_Attribute (Proc, Attr);
|
||||
|
||||
end Machine_Attr3;
|
||||
Reference in New Issue
Block a user