summaryrefslogtreecommitdiff
path: root/gcc/ada/sem_prag.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/sem_prag.adb')
-rw-r--r--gcc/ada/sem_prag.adb248
1 files changed, 187 insertions, 61 deletions
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 8195c8bc8ad..7432a3bd04c 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -41,6 +41,7 @@ with Lib; use Lib;
with Lib.Writ; use Lib.Writ;
with Lib.Xref; use Lib.Xref;
with Namet; use Namet;
+with Namet.Sp; use Namet.Sp;
with Nlists; use Nlists;
with Nmake; use Nmake;
with Opt; use Opt;
@@ -77,8 +78,6 @@ with Uintp; use Uintp;
with Urealp; use Urealp;
with Validsw; use Validsw;
-with GNAT.Spelling_Checker; use GNAT.Spelling_Checker;
-
package body Sem_Prag is
----------------------------------------------
@@ -91,12 +90,12 @@ package body Sem_Prag is
-- form and processing:
-- pragma Export_xxx
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, other optional parameters ]);
-- pragma Import_xxx
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, other optional parameters ]);
@@ -420,7 +419,7 @@ package body Sem_Prag is
procedure Error_Pragma (Msg : String);
pragma No_Return (Error_Pragma);
- -- Outputs error message for current pragma. The message contains an %
+ -- Outputs error message for current pragma. The message contains a %
-- that will be replaced with the pragma name, and the flag is placed
-- on the pragma itself. Pragma_Exit is then raised.
@@ -1725,8 +1724,7 @@ package body Sem_Prag is
for Index1 in Names'Range loop
if Is_Bad_Spelling_Of
- (Get_Name_String (Chars (Arg)),
- Get_Name_String (Names (Index1)))
+ (Chars (Arg), Names (Index1))
then
Error_Msg_Name_1 := Names (Index1);
Error_Msg_N ("\possible misspelling of%", Arg);
@@ -2267,6 +2265,8 @@ package body Sem_Prag is
Error_Pragma ("enumeration literal not allowed for pragma%");
end if;
+ -- Check for rep item appearing too early or too late
+
if Etype (E) = Any_Type
or else Rep_Item_Too_Early (E, N)
then
@@ -2353,10 +2353,6 @@ package body Sem_Prag is
E1 := Homonym (E1);
exit when No (E1) or else Scope (E1) /= Current_Scope;
- -- Note: below we are missing a check for Rep_Item_Too_Late.
- -- That is deliberate, we cannot chain the rep item on more
- -- than one Rep_Item chain, to be fixed later ???
-
if Comes_From_Source (E1)
and then Comp_Unit = Get_Source_Unit (E1)
and then Nkind (Original_Node (Parent (E1))) /=
@@ -2821,7 +2817,6 @@ package body Sem_Prag is
if Is_Generic_Subprogram (Entity (Arg_Internal)) then
Error_Pragma
("pragma% cannot be given for generic subprogram");
-
else
Error_Pragma
("pragma% does not identify local subprogram");
@@ -3345,7 +3340,8 @@ package body Sem_Prag is
-- corresponding body, if there is one present.
procedure Set_Inline_Flags (Subp : Entity_Id);
- -- Sets Is_Inlined and Has_Pragma_Inline flags for Subp
+ -- Sets Is_Inlined and Has_Pragma_Inline flags for Subp and also
+ -- Has_Pragma_Inline_Always for the Inline_Always case.
function Inlining_Not_Possible (Subp : Entity_Id) return Boolean;
-- Returns True if it can be determined at this stage that inlining
@@ -3354,6 +3350,7 @@ package body Sem_Prag is
-- get undefined symbols at link time. This function also emits a
-- warning if front-end inlining is enabled and the pragma appears
-- too late.
+ --
-- ??? is business with link symbols still valid, or does it relate
-- to front end ZCX which is being phased out ???
@@ -3417,7 +3414,16 @@ package body Sem_Prag is
Inner_Subp : Entity_Id := Subp;
begin
+ -- Ignore if bad type, avoid cascaded error
+
if Etype (Subp) = Any_Type then
+ Applies := True;
+ return;
+
+ -- Ignore if all inlining is suppressed
+
+ elsif Suppress_All_Inlining then
+ Applies := True;
return;
-- If inlining is not possible, for now do not treat as an error
@@ -3515,10 +3521,12 @@ package body Sem_Prag is
if not Has_Pragma_Inline (Subp) then
Set_Has_Pragma_Inline (Subp);
- Set_Next_Rep_Item (N, First_Rep_Item (Subp));
- Set_First_Rep_Item (Subp, N);
Effective := True;
end if;
+
+ if Prag_Id = Pragma_Inline_Always then
+ Set_Has_Pragma_Inline_Always (Subp);
+ end if;
end Set_Inline_Flags;
-- Start of processing for Process_Inline
@@ -3565,6 +3573,7 @@ package body Sem_Prag is
elsif not Effective
and then Warn_On_Redundant_Constructs
+ and then not Suppress_All_Inlining
then
if Inlining_Not_Possible (Subp) then
Error_Msg_NE
@@ -4519,15 +4528,13 @@ package body Sem_Prag is
if not Is_Pragma_Name (Chars (N)) then
if Warn_On_Unrecognized_Pragma then
Error_Msg_Name_1 := Chars (N);
- Error_Msg_N ("?unrecognized pragma%!", N);
+ Error_Msg_N ("?unrecognized pragma%!", Pragma_Identifier (N));
for PN in First_Pragma_Name .. Last_Pragma_Name loop
- if Is_Bad_Spelling_Of
- (Get_Name_String (Chars (N)),
- Get_Name_String (PN))
- then
+ if Is_Bad_Spelling_Of (Chars (N), PN) then
Error_Msg_Name_1 := PN;
- Error_Msg_N ("\?possible misspelling of %!", N);
+ Error_Msg_N
+ ("\?possible misspelling of %!", Pragma_Identifier (N));
exit;
end if;
end loop;
@@ -4796,6 +4803,7 @@ package body Sem_Prag is
when Pragma_Assert => Assert : declare
Expr : Node_Id;
+ Eloc : Source_Ptr;
begin
Ada_2005_Pragma;
@@ -4816,23 +4824,30 @@ package body Sem_Prag is
-- null;
-- end if;
- -- The reason we do this rewriting during semantic analysis
- -- rather than as part of normal expansion is that we cannot
- -- analyze and expand the code for the boolean expression
- -- directly, or it may cause insertion of actions that would
- -- escape the attempt to suppress the assertion code.
+ -- The reason we do this rewriting during semantic analysis rather
+ -- than as part of normal expansion is that we cannot analyze and
+ -- expand the code for the boolean expression directly, or it may
+ -- cause insertion of actions that would escape the attempt to
+ -- suppress the assertion code.
+
+ -- Note that the Sloc for the if statement corresponds to the
+ -- argument condition, not the pragma itself. The reason for this
+ -- is that we may generate a warning if the condition is False at
+ -- compile time, and we do not want to delete this warning when we
+ -- delete the if statement.
Expr := Expression (Arg1);
+ Eloc := Sloc (Expr);
if Expander_Active and not Assertions_Enabled then
Rewrite (N,
- Make_If_Statement (Loc,
+ Make_If_Statement (Eloc,
Condition =>
- Make_And_Then (Loc,
- Left_Opnd => New_Occurrence_Of (Standard_False, Loc),
+ Make_And_Then (Eloc,
+ Left_Opnd => New_Occurrence_Of (Standard_False, Eloc),
Right_Opnd => Expr),
Then_Statements => New_List (
- Make_Null_Statement (Loc))));
+ Make_Null_Statement (Eloc))));
Analyze (N);
@@ -5284,7 +5299,7 @@ package body Sem_Prag is
-------------------
-- pragma Common_Object (
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Size =>] EXTERNAL_SYMBOL]);
@@ -5372,8 +5387,8 @@ package body Sem_Prag is
or else Etype (Ent) /= Etype (Next_Entity (Ent))
then
Error_Pragma_Arg
- ("record for pragma% must have two fields of same fpt type",
- Arg1);
+ ("record for pragma% must have two fields of the same "
+ & "floating-point type", Arg1);
else
Set_Has_Complex_Representation (Base_Type (E));
@@ -6179,8 +6194,8 @@ package body Sem_Prag is
----------------------
-- pragma Export_Exception (
- -- [Internal =>] LOCAL_NAME,
- -- [, [External =>] EXTERNAL_SYMBOL,]
+ -- [Internal =>] LOCAL_NAME
+ -- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Form =>] Ada | VMS]
-- [, [Code =>] static_integer_EXPRESSION]);
@@ -6219,8 +6234,8 @@ package body Sem_Prag is
---------------------
-- pragma Export_Function (
- -- [Internal =>] LOCAL_NAME,
- -- [, [External =>] EXTERNAL_SYMBOL,]
+ -- [Internal =>] LOCAL_NAME
+ -- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Parameter_Types =>] (PARAMETER_TYPES)]
-- [, [Result_Type =>] TYPE_DESIGNATOR]
-- [, [Mechanism =>] MECHANISM]
@@ -6286,7 +6301,7 @@ package body Sem_Prag is
-------------------
-- pragma Export_Object (
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Size =>] EXTERNAL_SYMBOL]);
@@ -6341,8 +6356,8 @@ package body Sem_Prag is
----------------------
-- pragma Export_Procedure (
- -- [Internal =>] LOCAL_NAME,
- -- [, [External =>] EXTERNAL_SYMBOL,]
+ -- [Internal =>] LOCAL_NAME
+ -- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Parameter_Types =>] (PARAMETER_TYPES)]
-- [, [Mechanism =>] MECHANISM]);
@@ -6419,7 +6434,7 @@ package body Sem_Prag is
-----------------------------
-- pragma Export_Valued_Procedure (
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL,]
-- [, [Parameter_Types =>] (PARAMETER_TYPES)]
-- [, [Mechanism =>] MECHANISM]);
@@ -6613,6 +6628,48 @@ package body Sem_Prag is
end case;
end External_Name_Casing;
+ --------------------------
+ -- Favor_Top_Level --
+ --------------------------
+
+ -- pragma Favor_Top_Level (type_NAME);
+
+ when Pragma_Favor_Top_Level => Favor_Top_Level : declare
+ Named_Entity : Entity_Id;
+
+ begin
+ GNAT_Pragma;
+ Check_No_Identifiers;
+ Check_Arg_Count (1);
+ Check_Arg_Is_Local_Name (Arg1);
+ Named_Entity := Entity (Expression (Arg1));
+
+ -- If it's an access-to-subprogram type (in particular, not a
+ -- subtype), set the flag on that type.
+
+ if Ekind (Named_Entity) in Access_Subprogram_Type_Kind then
+ Set_Can_Use_Internal_Rep (Named_Entity, False);
+
+ -- Otherwise it's an error (name denotes the wrong sort of entity)
+
+ else
+ Error_Pragma_Arg
+ ("access-to-subprogram type expected", Expression (Arg1));
+ end if;
+ end Favor_Top_Level;
+
+ ---------------
+ -- Fast_Math --
+ ---------------
+
+ -- pragma Fast_Math;
+
+ when Pragma_Fast_Math =>
+ GNAT_Pragma;
+ Check_No_Identifiers;
+ Check_Valid_Configuration_Pragma;
+ Fast_Math := True;
+
---------------------------
-- Finalize_Storage_Only --
---------------------------
@@ -6862,6 +6919,46 @@ package body Sem_Prag is
end;
end Ident;
+ --------------------------
+ -- Implemented_By_Entry --
+ --------------------------
+
+ -- pragma Implemented_By_Entry (DIRECT_NAME);
+
+ when Pragma_Implemented_By_Entry => Implemented_By_Entry : declare
+ Ent : Entity_Id;
+
+ begin
+ Ada_2005_Pragma;
+ Check_Arg_Count (1);
+ Check_No_Identifiers;
+ Check_Arg_Is_Identifier (Arg1);
+ Check_Arg_Is_Local_Name (Arg1);
+ Ent := Entity (Expression (Arg1));
+
+ -- Pragma Implemented_By_Entry must be applied only to protected
+ -- synchronized or task interface primitives.
+
+ if (Ekind (Ent) /= E_Function
+ and then Ekind (Ent) /= E_Procedure)
+ or else not Present (First_Formal (Ent))
+ or else not Is_Concurrent_Interface (Etype (First_Formal (Ent)))
+ then
+ Error_Pragma_Arg
+ ("pragma % must be applied to a concurrent interface " &
+ "primitive", Arg1);
+
+ else
+ if Einfo.Implemented_By_Entry (Ent)
+ and then Warn_On_Redundant_Constructs
+ then
+ Error_Pragma ("?duplicate pragma%!");
+ else
+ Set_Implemented_By_Entry (Ent);
+ end if;
+ end if;
+ end Implemented_By_Entry;
+
-----------------------
-- Implicit_Packing --
-----------------------
@@ -6878,8 +6975,8 @@ package body Sem_Prag is
------------
-- pragma Import (
- -- [ Convention =>] convention_IDENTIFIER,
- -- [ Entity =>] local_NAME
+ -- [Convention =>] convention_IDENTIFIER,
+ -- [Entity =>] local_NAME
-- [, [External_Name =>] static_string_EXPRESSION ]
-- [, [Link_Name =>] static_string_EXPRESSION ]);
@@ -6899,8 +6996,8 @@ package body Sem_Prag is
----------------------
-- pragma Import_Exception (
- -- [Internal =>] LOCAL_NAME,
- -- [, [External =>] EXTERNAL_SYMBOL,]
+ -- [Internal =>] LOCAL_NAME
+ -- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Form =>] Ada | VMS]
-- [, [Code =>] static_integer_EXPRESSION]);
@@ -7012,7 +7109,7 @@ package body Sem_Prag is
-------------------
-- pragma Import_Object (
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Size =>] EXTERNAL_SYMBOL]);
@@ -7045,7 +7142,7 @@ package body Sem_Prag is
----------------------
-- pragma Import_Procedure (
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Parameter_Types =>] (PARAMETER_TYPES)]
-- [, [Mechanism =>] MECHANISM]
@@ -7108,7 +7205,7 @@ package body Sem_Prag is
-----------------------------
-- pragma Import_Valued_Procedure (
- -- [Internal =>] LOCAL_NAME,
+ -- [Internal =>] LOCAL_NAME
-- [, [External =>] EXTERNAL_SYMBOL]
-- [, [Parameter_Types =>] (PARAMETER_TYPES)]
-- [, [Mechanism =>] MECHANISM]
@@ -8070,9 +8167,9 @@ package body Sem_Prag is
-----------------------
-- pragma Machine_Attribute (
- -- [Entity =>] LOCAL_NAME,
- -- [Attribute_Name =>] static_string_EXPRESSION
- -- [,[Info =>] static_string_EXPRESSION] );
+ -- [Entity =>] LOCAL_NAME,
+ -- [Attribute_Name =>] static_string_EXPRESSION
+ -- [, [Info =>] static_string_EXPRESSION] );
when Pragma_Machine_Attribute => Machine_Attribute : declare
Def_Id : Entity_Id;
@@ -8282,6 +8379,13 @@ package body Sem_Prag is
or else Ekind (E) = E_Generic_Procedure
then
Set_No_Return (E);
+
+ -- Set flag on any alias as well
+
+ if Is_Overloadable (E) and then Present (Alias (E)) then
+ Set_No_Return (Alias (E));
+ end if;
+
Found := True;
end if;
@@ -8550,13 +8654,13 @@ package body Sem_Prag is
No_Run_Time_Mode := True;
Configurable_Run_Time_Mode := True;
- declare
- Word32 : constant Boolean := Ttypes.System_Word_Size = 32;
- begin
- if Word32 then
- Duration_32_Bits_On_Target := True;
- end if;
- end;
+ -- Set Duration to 32 bits if word size is 32
+
+ if Ttypes.System_Word_Size = 32 then
+ Duration_32_Bits_On_Target := True;
+ end if;
+
+ -- Set appropriate restrictions
Set_Restriction (No_Finalization, N);
Set_Restriction (No_Exception_Handlers, N);
@@ -8744,12 +8848,31 @@ package body Sem_Prag is
Check_First_Subtype (Arg1);
Ent := Entity (Expression (Arg1));
- if not Is_Private_Type (Ent) then
+ if not Is_Private_Type (Ent)
+ and then not Is_Protected_Type (Ent)
+ then
Error_Pragma_Arg
- ("pragma % can only be applied to private type", Arg1);
+ ("pragma % can only be applied to private or protected type",
+ Arg1);
end if;
- Set_Known_To_Have_Preelab_Init (Ent);
+ -- Give an error if the pragma is applied to a protected type that
+ -- does not qualify (due to having entries, or due to components
+ -- that do not qualify).
+
+ if Is_Protected_Type (Ent)
+ and then not Has_Preelaborable_Initialization (Ent)
+ then
+ Error_Msg_N
+ ("protected type & does not have preelaborable " &
+ "initialization", Ent);
+
+ -- Otherwise mark the type as definitely having preelaborable
+ -- initialization.
+
+ else
+ Set_Known_To_Have_Preelab_Init (Ent);
+ end if;
if Has_Pragma_Preelab_Init (Ent)
and then Warn_On_Redundant_Constructs
@@ -11277,10 +11400,13 @@ package body Sem_Prag is
Pragma_Extend_System => -1,
Pragma_Extensions_Allowed => -1,
Pragma_External => -1,
+ Pragma_Favor_Top_Level => -1,
Pragma_External_Name_Casing => -1,
+ Pragma_Fast_Math => -1,
Pragma_Finalize_Storage_Only => 0,
Pragma_Float_Representation => 0,
Pragma_Ident => -1,
+ Pragma_Implemented_By_Entry => -1,
Pragma_Implicit_Packing => 0,
Pragma_Import => +2,
Pragma_Import_Exception => 0,