-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2008, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2009, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
with Csets; use Csets;
with Debug; use Debug;
with Einfo; use Einfo;
+with Elists; use Elists;
with Errout; use Errout;
with Exp_Dist; use Exp_Dist;
with Lib; use Lib;
with Sem_Ch3; use Sem_Ch3;
with Sem_Ch6; use Sem_Ch6;
with Sem_Ch8; use Sem_Ch8;
+with Sem_Ch12; use Sem_Ch12;
with Sem_Ch13; use Sem_Ch13;
with Sem_Dist; use Sem_Dist;
with Sem_Elim; use Sem_Elim;
-- exported, and must refer to an entity in the current declarative
-- part (as required by the rules for LOCAL_NAME).
- -- The external linker name is designated by the External parameter
- -- if given, or the Internal parameter if not (if there is no External
+ -- The external linker name is designated by the External parameter if
+ -- given, or the Internal parameter if not (if there is no External
-- parameter, the External parameter is a copy of the Internal name).
- -- If the External parameter is given as a string, then this string
- -- is treated as an external name (exactly as though it had been given
- -- as an External_Name parameter for a normal Import pragma).
+ -- If the External parameter is given as a string, then this string is
+ -- treated as an external name (exactly as though it had been given as an
+ -- External_Name parameter for a normal Import pragma).
-- If the External parameter is given as an identifier (or there is no
-- External parameter, so that the Internal identifier is used), then
-- Import_xxx or Export_xxx pragmas override an external or link name
-- specified in a previous Import or Export pragma.
- -- Note: these and all other DEC-compatible GNAT pragmas allow full
- -- use of named notation, following the standard rules for subprogram
- -- calls, i.e. parameters can be given in any order if named notation
- -- is used, and positional and named notation can be mixed, subject to
- -- the rule that all positional parameters must appear first.
+ -- Note: these and all other DEC-compatible GNAT pragmas allow full use of
+ -- named notation, following the standard rules for subprogram calls, i.e.
+ -- parameters can be given in any order if named notation is used, and
+ -- positional and named notation can be mixed, subject to the rule that all
+ -- positional parameters must appear first.
- -- Note: All these pragmas are implemented exactly following the DEC
- -- design and implementation and are intended to be fully compatible
- -- with the use of these pragmas in the DEC Ada compiler.
+ -- Note: All these pragmas are implemented exactly following the DEC design
+ -- and implementation and are intended to be fully compatible with the use
+ -- of these pragmas in the DEC Ada compiler.
--------------------------------------------
-- Checking for Duplicated External Names --
-- name. The following table is used to diagnose this situation so that
-- an appropriate warning can be issued.
- -- The Node_Id stored is for the N_String_Literal node created to
- -- hold the value of the external name. The Sloc of this node is
- -- used to cross-reference the location of the duplication.
+ -- The Node_Id stored is for the N_String_Literal node created to hold
+ -- the value of the external name. The Sloc of this node is used to
+ -- cross-reference the location of the duplication.
package Externals is new Table.Table (
Table_Component_Type => Node_Id,
function Adjust_External_Name_Case (N : Node_Id) return Node_Id;
-- This routine is used for possible casing adjustment of an explicit
- -- external name supplied as a string literal (the node N), according
- -- to the casing requirement of Opt.External_Name_Casing. If this is
- -- set to As_Is, then the string literal is returned unchanged, but if
- -- it is set to Uppercase or Lowercase, then a new string literal with
- -- appropriate casing is constructed.
+ -- external name supplied as a string literal (the node N), according to
+ -- the casing requirement of Opt.External_Name_Casing. If this is set to
+ -- As_Is, then the string literal is returned unchanged, but if it is set
+ -- to Uppercase or Lowercase, then a new string literal with appropriate
+ -- casing is constructed.
function Get_Base_Subprogram (Def_Id : Entity_Id) return Entity_Id;
- -- If Def_Id refers to a renamed subprogram, then the base subprogram
- -- (the original one, following the renaming chain) is returned.
- -- Otherwise the entity is returned unchanged. Should be in Einfo???
+ -- If Def_Id refers to a renamed subprogram, then the base subprogram (the
+ -- original one, following the renaming chain) is returned. Otherwise the
+ -- entity is returned unchanged. Should be in Einfo???
function Get_Pragma_Arg (Arg : Node_Id) return Node_Id;
-- All the routines that check pragma arguments take either a pragma
-- the source, allowing convenient stepping to the point of interest.
procedure Set_Unit_Name (N : Node_Id; With_Item : Node_Id);
- -- Place semantic information on the argument of an Elaborate or
- -- Elaborate_All pragma. Entity name for unit and its parents is
- -- taken from item in previous with_clause that mentions the unit.
+ -- Place semantic information on the argument of an Elaborate/Elaborate_All
+ -- pragma. Entity name for unit and its parents is taken from item in
+ -- previous with_clause that mentions the unit.
-------------------------------
-- Adjust_External_Name_Case --
Arg2 : constant Node_Id := Next (Arg1);
begin
- -- Install formals and push subprogram spec onto scope stack
- -- so that we can see the formals from the pragma.
+ -- Install formals and push subprogram spec onto scope stack so that we
+ -- can see the formals from the pragma.
Install_Formals (S);
Push_Scope (S);
- -- Preanalyze the boolean expression, we treat this as a
- -- spec expression (i.e. similar to a default expression).
+ -- Preanalyze the boolean expression, we treat this as a spec expression
+ -- (i.e. similar to a default expression).
Preanalyze_Spec_Expression
(Get_Pragma_Arg (Arg1), Standard_Boolean);
(Get_Pragma_Arg (Arg2), Standard_String);
end if;
- -- Remove the subprogram from the scope stack now that the
- -- pre-analysis of the precondition/postcondition is done.
+ -- Remove the subprogram from the scope stack now that the pre-analysis
+ -- of the precondition/postcondition is done.
End_Scope;
end Analyze_PPC_In_Decl_Part;
Prag_Id : Pragma_Id;
Pragma_Exit : exception;
- -- This exception is used to exit pragma processing completely. It
- -- is used when an error is detected, and no further processing is
- -- required. It is also used if an earlier error has left the tree
- -- in a state where the pragma should not be processed.
+ -- This exception is used to exit pragma processing completely. It is
+ -- used when an error is detected, and no further processing is
+ -- required. It is also used if an earlier error has left the tree in
+ -- a state where the pragma should not be processed.
Arg_Count : Nat;
-- Number of pragma argument associations
Arg2 : Node_Id;
Arg3 : Node_Id;
Arg4 : Node_Id;
- -- First four pragma arguments (pragma argument association nodes,
- -- or Empty if the corresponding argument does not exist).
+ -- First four pragma arguments (pragma argument association nodes, or
+ -- Empty if the corresponding argument does not exist).
type Name_List is array (Natural range <>) of Name_Id;
type Args_List is array (Natural range <>) of Node_Id;
-- of 95 pragma.
procedure Check_Arg_Count (Required : Nat);
- -- Check argument count for pragma is equal to given parameter.
- -- If not, then issue an error message and raise Pragma_Exit.
+ -- Check argument count for pragma is equal to given parameter. If not,
+ -- then issue an error message and raise Pragma_Exit.
- -- Note: all routines whose name is Check_Arg_Is_xxx take an
- -- argument Arg which can either be a pragma argument association,
- -- in which case the check is applied to the expression of the
- -- association or an expression directly.
+ -- Note: all routines whose name is Check_Arg_Is_xxx take an argument
+ -- Arg which can either be a pragma argument association, in which case
+ -- the check is applied to the expression of the association or an
+ -- expression directly.
procedure Check_Arg_Is_External_Name (Arg : Node_Id);
-- Check that an argument has the right form for an EXTERNAL_NAME
- -- parameter of an extended import/export pragma. The rule is that
- -- the name must be an identifier or string literal (in Ada 83 mode)
- -- or a static string expression (in Ada 95 mode).
+ -- parameter of an extended import/export pragma. The rule is that the
+ -- name must be an identifier or string literal (in Ada 83 mode) or a
+ -- static string expression (in Ada 95 mode).
procedure Check_Arg_Is_Identifier (Arg : Node_Id);
-- Check the specified argument Arg to make sure that it is an
-- identifier. If not give error and raise Pragma_Exit.
procedure Check_Arg_Is_Integer_Literal (Arg : Node_Id);
- -- Check the specified argument Arg to make sure that it is an
- -- integer literal. If not give error and raise Pragma_Exit.
+ -- Check the specified argument Arg to make sure that it is an integer
+ -- literal. If not give error and raise Pragma_Exit.
procedure Check_Arg_Is_Library_Level_Local_Name (Arg : Node_Id);
- -- Check the specified argument Arg to make sure that it has the
- -- proper syntactic form for a local name and meets the semantic
- -- requirements for a local name. The local name is analyzed as
- -- part of the processing for this call. In addition, the local
- -- name is required to represent an entity at the library level.
+ -- Check the specified argument Arg to make sure that it has the proper
+ -- syntactic form for a local name and meets the semantic requirements
+ -- for a local name. The local name is analyzed as part of the
+ -- processing for this call. In addition, the local name is required
+ -- to represent an entity at the library level.
procedure Check_Arg_Is_Local_Name (Arg : Node_Id);
- -- Check the specified argument Arg to make sure that it has the
- -- proper syntactic form for a local name and meets the semantic
- -- requirements for a local name. The local name is analyzed as
- -- part of the processing for this call.
+ -- Check the specified argument Arg to make sure that it has the proper
+ -- syntactic form for a local name and meets the semantic requirements
+ -- for a local name. The local name is analyzed as part of the
+ -- processing for this call.
procedure Check_Arg_Is_Locking_Policy (Arg : Node_Id);
-- Check the specified argument Arg to make sure that it is a valid
procedure Check_Arg_Is_Static_Expression
(Arg : Node_Id;
- Typ : Entity_Id);
+ Typ : Entity_Id := Empty);
-- Check the specified argument Arg to make sure that it is a static
-- expression of the given type (i.e. it will be analyzed and resolved
-- using this type, which can be any valid argument to Resolve, e.g.
- -- Any_Integer is OK). If not, given error and raise Pragma_Exit.
+ -- Any_Integer is OK). If not, given error and raise Pragma_Exit. If
+ -- Typ is left Empty, then any static expression is allowed.
procedure Check_Arg_Is_String_Literal (Arg : Node_Id);
- -- Check the specified argument Arg to make sure that it is a
- -- string literal. If not give error and raise Pragma_Exit
+ -- Check the specified argument Arg to make sure that it is a string
+ -- literal. If not give error and raise Pragma_Exit
procedure Check_Arg_Is_Task_Dispatching_Policy (Arg : Node_Id);
- -- Check the specified argument Arg to make sure that it is a valid
- -- valid task dispatching policy name. If not give error and raise
- -- Pragma_Exit.
+ -- Check the specified argument Arg to make sure that it is a valid task
+ -- dispatching policy name. If not give error and raise Pragma_Exit.
procedure Check_Arg_Order (Names : Name_List);
-- Checks for an instance of two arguments with identifiers for the
-- constrained subtypes, and for restrictions on finalizable components.
procedure Check_Duplicated_Export_Name (Nam : Node_Id);
- -- Nam is an N_String_Literal node containing the external name set
- -- by an Import or Export pragma (or extended Import or Export pragma).
- -- This procedure checks for possible duplications if this is the
- -- export case, and if found, issues an appropriate error message.
+ -- Nam is an N_String_Literal node containing the external name set by
+ -- an Import or Export pragma (or extended Import or Export pragma).
+ -- This procedure checks for possible duplications if this is the export
+ -- case, and if found, issues an appropriate error message.
procedure Check_First_Subtype (Arg : Node_Id);
- -- Checks that Arg, whose expression is an entity name referencing
- -- a subtype, does not reference a type that is not a first subtype.
+ -- Checks that Arg, whose expression is an entity name referencing a
+ -- subtype, does not reference a type that is not a first subtype.
procedure Check_In_Main_Program;
-- Common checks for pragmas that appear within a main program
-- (Priority, Main_Storage, Time_Slice, Relative_Deadline).
procedure Check_Interrupt_Or_Attach_Handler;
- -- Common processing for first argument of pragma Interrupt_Handler
- -- or pragma Attach_Handler.
+ -- Common processing for first argument of pragma Interrupt_Handler or
+ -- pragma Attach_Handler.
procedure Check_Is_In_Decl_Part_Or_Package_Spec;
-- Check that pragma appears in a declarative part, or in a package
-- expression, returns True if so, False if non-static or not String.
procedure Pragma_Misplaced;
+ pragma No_Return (Pragma_Misplaced);
-- Issue fatal error message for misplaced pragma
procedure Process_Atomic_Shared_Volatile;
Arg_External : Node_Id;
Arg_Form : Node_Id;
Arg_Code : Node_Id);
- -- Common processing for the pragmas Import/Export_Exception.
- -- The three arguments correspond to the three named parameters of
- -- the pragma. An argument is empty if the corresponding parameter
- -- is not present in the pragma.
+ -- Common processing for the pragmas Import/Export_Exception. The three
+ -- arguments correspond to the three named parameters of the pragma. An
+ -- argument is empty if the corresponding parameter is not present in
+ -- the pragma.
procedure Process_Extended_Import_Export_Object_Pragma
(Arg_Internal : Node_Id;
Arg_External : Node_Id;
Arg_Size : Node_Id);
- -- Common processing for the pragmas Import/Export_Object.
- -- The three arguments correspond to the three named parameters
- -- of the pragmas. An argument is empty if the corresponding
- -- parameter is not present in the pragma.
+ -- Common processing for the pragmas Import/Export_Object. The three
+ -- arguments correspond to the three named parameters of the pragmas. An
+ -- argument is empty if the corresponding parameter is not present in
+ -- the pragma.
procedure Process_Extended_Import_Export_Internal_Arg
(Arg_Internal : Node_Id := Empty);
Arg_Mechanism : Node_Id;
Arg_Result_Mechanism : Node_Id := Empty;
Arg_First_Optional_Parameter : Node_Id := Empty);
- -- Common processing for all extended Import and Export pragmas
- -- applying to subprograms. The caller omits any arguments that do
- -- not apply to the pragma in question (for example, Arg_Result_Type
- -- can be non-Empty only in the Import_Function and Export_Function
- -- cases). The argument names correspond to the allowed pragma
- -- association identifiers.
+ -- Common processing for all extended Import and Export pragmas applying
+ -- to subprograms. The caller omits any arguments that do not apply to
+ -- the pragma in question (for example, Arg_Result_Type can be non-Empty
+ -- only in the Import_Function and Export_Function cases). The argument
+ -- names correspond to the allowed pragma association identifiers.
procedure Process_Generic_List;
-- Common processing for Share_Generic and Inline_Generic
procedure Process_Inline (Active : Boolean);
-- Common processing for Inline and Inline_Always. The parameter
- -- indicates if the inline pragma is active, i.e. if it should
- -- actually cause inlining to occur.
+ -- indicates if the inline pragma is active, i.e. if it should actually
+ -- cause inlining to occur.
procedure Process_Interface_Name
(Subprogram_Def : Entity_Id;
-- Given the last two arguments of pragma Import, pragma Export, or
-- pragma Interface_Name, performs validity checks and sets the
-- Interface_Name field of the given subprogram entity to the
- -- appropriate external or link name, depending on the arguments
- -- given. Ext_Arg is always present, but Link_Arg may be missing.
- -- Note that Ext_Arg may represent the Link_Name if Link_Arg is
- -- missing, and appropriate named notation is used for Ext_Arg.
- -- If neither Ext_Arg nor Link_Arg is present, the interface name
- -- is set to the default from the subprogram name.
+ -- appropriate external or link name, depending on the arguments given.
+ -- Ext_Arg is always present, but Link_Arg may be missing. Note that
+ -- Ext_Arg may represent the Link_Name if Link_Arg is missing, and
+ -- appropriate named notation is used for Ext_Arg. If neither Ext_Arg
+ -- nor Link_Arg is present, the interface name is set to the default
+ -- from the subprogram name.
procedure Process_Interrupt_Or_Attach_Handler;
-- Common processing for Interrupt and Attach_Handler pragmas
procedure Process_Restrictions_Or_Restriction_Warnings (Warn : Boolean);
-- Common processing for Restrictions and Restriction_Warnings pragmas.
- -- Warn is False for Restrictions, True for Restriction_Warnings.
+ -- Warn is True for Restriction_Warnings, or for Restrictions if the
+ -- flag Treat_Restrictions_As_Warnings is set, and False if this flag
+ -- is not set in the Restrictions case.
procedure Process_Suppress_Unsuppress (Suppress_Case : Boolean);
-- Common processing for Suppress and Unsuppress. The boolean parameter
-- set appropriately.
procedure Set_Ravenscar_Profile (N : Node_Id);
- -- Activate the set of configuration pragmas and restrictions that
- -- make up the Ravenscar Profile. N is the corresponding pragma
- -- node, which is used for error messages on any constructs
- -- that violate the profile.
+ -- Activate the set of configuration pragmas and restrictions that make
+ -- up the Ravenscar Profile. N is the corresponding pragma node, which
+ -- is used for error messages on any constructs that violate the
+ -- profile.
---------------------
-- Ada_2005_Pragma --
procedure Check_Arg_Is_Static_Expression
(Arg : Node_Id;
- Typ : Entity_Id)
+ Typ : Entity_Id := Empty)
is
Argx : constant Node_Id := Get_Pragma_Arg (Arg);
begin
- Analyze_And_Resolve (Argx, Typ);
+ if Present (Typ) then
+ Analyze_And_Resolve (Argx, Typ);
+ else
+ Analyze_And_Resolve (Argx);
+ end if;
if Is_OK_Static_Expression (Argx) then
return;
elsif Etype (Argx) = Any_Type then
raise Pragma_Exit;
- -- An interesting special case, if we have a string literal and
- -- we are in Ada 83 mode, then we allow it even though it will
- -- not be flagged as static. This allows the use of Ada 95
- -- pragmas like Import in Ada 83 mode. They will of course be
- -- flagged with warnings as usual, but will not cause errors.
+ -- An interesting special case, if we have a string literal and we
+ -- are in Ada 83 mode, then we allow it even though it will not be
+ -- flagged as static. This allows the use of Ada 95 pragmas like
+ -- Import in Ada 83 mode. They will of course be flagged with
+ -- warnings as usual, but will not cause errors.
elsif Ada_Version = Ada_83
and then Nkind (Argx) = N_String_Literal
then
return;
- -- Static expression that raises Constraint_Error. This has
- -- already been flagged, so just exit from pragma processing.
+ -- Static expression that raises Constraint_Error. This has already
+ -- been flagged, so just exit from pragma processing.
elsif Is_Static_Expression (Argx) then
raise Pragma_Exit;
elsif Nkind (P) = N_Handled_Sequence_Of_Statements then
exit;
- elsif Nkind (P) = N_Package_Specification then
- return;
-
- elsif Nkind (P) = N_Block_Statement then
+ elsif Nkind_In (P, N_Package_Specification,
+ N_Block_Statement)
+ then
return;
-- Note: the following tests seem a little peculiar, because
-- sequence, so the only way we get here is by being in the
-- declarative part of the body.
- elsif Nkind (P) = N_Subprogram_Body
- or else Nkind (P) = N_Package_Body
- or else Nkind (P) = N_Task_Body
- or else Nkind (P) = N_Entry_Body
+ elsif Nkind_In (P, N_Subprogram_Body,
+ N_Package_Body,
+ N_Task_Body,
+ N_Entry_Body)
then
return;
end if;
procedure Check_Precondition_Postcondition (In_Body : out Boolean) is
P : Node_Id;
- S : Entity_Id;
PO : Node_Id;
+ procedure Chain_PPC (PO : Node_Id);
+ -- If PO is a subprogram declaration node (or a generic subprogram
+ -- declaration node), then the precondition/postcondition applies
+ -- to this subprogram and the processing for the pragma is completed.
+ -- Otherwise the pragma is misplaced.
+
+ ---------------
+ -- Chain_PPC --
+ ---------------
+
+ procedure Chain_PPC (PO : Node_Id) is
+ S : Node_Id;
+
+ begin
+ if not Nkind_In (PO, N_Subprogram_Declaration,
+ N_Generic_Subprogram_Declaration)
+ then
+ Pragma_Misplaced;
+ end if;
+
+ -- Here if we have subprogram or generic subprogram declaration
+
+ S := Defining_Unit_Name (Specification (PO));
+
+ -- Analyze the pragma unless it appears within a package spec,
+ -- which is the case where we delay the analysis of the PPC until
+ -- the end of the package declarations (for details, see
+ -- Analyze_Package_Specification.Analyze_PPCs).
+
+ if not Is_Package_Or_Generic_Package (Scope (S)) then
+ Analyze_PPC_In_Decl_Part (N, S);
+ end if;
+
+ -- Chain spec PPC pragma to list for subprogram
+
+ Set_Next_Pragma (N, Spec_PPC_List (S));
+ Set_Spec_PPC_List (S, N);
+
+ -- Return indicating spec case
+
+ In_Body := False;
+ return;
+ end Chain_PPC;
+
+ -- Start of processing for Check_Precondition_Postcondition
+
begin
if not Is_List_Member (N) then
Pragma_Misplaced;
Set_PPC_Enabled (N, Check_Enabled (Pname));
+ -- If we are within an inlined body, the legality of the pragma
+ -- has been checked already.
+
+ if In_Inlined_Body then
+ In_Body := True;
+ return;
+ end if;
+
-- Search prior declarations
P := N;
while Present (Prev (P)) loop
P := Prev (P);
- PO := Original_Node (P);
+
+ -- If the previous node is a generic subprogram, do not go to to
+ -- the original node, which is the unanalyzed tree: we need to
+ -- attach the pre/postconditions to the analyzed version at this
+ -- point. They get propagated to the original tree when analyzing
+ -- the corresponding body.
+
+ if Nkind (P) not in N_Generic_Declaration then
+ PO := Original_Node (P);
+ else
+ PO := P;
+ end if;
-- Skip past prior pragma
elsif not Comes_From_Source (PO) then
null;
- -- Here if we hit a subprogram declaration
-
- elsif Nkind (PO) = N_Subprogram_Declaration then
- S := Defining_Unit_Name (Specification (PO));
-
- -- Analyze the pragma unless it appears within a package spec,
- -- which is the case where we delay the analysis of the PPC
- -- until the end of the package declarations (for details,
- -- see Analyze_Package_Specification.Analyze_PPCs).
-
- if Ekind (Scope (S)) /= E_Package
- and then
- Ekind (Scope (S)) /= E_Generic_Package
- then
- Analyze_PPC_In_Decl_Part (N, S);
- end if;
-
- -- Chain spec PPC pragma to list for subprogram
-
- Set_Next_Pragma (N, Spec_PPC_List (S));
- Set_Spec_PPC_List (S, N);
-
- -- Return indicating spec case
-
- In_Body := False;
- return;
-
- -- If we encounter any other declaration moving back, misplaced
+ -- Only remaining possibility is subprogram declaration
else
- Pragma_Misplaced;
+ Chain_PPC (PO);
+ return;
end if;
end loop;
- -- If we fall through loop, pragma is at start of list, so see if
- -- it is at the start of declarations of a subprogram body.
+ -- If we fall through loop, pragma is at start of list, so see if it
+ -- is at the start of declarations of a subprogram body.
if Nkind (Parent (N)) = N_Subprogram_Body
and then List_Containing (N) = Declarations (Parent (N))
then
+ if Operating_Mode /= Generate_Code
+ or else Inside_A_Generic
+ then
+
+ -- Analyze expression in pragma, for correctness
+ -- and for ASIS use.
+
+ Preanalyze_Spec_Expression
+ (Get_Pragma_Arg (Arg1), Standard_Boolean);
+ end if;
+
In_Body := True;
return;
- -- If not, it was misplaced
+ -- See if it is in the pragmas after a library level subprogram
- else
- Pragma_Misplaced;
+ elsif Nkind (Parent (N)) = N_Compilation_Unit_Aux then
+ Chain_PPC (Unit (Parent (Parent (N))));
+ return;
end if;
+
+ -- If we fall through, pragma was misplaced
+
+ Pragma_Misplaced;
end Check_Precondition_Postcondition;
-----------------------------
-----------------------------
-- Note: for convenience in writing this procedure, in addition to
- -- the officially (i.e. by spec) allowed argument which is always
- -- a constraint, it also allows ranges and discriminant associations.
+ -- the officially (i.e. by spec) allowed argument which is always a
+ -- constraint, it also allows ranges and discriminant associations.
-- Above is not clear ???
procedure Check_Static_Constraint (Constr : Node_Id) is
if Parent_Node = Empty then
Pragma_Misplaced;
- -- Case of pragma appearing after a compilation unit. In this
- -- case it must have an argument with the corresponding name
- -- and must be part of the following pragmas of its parent.
+ -- Case of pragma appearing after a compilation unit. In this case
+ -- it must have an argument with the corresponding name and must
+ -- be part of the following pragmas of its parent.
elsif Nkind (Parent_Node) = N_Compilation_Unit_Aux then
if Plist /= Pragmas_After (Parent_Node) then
(Chars (Arg), Names (Index1))
then
Error_Msg_Name_1 := Names (Index1);
- Error_Msg_N ("\possible misspelling of%", Arg);
+ Error_Msg_N -- CODEFIX
+ ("\possible misspelling of%", Arg);
exit;
end if;
end loop;
Set_Has_Delayed_Freeze (E);
end if;
- -- An interesting improvement here. If an object of type X
- -- is declared atomic, and the type X is not atomic, that's
- -- a pity, since it may not have appropriate alignment etc.
- -- We can rescue this in the special case where the object
- -- and type are in the same unit by just setting the type
- -- as atomic, so that the back end will process it as atomic.
+ -- An interesting improvement here. If an object of type X is
+ -- declared atomic, and the type X is not atomic, that's a
+ -- pity, since it may not have appropriate alignment etc. We
+ -- can rescue this in the special case where the object and
+ -- type are in the same unit by just setting the type as
+ -- atomic, so that the back end will process it as atomic.
Utyp := Underlying_Type (Etype (E));
Arg1x : constant Node_Id := Get_Pragma_Arg (Arg1);
begin
- GNAT_Pragma;
Check_Arg_Count (2);
Check_No_Identifiers;
Check_Arg_Is_Static_Expression (Arg2, Standard_String);
-- warning, even though it is not in the main unit.
begin
- -- Loop through segments of message separated by line
- -- feeds. We output these segments as separate messages
- -- with continuation marks for all but the first.
+ -- Loop through segments of message separated by line feeds.
+ -- We output these segments as separate messages with
+ -- continuation marks for all but the first.
Cont := False;
Ptr := 1;
loop
Error_Msg_Strlen := 0;
- -- Loop to copy characters from argument to error
- -- message string buffer.
+ -- Loop to copy characters from argument to error message
+ -- string buffer.
loop
exit when Ptr > Len;
Set_Has_Convention_Pragma (Underlying_Type (E), True);
end if;
- -- A class-wide type should inherit the convention of
- -- the specific root type (although this isn't specified
- -- clearly by the RM).
+ -- A class-wide type should inherit the convention of the specific
+ -- root type (although this isn't specified clearly by the RM).
if Is_Type (E) and then Present (Class_Wide_Type (E)) then
Set_Convention (Class_Wide_Type (E), C);
end if;
end if;
- -- If the entity is a derived boolean type, check for the
- -- special case of convention C, C++, or Fortran, where we
- -- consider any nonzero value to represent true.
+ -- If the entity is a derived boolean type, check for the special
+ -- case of convention C, C++, or Fortran, where we consider any
+ -- nonzero value to represent true.
if Is_Discrete_Type (E)
and then Root_Type (Etype (E)) = Standard_Boolean
Check_Arg_Is_Identifier (Arg1);
Cname := Chars (Expression (Arg1));
- -- C_Pass_By_Copy is treated as a synonym for convention C
- -- (this is tested again below to set the critical flag)
-
+ -- C_Pass_By_Copy is treated as a synonym for convention C (this is
+ -- tested again below to set the critical flag).
if Cname = Name_C_Pass_By_Copy then
C := Convention_C;
then
if Scope (E) /= Scope (Alias (E)) then
Error_Pragma_Ref
- ("cannot apply pragma% to non-local renaming&#", E);
+ ("cannot apply pragma% to non-local entity&#", E);
end if;
+
E := Alias (E);
- elsif Nkind (Parent (E)) = N_Full_Type_Declaration
+ elsif Nkind_In (Parent (E), N_Full_Type_Declaration,
+ N_Private_Extension_Declaration)
and then Scope (E) = Scope (Alias (E))
then
E := Alias (E);
E1 := Homonym (E1);
exit when No (E1) or else Scope (E1) /= Current_Scope;
- -- Do not set the pragma on inherited operations or on
- -- formal subprograms.
+ -- Do not set the pragma on inherited operations or on formal
+ -- subprograms.
if Comes_From_Source (E1)
and then Comp_Unit = Get_Source_Unit (E1)
and then not Is_Formal_Subprogram (E1)
and then Nkind (Original_Node (Parent (E1))) /=
- N_Full_Type_Declaration
+ N_Full_Type_Declaration
then
if Present (Alias (E1))
and then Scope (E1) /= Scope (Alias (E1))
then
Error_Pragma_Ref
- ("cannot apply pragma% to non-local renaming&#", E1);
+ ("cannot apply pragma% to non-local entity& declared#",
+ E1);
end if;
+
Set_Convention_From_Pragma (E1);
if Prag_Id = Pragma_Import then
Code_Val : Uint;
begin
- GNAT_Pragma;
-
if not OpenVMS_On_Target then
Error_Pragma
("?pragma% ignored (applies only to Open'V'M'S)");
(Arg_Internal : Node_Id := Empty)
is
begin
- GNAT_Pragma;
-
if No (Arg_Internal) then
Error_Pragma ("Internal parameter required for pragma%");
end if;
end if;
if Warn_On_Export_Import and then Is_Exported (Def_Id) then
- Error_Msg_N
- ("?duplicate Export_Object pragma", N);
+ Error_Msg_N ("?duplicate Export_Object pragma", N);
else
Set_Exported (Def_Id, Arg_Internal);
end if;
("?duplicate Import_Object pragma", N);
-- Check for explicit initialization present. Note that an
- -- initialization that generated by the code generator, e.g.
- -- for an access type, does not count here.
+ -- initialization generated by the code generator, e.g. for an
+ -- access type, does not count here.
elsif Present (Expression (Parent (Def_Id)))
and then
function Same_Base_Type
(Ptype : Node_Id;
Formal : Entity_Id) return Boolean;
- -- Determines if Ptype references the type of Formal. Note that
- -- only the base types need to match according to the spec. Ptype
- -- here is the argument from the pragma, which is either a type
- -- name, or an access attribute.
+ -- Determines if Ptype references the type of Formal. Note that only
+ -- the base types need to match according to the spec. Ptype here is
+ -- the argument from the pragma, which is either a type name, or an
+ -- access attribute.
--------------------
-- Same_Base_Type --
end if;
-- We have a match if the corresponding argument is of an
- -- anonymous access type, and its designated type matches
- -- the type of the prefix of the access attribute
+ -- anonymous access type, and its designated type matches the
+ -- type of the prefix of the access attribute
return Ekind (Ftyp) = E_Anonymous_Access_Type
and then Base_Type (Entity (Pref)) =
raise Pragma_Exit;
end if;
- -- We have a match if the corresponding argument is of
- -- the type given in the pragma (comparing base types)
+ -- We have a match if the corresponding argument is of the type
+ -- given in the pragma (comparing base types)
return Base_Type (Entity (Ptype)) = Ftyp;
end if;
-- Pragma cannot apply to subprogram body
if Is_Subprogram (Def_Id)
- and then
- Nkind (Parent
- (Declaration_Node (Def_Id))) = N_Subprogram_Body
+ and then Nkind (Parent (Declaration_Node (Def_Id))) =
+ N_Subprogram_Body
then
Error_Pragma
("pragma% requires separate spec"
return;
end if;
- -- Import pragmas must be be for imported entities
+ -- Import pragmas must be for imported entities
if Prag_Id = Pragma_Import_Function
or else
Prag_Id = Pragma_Import_Valued_Procedure
then
if not Is_Imported (Ent) then
- Error_Pragma
+ Error_Pragma -- CODEFIX???
("pragma Import or Interface must precede pragma%");
end if;
Formal := First_Formal (Ent);
if No (Formal) then
- Error_Pragma
- ("at least one parameter required for pragma%");
+ Error_Pragma ("at least one parameter required for pragma%");
elsif Ekind (Formal) /= E_Out_Parameter then
- Error_Pragma
- ("first parameter must have mode out for pragma%");
+ Error_Pragma ("first parameter must have mode out for pragma%");
else
Set_Is_Valued_Procedure (Ent);
if Chars (Choice) = Chars (Formal) then
Set_Mechanism_Value
(Formal, Expression (Massoc));
+
+ -- Set entity on identifier for ASIS
+
+ Set_Entity (Choice, Formal);
+
exit;
end if;
Exp : Node_Id;
begin
- GNAT_Pragma;
Check_No_Identifiers;
Check_At_Least_N_Arguments (1);
Process_Interface_Name (Def_Id, Arg3, Arg4);
-- Note that we do not set Is_Public here. That's because we
- -- only want to set if if there is no address clause, and we
+ -- only want to set it if there is no address clause, and we
-- don't know that yet, so we delay that processing till
-- freeze time.
then
null;
- -- If it is not a subprogram, it must be in an outer
- -- scope and pragma does not apply.
+ -- If it is not a subprogram, it must be in an outer scope and
+ -- pragma does not apply.
elsif not Is_Subprogram (Def_Id)
and then not Is_Generic_Subprogram (Def_Id)
then
null;
- -- Verify that the homonym is in the same declarative
- -- part (not just the same scope).
+ -- Verify that the homonym is in the same declarative part (not
+ -- just the same scope).
elsif Parent (Unit_Declaration_Node (Def_Id)) /= Parent (N)
and then Nkind (Parent (N)) /= N_Compilation_Unit_Aux
Set_Is_Intrinsic_Subprogram (Def_Id);
- -- If no external name is present, then check that
- -- this is a valid intrinsic subprogram. If an external
- -- name is present, then this is handled by the back end.
+ -- If no external name is present, then check that this
+ -- is a valid intrinsic subprogram. If an external name
+ -- is present, then this is handled by the back end.
if No (Arg3) then
Check_Intrinsic_Subprogram (Def_Id, Expression (Arg2));
end if;
end if;
- -- All interfaced procedures need an external symbol
- -- created for them since they are always referenced
- -- from another object file.
+ -- All interfaced procedures need an external symbol created
+ -- for them since they are always referenced from another
+ -- object file.
Set_Is_Public (Def_Id);
-- Verify that the subprogram does not have a completion
- -- through a renaming declaration. For other completions
- -- the pragma appears as a too late representation.
+ -- through a renaming declaration. For other completions the
+ -- pragma appears as a too late representation.
declare
Decl : constant Node_Id := Unit_Declaration_Node (Def_Id);
if Present (Decl)
and then Nkind (Decl) = N_Subprogram_Declaration
and then Present (Corresponding_Body (Decl))
- and then
- Nkind
- (Unit_Declaration_Node
- (Corresponding_Body (Decl))) =
+ and then Nkind (Unit_Declaration_Node
+ (Corresponding_Body (Decl))) =
N_Subprogram_Renaming_Declaration
then
Error_Msg_Sloc := Sloc (Def_Id);
end loop;
-- When the convention is Java or CIL, we also allow Import to be
- -- given for packages, generic packages, exceptions, and record
- -- components.
+ -- given for packages, generic packages, exceptions, record
+ -- components, and access to subprograms.
elsif (C = Convention_Java or else C = Convention_CIL)
and then
- (Ekind (Def_Id) = E_Package
- or else Ekind (Def_Id) = E_Generic_Package
- or else Ekind (Def_Id) = E_Exception
- or else Nkind (Parent (Def_Id)) = N_Component_Declaration)
+ (Is_Package_Or_Generic_Package (Def_Id)
+ or else Ekind (Def_Id) = E_Exception
+ or else Ekind (Def_Id) = E_Access_Subprogram_Type
+ or else Nkind (Parent (Def_Id)) = N_Component_Declaration)
then
Set_Imported (Def_Id);
Set_Is_Public (Def_Id);
elsif Is_Record_Type (Def_Id)
and then C = Convention_CPP
then
- if not Is_Tagged_Type (Def_Id) then
- Error_Msg_Sloc := Sloc (Def_Id);
- Error_Pragma_Arg ("imported 'C'P'P type must be tagged", Arg2);
+ -- Types treated as CPP classes are treated as limited, but we
+ -- don't require them to be declared this way. A warning is
+ -- issued to encourage the user to declare them as limited.
+ -- This is not an error, for compatibility reasons, because
+ -- these types have been supported this way for some time.
- else
- -- Types treated as CPP classes are treated as limited, but we
- -- don't require them to be declared this way. A warning is
- -- issued to encourage the user to declare them as limited.
- -- This is not an error, for compatibility reasons, because
- -- these types have been supported this way for some time.
+ if not Is_Limited_Type (Def_Id) then
+ Error_Msg_N
+ ("imported 'C'P'P type should be " &
+ "explicitly declared limited?",
+ Get_Pragma_Arg (Arg2));
+ Error_Msg_N
+ ("\type will be considered limited",
+ Get_Pragma_Arg (Arg2));
+ end if;
- if not Is_Limited_Type (Def_Id) then
- Error_Msg_N
- ("imported 'C'P'P type should be " &
- "explicitly declared limited?",
- Get_Pragma_Arg (Arg2));
- Error_Msg_N
- ("\type will be considered limited",
- Get_Pragma_Arg (Arg2));
- end if;
+ Set_Is_CPP_Class (Def_Id);
+ Set_Is_Limited_Record (Def_Id);
+
+ -- Imported CPP types must not have discriminants (because C++
+ -- classes do not have discriminants).
- Set_Is_CPP_Class (Def_Id);
- Set_Is_Limited_Record (Def_Id);
+ if Has_Discriminants (Def_Id) then
+ Error_Msg_N
+ ("imported 'C'P'P type cannot have discriminants",
+ First (Discriminant_Specifications
+ (Declaration_Node (Def_Id))));
end if;
+ -- Components of imported CPP types must not have default
+ -- expressions because the constructor (if any) is on the
+ -- C++ side.
+
+ declare
+ Tdef : constant Node_Id :=
+ Type_Definition (Declaration_Node (Def_Id));
+ Clist : Node_Id;
+ Comp : Node_Id;
+
+ begin
+ if Nkind (Tdef) = N_Record_Definition then
+ Clist := Component_List (Tdef);
+
+ else
+ pragma Assert (Nkind (Tdef) = N_Derived_Type_Definition);
+ Clist := Component_List (Record_Extension_Part (Tdef));
+ end if;
+
+ if Present (Clist) then
+ Comp := First (Component_Items (Clist));
+ while Present (Comp) loop
+ if Present (Expression (Comp)) then
+ Error_Msg_N
+ ("component of imported 'C'P'P type cannot have" &
+ " default expression", Expression (Comp));
+ end if;
+
+ Next (Comp);
+ end loop;
+ end if;
+ end;
+
else
Error_Pragma_Arg
("second argument of pragma% must be object or subprogram",
Arg2);
end if;
- -- If this pragma applies to a compilation unit, then the unit,
- -- which is a subprogram, does not require (or allow) a body.
- -- We also do not need to elaborate imported procedures.
+ -- If this pragma applies to a compilation unit, then the unit, which
+ -- is a subprogram, does not require (or allow) a body. We also do
+ -- not need to elaborate imported procedures.
if Nkind (Parent (N)) = N_Compilation_Unit_Aux then
declare
Effective : Boolean := False;
procedure Make_Inline (Subp : Entity_Id);
- -- Subp is the defining unit name of the subprogram
- -- declaration. Set the flag, as well as the flag in the
- -- corresponding body, if there is one present.
+ -- Subp is the defining unit name of the subprogram declaration. Set
+ -- the flag, as well as the flag in the corresponding body, if there
+ -- is one present.
procedure Set_Inline_Flags (Subp : Entity_Id);
-- Sets Is_Inlined and Has_Pragma_Inline flags for Subp and also
Error_Msg_N ("pragma appears too late, ignored?", N);
return True;
- -- If the subprogram is a renaming as body, the body is
- -- just a call to the renamed subprogram, and inlining is
- -- trivially possible.
+ -- If the subprogram is a renaming as body, the body is just a
+ -- call to the renamed subprogram, and inlining is trivially
+ -- possible.
elsif
Nkind (Unit_Declaration_Node (Corresponding_Body (Decl))) =
-- However, a simple Comes_From_Source test is insufficient, since
-- we do want to allow inlining of generic instances which also do
- -- not come from source. We also need to recognize specs
- -- generated by the front-end for bodies that carry the pragma.
- -- Finally, predefined operators do not come from source but are
- -- not inlineable either.
+ -- not come from source. We also need to recognize specs generated
+ -- by the front-end for bodies that carry the pragma. Finally,
+ -- predefined operators do not come from source but are not
+ -- inlineable either.
elsif Is_Generic_Instance (Subp)
or else Nkind (Parent (Parent (Subp))) = N_Subprogram_Declaration
return;
end if;
- -- The referenced entity must either be the enclosing entity,
- -- or an entity declared within the current open scope.
+ -- The referenced entity must either be the enclosing entity, or
+ -- an entity declared within the current open scope.
if Present (Scope (Subp))
and then Scope (Subp) /= Current_Scope
return;
end if;
- -- Processing for procedure, operator or function.
- -- If subprogram is aliased (as for an instance) indicate
- -- that the renamed entity (if declared in the same unit)
- -- is inlined.
+ -- Processing for procedure, operator or function. If subprogram
+ -- is aliased (as for an instance) indicate that the renamed
+ -- entity (if declared in the same unit) is inlined.
if Is_Subprogram (Subp) then
while Present (Alias (Inner_Subp)) loop
and then Present (Corresponding_Body (Decl))
then
Set_Inline_Flags (Corresponding_Body (Decl));
+
+ elsif Is_Generic_Instance (Subp) then
+
+ -- Indicate that the body needs to be created for
+ -- inlining subsequent calls. The instantiation node
+ -- follows the declaration of the wrapper package
+ -- created for it.
+
+ if Scope (Subp) /= Standard_Standard
+ and then
+ Need_Subprogram_Instance_Body
+ (Next (Unit_Declaration_Node (Scope (Alias (Subp)))),
+ Subp)
+ then
+ null;
+ end if;
end if;
end if;
Applies := True;
- -- For a generic subprogram set flag as well, for use at
- -- the point of instantiation, to determine whether the
- -- body should be generated.
+ -- For a generic subprogram set flag as well, for use at the point
+ -- of instantiation, to determine whether the body should be
+ -- generated.
elsif Is_Generic_Subprogram (Subp) then
Set_Inline_Flags (Subp);
Link_Nam : Node_Id;
String_Val : String_Id;
- procedure Check_Form_Of_Interface_Name (SN : Node_Id);
+ procedure Check_Form_Of_Interface_Name
+ (SN : Node_Id;
+ Ext_Name_Case : Boolean);
-- SN is a string literal node for an interface name. This routine
-- performs some minimal checks that the name is reasonable. In
-- particular that no spaces or other obviously incorrect characters
-- appear. This is only a warning, since any characters are allowed.
+ -- Ext_Name_Case is True for an External_Name, False for a Link_Name.
----------------------------------
-- Check_Form_Of_Interface_Name --
----------------------------------
- procedure Check_Form_Of_Interface_Name (SN : Node_Id) is
+ procedure Check_Form_Of_Interface_Name
+ (SN : Node_Id;
+ Ext_Name_Case : Boolean)
+ is
S : constant String_Id := Strval (Expr_Value_S (SN));
SL : constant Nat := String_Length (S);
C : Char_Code;
for J in 1 .. SL loop
C := Get_String_Char (S, J);
- if Warn_On_Export_Import
- and then
- (not In_Character_Range (C)
- or else (Get_Character (C) = ' '
- and then VM_Target /= CLI_Target)
- or else Get_Character (C) = ',')
+ -- Look for dubious character and issue unconditional warning.
+ -- Definitely dubious if not in character range.
+
+ if not In_Character_Range (C)
+
+ -- For all cases except CLI target,
+ -- commas, spaces and slashes are dubious (in CLI, we use
+ -- commas and backslashes in external names to specify
+ -- assembly version and public key, while slashes and spaces
+ -- can be used in names to mark nested classes and
+ -- valuetypes).
+
+ or else ((not Ext_Name_Case or else VM_Target /= CLI_Target)
+ and then (Get_Character (C) = ','
+ or else
+ Get_Character (C) = '\'))
+ or else (VM_Target /= CLI_Target
+ and then (Get_Character (C) = ' '
+ or else
+ Get_Character (C) = '/'))
then
- Error_Msg_N
- ("?interface name contains illegal character", SN);
+ Error_Msg
+ ("?interface name contains illegal character",
+ Sloc (SN) + Source_Ptr (J));
end if;
end loop;
end Check_Form_Of_Interface_Name;
if Present (Ext_Nam) then
Check_Arg_Is_Static_Expression (Ext_Nam, Standard_String);
- Check_Form_Of_Interface_Name (Ext_Nam);
+ Check_Form_Of_Interface_Name (Ext_Nam, Ext_Name_Case => True);
- -- Verify that the external name is not the name of a local
- -- entity, which would hide the imported one and lead to
- -- run-time surprises. The problem can only arise for entities
- -- declared in a package body (otherwise the external name is
- -- fully qualified and won't conflict).
+ -- Verify that external name is not the name of a local entity,
+ -- which would hide the imported one and could lead to run-time
+ -- surprises. The problem can only arise for entities declared in
+ -- a package body (otherwise the external name is fully qualified
+ -- and will not conflict).
declare
Nam : Name_Id;
Par := Parent (E);
while Present (Par) loop
if Nkind (Par) = N_Package_Body then
- Error_Msg_Sloc := Sloc (E);
+ Error_Msg_Sloc := Sloc (E);
Error_Msg_NE
("imported entity is hidden by & declared#",
- Ext_Arg, E);
+ Ext_Arg, E);
exit;
end if;
if Present (Link_Nam) then
Check_Arg_Is_Static_Expression (Link_Nam, Standard_String);
- Check_Form_Of_Interface_Name (Link_Nam);
+ Check_Form_Of_Interface_Name (Link_Nam, Ext_Name_Case => False);
end if;
-- If there is no link name, just set the external name
Link_Nam := Adjust_External_Name_Case (Expr_Value_S (Ext_Nam));
-- For the Link_Name case, the given literal is preceded by an
- -- asterisk, which indicates to GCC that the given name should
- -- be taken literally, and in particular that no prepending of
+ -- asterisk, which indicates to GCC that the given name should be
+ -- taken literally, and in particular that no prepending of
-- underlines should occur, even in systems where this is the
-- normal default.
begin
Set_Is_Interrupt_Handler (Handler_Proc);
- -- If the pragma is not associated with a handler procedure
- -- within a protected type, then it must be for a nonprotected
- -- procedure for the AAMP target, in which case we don't
- -- associate a representation item with the procedure's scope.
+ -- If the pragma is not associated with a handler procedure within a
+ -- protected type, then it must be for a nonprotected procedure for
+ -- the AAMP target, in which case we don't associate a representation
+ -- item with the procedure's scope.
if Ekind (Proc_Scope) = E_Protected_Type then
if Prag_Id = Pragma_Interrupt_Handler
Error_Msg_String (1 .. Rnm'Length) :=
Name_Buffer (1 .. Name_Len);
Error_Msg_Strlen := Rnm'Length;
- Error_Msg_N
+ Error_Msg_N -- CODEFIX
("\possible misspelling of ""~""",
Get_Pragma_Arg (Arg));
exit;
E : Entity_Id;
In_Package_Spec : constant Boolean :=
- (Ekind (Current_Scope) = E_Package
- or else
- Ekind (Current_Scope) = E_Generic_Package)
+ Is_Package_Or_Generic_Package (Current_Scope)
and then not In_Package_Body (Current_Scope);
procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id);
-- Start of processing for Process_Suppress_Unsuppress
begin
- -- Suppress/Unsuppress can appear as a configuration pragma,
- -- or in a declarative part or a package spec (RM 11.5(5))
+ -- Suppress/Unsuppress can appear as a configuration pragma, or in a
+ -- declarative part or a package spec (RM 11.5(5)).
if not Is_Configuration_Pragma then
Check_Is_In_Decl_Part_Or_Package_Spec;
E := Homonym (E);
exit when No (E);
- -- If we are within a package specification, the
- -- pragma only applies to homonyms in the same scope.
+ -- If we are within a package specification, the pragma only
+ -- applies to homonyms in the same scope.
exit when In_Package_Spec
and then Scope (E) /= Current_Scope;
Set_Is_Public (E);
Set_Is_Statically_Allocated (E);
- -- Warn if the corresponding W flag is set and the pragma
- -- comes from source. The latter may not be true e.g. on
- -- VMS where we expand export pragmas for exception codes
- -- associated with imported or exported exceptions. We do
- -- not want to generate a warning for something that the
- -- user did not write.
+ -- Warn if the corresponding W flag is set and the pragma comes
+ -- from source. The latter may not be true e.g. on VMS where we
+ -- expand export pragmas for exception codes associated with
+ -- imported or exported exceptions. We do not want to generate
+ -- a warning for something that the user did not write.
if Warn_On_Export_Import
and then Comes_From_Source (Arg)
elsif Nkind (Arg_External) = N_Identifier then
New_Name := Get_Default_External_Name (Arg_External);
- -- Check_Arg_Is_External_Name should let through only
- -- identifiers and string literals or static string
- -- expressions (which are folded to string literals).
+ -- Check_Arg_Is_External_Name should let through only identifiers and
+ -- string literals or static string expressions (which are folded to
+ -- string literals).
else
raise Program_Error;
end if;
- -- If we already have an external name set (by a prior normal
- -- Import or Export pragma), then the external names must match
+ -- If we already have an external name set (by a prior normal Import
+ -- or Export pragma), then the external names must match
if Present (Interface_Name (Internal_Ent)) then
Check_Matching_Internal_Names : declare
else
Set_Is_Imported (E);
- -- If the entity is an object that is not at the library
- -- level, then it is statically allocated. We do not worry
- -- about objects with address clauses in this context since
- -- they are not really imported in the linker sense.
+ -- If the entity is an object that is not at the library level,
+ -- then it is statically allocated. We do not worry about objects
+ -- with address clauses in this context since they are not really
+ -- imported in the linker sense.
if Is_Object (E)
and then not Is_Library_Level_Entity (E)
-- Set_Mechanism_Value --
-------------------------
- -- Note: the mechanism name has not been analyzed (and cannot indeed
- -- be analyzed, since it is semantic nonsense), so we get it in the
- -- exact form created by the parser.
+ -- Note: the mechanism name has not been analyzed (and cannot indeed be
+ -- analyzed, since it is semantic nonsense), so we get it in the exact
+ -- form created by the parser.
procedure Set_Mechanism_Value (Ent : Entity_Id; Mech_Name : Node_Id) is
Class : Node_Id;
Param : Node_Id;
+ Mech_Name_Id : Name_Id;
procedure Bad_Class;
-- Signal bad descriptor class name
("mechanism for & has already been set", Mech_Name, Ent);
end if;
- -- MECHANISM_NAME ::= value | reference | descriptor
+ -- MECHANISM_NAME ::= value | reference | descriptor |
+ -- short_descriptor
if Nkind (Mech_Name) = N_Identifier then
if Chars (Mech_Name) = Name_Value then
Set_Mechanism (Ent, By_Descriptor);
return;
+ elsif Chars (Mech_Name) = Name_Short_Descriptor then
+ Check_VMS (Mech_Name);
+ Set_Mechanism (Ent, By_Short_Descriptor);
+ return;
+
elsif Chars (Mech_Name) = Name_Copy then
Error_Pragma_Arg
("bad mechanism name, Value assumed", Mech_Name);
Bad_Mechanism;
end if;
- -- MECHANISM_NAME ::= descriptor (CLASS_NAME)
+ -- MECHANISM_NAME ::= descriptor (CLASS_NAME) |
+ -- short_descriptor (CLASS_NAME)
-- CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
-- Note: this form is parsed as an indexed component
elsif Nkind (Mech_Name) = N_Indexed_Component then
+
Class := First (Expressions (Mech_Name));
if Nkind (Prefix (Mech_Name)) /= N_Identifier
- or else Chars (Prefix (Mech_Name)) /= Name_Descriptor
- or else Present (Next (Class))
+ or else not (Chars (Prefix (Mech_Name)) = Name_Descriptor or else
+ Chars (Prefix (Mech_Name)) = Name_Short_Descriptor)
+ or else Present (Next (Class))
then
Bad_Mechanism;
+ else
+ Mech_Name_Id := Chars (Prefix (Mech_Name));
end if;
- -- MECHANISM_NAME ::= descriptor (Class => CLASS_NAME)
+ -- MECHANISM_NAME ::= descriptor (Class => CLASS_NAME) |
+ -- short_descriptor (Class => CLASS_NAME)
-- CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
-- Note: this form is parsed as a function call
Param := First (Parameter_Associations (Mech_Name));
if Nkind (Name (Mech_Name)) /= N_Identifier
- or else Chars (Name (Mech_Name)) /= Name_Descriptor
+ or else not (Chars (Name (Mech_Name)) = Name_Descriptor or else
+ Chars (Name (Mech_Name)) = Name_Short_Descriptor)
or else Present (Next (Param))
or else No (Selector_Name (Param))
or else Chars (Selector_Name (Param)) /= Name_Class
Bad_Mechanism;
else
Class := Explicit_Actual_Parameter (Param);
+ Mech_Name_Id := Chars (Name (Mech_Name));
end if;
else
if Nkind (Class) /= N_Identifier then
Bad_Class;
- elsif Chars (Class) = Name_UBS then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_UBS
+ then
Set_Mechanism (Ent, By_Descriptor_UBS);
- elsif Chars (Class) = Name_UBSB then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_UBSB
+ then
Set_Mechanism (Ent, By_Descriptor_UBSB);
- elsif Chars (Class) = Name_UBA then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_UBA
+ then
Set_Mechanism (Ent, By_Descriptor_UBA);
- elsif Chars (Class) = Name_S then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_S
+ then
Set_Mechanism (Ent, By_Descriptor_S);
- elsif Chars (Class) = Name_SB then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_SB
+ then
Set_Mechanism (Ent, By_Descriptor_SB);
- elsif Chars (Class) = Name_A then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_A
+ then
Set_Mechanism (Ent, By_Descriptor_A);
- elsif Chars (Class) = Name_NCA then
+ elsif Mech_Name_Id = Name_Descriptor
+ and then Chars (Class) = Name_NCA
+ then
Set_Mechanism (Ent, By_Descriptor_NCA);
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_UBS
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_UBS);
+
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_UBSB
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_UBSB);
+
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_UBA
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_UBA);
+
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_S
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_S);
+
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_SB
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_SB);
+
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_A
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_A);
+
+ elsif Mech_Name_Id = Name_Short_Descriptor
+ and then Chars (Class) = Name_NCA
+ then
+ Set_Mechanism (Ent, By_Short_Descriptor_NCA);
+
else
Bad_Class;
end if;
-- Set the corresponding restrictions
- Set_Profile_Restrictions (Ravenscar, N, Warn => False);
+ Set_Profile_Restrictions
+ (Ravenscar, N, Warn => Treat_Restrictions_As_Warnings);
end Set_Ravenscar_Profile;
-- Start of processing for Analyze_Pragma
for PN in First_Pragma_Name .. Last_Pragma_Name loop
if Is_Bad_Spelling_Of (Pname, PN) then
Error_Msg_Name_1 := PN;
- Error_Msg_N
+ Error_Msg_N -- CODEFIX
("\?possible misspelling of %!", Pragma_Identifier (N));
exit;
end if;
Opt.Check_Policy_List := N;
end Assertion_Policy;
+ ------------------------------
+ -- Assume_No_Invalid_Values --
+ ------------------------------
+
+ -- pragma Assume_No_Invalid_Values (On | Off);
+
+ when Pragma_Assume_No_Invalid_Values =>
+ GNAT_Pragma;
+ Check_Valid_Configuration_Pragma;
+ Check_Arg_Count (1);
+ Check_No_Identifiers;
+ Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
+
+ if Chars (Expression (Arg1)) = Name_On then
+ Assume_No_Invalid_Values := True;
+ else
+ Assume_No_Invalid_Values := False;
+ end if;
+
---------------
-- AST_Entry --
---------------
and then not Is_Remote_Types (C_Ent)
then
-- This pragma should only appear in an RCI or Remote Types
- -- unit (RM E.4.1(4))
+ -- unit (RM E.4.1(4)).
Error_Pragma
("pragma% not in Remote_Call_Interface or " &
elsif Is_Remote_Access_To_Subprogram_Type (Nm) then
- if Is_Record_Type (Nm) then
- -- A record type that is the Equivalent_Type for
- -- a remote access-to-subprogram type.
+ if Is_Record_Type (Nm) then
- N := Declaration_Node (Corresponding_Remote_Type (Nm));
+ -- A record type that is the Equivalent_Type for a remote
+ -- access-to-subprogram type.
- else
- -- A non-expanded RAS type (case where distribution is
- -- not enabled).
+ N := Declaration_Node (Corresponding_Remote_Type (Nm));
- N := Declaration_Node (Nm);
- end if;
+ else
+ -- A non-expanded RAS type (distribution is not enabled)
+
+ N := Declaration_Node (Nm);
+ end if;
if Nkind (N) = N_Full_Type_Declaration
and then Nkind (Type_Definition (N)) =
else
Analyze_And_Resolve (Expr, Any_Boolean);
end if;
-
- -- If assertion is of the form (X'First = literal), where X is
- -- a formal, then set Low_Bound_Known flag on this formal.
-
- if Nkind (Expr) = N_Op_Eq then
- declare
- Right : constant Node_Id := Right_Opnd (Expr);
- Left : constant Node_Id := Left_Opnd (Expr);
- begin
- if Nkind (Left) = N_Attribute_Reference
- and then Attribute_Name (Left) = Name_First
- and then Is_Entity_Name (Prefix (Left))
- and then Is_Formal (Entity (Prefix (Left)))
- and then Nkind (Right) = N_Integer_Literal
- then
- Set_Low_Bound_Known (Entity (Prefix (Left)));
- end if;
- end;
- end if;
end Check;
----------------
-- Check_Policy --
------------------
- -- pragma Check_Policy ([Name =>] IDENTIFIER,
- -- POLICY_IDENTIFIER;
+ -- pragma Check_Policy (
+ -- [Name =>] IDENTIFIER,
+ -- [Policy =>] POLICY_IDENTIFIER);
-- POLICY_IDENTIFIER ::= ON | OFF | CHECK | IGNORE
- -- Note: this is a configuration pragma, but it is allowed to
- -- appear anywhere else.
+ -- Note: this is a configuration pragma, but it is allowed to appear
+ -- anywhere else.
when Pragma_Check_Policy =>
GNAT_Pragma;
Check_Arg_Count (2);
- Check_No_Identifier (Arg2);
Check_Optional_Identifier (Arg1, Name_Name);
+ Check_Optional_Identifier (Arg2, Name_Policy);
Check_Arg_Is_One_Of
(Arg2, Name_On, Name_Off, Name_Check, Name_Ignore);
-- pragma Comment (static_string_EXPRESSION)
- -- Processing for pragma Comment shares the circuitry for
- -- pragma Ident. The only differences are that Ident enforces
- -- a limit of 31 characters on its argument, and also enforces
- -- limitations on placement for DEC compatibility. Pragma
- -- Comment shares neither of these restrictions.
+ -- Processing for pragma Comment shares the circuitry for pragma
+ -- Ident. The only differences are that Ident enforces a limit of 31
+ -- characters on its argument, and also enforces limitations on
+ -- placement for DEC compatibility. Pragma Comment shares neither of
+ -- these restrictions.
-------------------
-- Common_Object --
-- (boolean_EXPRESSION, static_string_EXPRESSION);
when Pragma_Compile_Time_Error =>
+ GNAT_Pragma;
Process_Compile_Time_Warning_Or_Error;
--------------------------
-- (boolean_EXPRESSION, static_string_EXPRESSION);
when Pragma_Compile_Time_Warning =>
+ GNAT_Pragma;
Process_Compile_Time_Warning_Or_Error;
-------------------
Check_Arg_Is_Identifier (Form);
- -- Get proper alignment, note that Default = Component_Size
- -- on all machines we have so far, and we want to set this
- -- value rather than the default value to indicate that it
- -- has been explicitly set (and thus will not get overridden
- -- by the default component alignment for the current scope)
+ -- Get proper alignment, note that Default = Component_Size on all
+ -- machines we have so far, and we want to set this value rather
+ -- than the default value to indicate that it has been explicitly
+ -- set (and thus will not get overridden by the default component
+ -- alignment for the current scope)
if Chars (Form) = Name_Component_Size then
Atype := Calign_Component_Size;
Set_Is_CPP_Class (Typ);
Set_Is_Limited_Record (Typ);
Set_Convention (Typ, Convention_CPP);
+
+ -- Imported CPP types must not have discriminants (because C++
+ -- classes do not have discriminants).
+
+ if Has_Discriminants (Typ) then
+ Error_Msg_N
+ ("imported 'C'P'P type cannot have discriminants",
+ First (Discriminant_Specifications
+ (Declaration_Node (Typ))));
+ end if;
+
+ -- Components of imported CPP types must not have default
+ -- expressions because the constructor (if any) is in the
+ -- C++ side.
+
+ if Is_Incomplete_Or_Private_Type (Typ)
+ and then No (Underlying_Type (Typ))
+ then
+ -- It should be an error to apply pragma CPP to a private
+ -- type if the underlying type is not visible (as it is
+ -- for any representation item). For now, for backward
+ -- compatibility we do nothing but we cannot check components
+ -- because they are not available at this stage. All this code
+ -- will be removed when we cleanup this obsolete GNAT pragma???
+
+ null;
+
+ else
+ declare
+ Tdef : constant Node_Id :=
+ Type_Definition (Declaration_Node (Typ));
+ Clist : Node_Id;
+ Comp : Node_Id;
+
+ begin
+ if Nkind (Tdef) = N_Record_Definition then
+ Clist := Component_List (Tdef);
+ else
+ pragma Assert (Nkind (Tdef) = N_Derived_Type_Definition);
+ Clist := Component_List (Record_Extension_Part (Tdef));
+ end if;
+
+ if Present (Clist) then
+ Comp := First (Component_Items (Clist));
+ while Present (Comp) loop
+ if Present (Expression (Comp)) then
+ Error_Msg_N
+ ("component of imported 'C'P'P type cannot have" &
+ " default expression", Expression (Comp));
+ end if;
+
+ Next (Comp);
+ end loop;
+ end if;
+ end;
+ end if;
end CPP_Class;
---------------------
-- [, [Link_Name =>] static_string_EXPRESSION ]);
when Pragma_CPP_Constructor => CPP_Constructor : declare
- Id : Entity_Id;
- Def_Id : Entity_Id;
+ Elmt : Elmt_Id;
+ Id : Entity_Id;
+ Def_Id : Entity_Id;
+ Tag_Typ : Entity_Id;
begin
GNAT_Pragma;
Def_Id := Entity (Id);
if Ekind (Def_Id) = E_Function
- and then Is_Class_Wide_Type (Etype (Def_Id))
- and then Is_CPP_Class (Etype (Etype (Def_Id)))
+ and then (Is_CPP_Class (Etype (Def_Id))
+ or else (Is_Class_Wide_Type (Etype (Def_Id))
+ and then
+ Is_CPP_Class (Root_Type (Etype (Def_Id)))))
then
if Arg_Count >= 2 then
Set_Imported (Def_Id);
Process_Interface_Name (Def_Id, Arg2, Arg3);
end if;
- if No (Parameter_Specifications (Parent (Def_Id))) then
- Set_Has_Completion (Def_Id);
- Set_Is_Constructor (Def_Id);
- else
- Error_Pragma_Arg
- ("non-default constructors not implemented", Arg1);
+ Set_Has_Completion (Def_Id);
+ Set_Is_Constructor (Def_Id);
+
+ -- Imported C++ constructors are not dispatching primitives
+ -- because in C++ they don't have a dispatch table slot.
+ -- However, in Ada the constructor has the profile of a
+ -- function that returns a tagged type and therefore it has
+ -- been treated as a primitive operation during semantic
+ -- analysis. We now remove it from the list of primitive
+ -- operations of the type.
+
+ if Is_Tagged_Type (Etype (Def_Id))
+ and then not Is_Class_Wide_Type (Etype (Def_Id))
+ then
+ pragma Assert (Is_Dispatching_Operation (Def_Id));
+ Tag_Typ := Etype (Def_Id);
+
+ Elmt := First_Elmt (Primitive_Operations (Tag_Typ));
+ while Present (Elmt) and then Node (Elmt) /= Def_Id loop
+ Next_Elmt (Elmt);
+ end loop;
+
+ Remove_Elmt (Primitive_Operations (Tag_Typ), Elmt);
+ Set_Is_Dispatching_Operation (Def_Id, False);
end if;
+ -- For backward compatibility, if the constructor returns a
+ -- class wide type, and we internally change the return type to
+ -- the corresponding root type.
+
+ if Is_Class_Wide_Type (Etype (Def_Id)) then
+ Set_Etype (Def_Id, Root_Type (Etype (Def_Id)));
+ end if;
else
Error_Pragma_Arg
("pragma% requires function returning a 'C'P'P_Class type",
when Pragma_CPP_Virtual => CPP_Virtual : declare
begin
+ GNAT_Pragma;
+
if Warn_On_Obsolescent_Feature then
Error_Msg_N
("'G'N'A'T pragma cpp'_virtual is now obsolete and has " &
when Pragma_CPP_Vtable => CPP_Vtable : declare
begin
+ GNAT_Pragma;
+
if Warn_On_Obsolescent_Feature then
Error_Msg_N
("'G'N'A'T pragma cpp'_vtable is now obsolete and has " &
-- pragma Discard_Names [([On =>] LOCAL_NAME)];
when Pragma_Discard_Names => Discard_Names : declare
- E_Id : Entity_Id;
E : Entity_Id;
+ E_Id : Entity_Id;
begin
Check_Ada_83_Warning;
Check_Arg_Count (1);
Check_Optional_Identifier (Arg1, Name_On);
Check_Arg_Is_Local_Name (Arg1);
+
E_Id := Expression (Arg1);
if Etype (E_Id) = Any_Type then
end if;
if (Is_First_Subtype (E)
- and then (Is_Enumeration_Type (E)
- or else Is_Tagged_Type (E)))
+ and then
+ (Is_Enumeration_Type (E) or else Is_Tagged_Type (E)))
or else Ekind (E) = E_Exception
then
Set_Discard_Names (E);
Error_Pragma_Arg
("inappropriate entity for pragma%", Arg1);
end if;
+
end if;
end if;
end Discard_Names;
Cunit_Node := Cunit (Current_Sem_Unit);
Cunit_Ent := Cunit_Entity (Current_Sem_Unit);
- if Nkind (Unit (Cunit_Node)) = N_Package_Body
- or else
- Nkind (Unit (Cunit_Node)) = N_Subprogram_Body
+ if Nkind_In (Unit (Cunit_Node), N_Package_Body,
+ N_Subprogram_Body)
then
Error_Pragma ("pragma% must refer to a spec, not a body");
else
-- safe from an elaboration point of view, so a client must
-- still do an Elaborate_All on such units.
- -- Debug flag -gnatdD restores the old behavior of 3.13,
- -- where Elaborate_Body always suppressed elab warnings.
+ -- Debug flag -gnatdD restores the old behavior of 3.13, where
+ -- Elaborate_Body always suppressed elab warnings.
if Dynamic_Elaboration_Checks or Debug_Flag_DD then
Set_Suppress_Elaboration_Warnings (Cunit_Ent);
---------------
-- pragma Eliminate (
- -- [Unit_Name =>] IDENTIFIER |
- -- SELECTED_COMPONENT
- -- [,[Entity =>] IDENTIFIER |
- -- SELECTED_COMPONENT |
- -- STRING_LITERAL]
- -- [,]OVERLOADING_RESOLUTION);
+ -- [Unit_Name =>] IDENTIFIER | SELECTED_COMPONENT,
+ -- [,[Entity =>] IDENTIFIER |
+ -- SELECTED_COMPONENT |
+ -- STRING_LITERAL]
+ -- [, OVERLOADING_RESOLUTION]);
-- OVERLOADING_RESOLUTION ::= PARAMETER_AND_RESULT_TYPE_PROFILE |
-- SOURCE_LOCATION
Process_Interface_Name (Def_Id, Arg3, Arg4);
Set_Exported (Def_Id, Arg2);
- -- If the entity is a deferred constant, propagate the
- -- information to the full view, because gigi elaborates
- -- the full view only.
+ -- If the entity is a deferred constant, propagate the information
+ -- to the full view, because gigi elaborates the full view only.
if Ekind (Def_Id) = E_Constant
and then Present (Full_View (Def_Id))
Code : Node_Id renames Args (4);
begin
+ GNAT_Pragma;
+
if Inside_A_Generic then
Error_Pragma ("pragma% cannot be used for generic entities");
end if;
Typ : Entity_Id;
begin
+ GNAT_Pragma;
Check_No_Identifiers;
Check_Arg_Count (1);
Check_Arg_Is_Local_Name (Arg1);
-- pragma Ident (static_string_EXPRESSION)
- -- Note: pragma Comment shares this processing. Pragma Comment
- -- is identical to Ident, except that the restriction of the
- -- argument to 31 characters and the placement restrictions
- -- are not enforced for pragma Comment.
+ -- Note: pragma Comment shares this processing. Pragma Comment is
+ -- identical to Ident, except that the restriction of the argument to
+ -- 31 characters and the placement restrictions are not enforced for
+ -- pragma Comment.
when Pragma_Ident | Pragma_Comment => Ident : declare
Str : Node_Id;
Check_No_Identifiers;
Check_Arg_Is_Static_Expression (Arg1, Standard_String);
- -- For pragma Ident, preserve DEC compatibility by requiring
- -- the pragma to appear in a declarative part or package spec.
+ -- For pragma Ident, preserve DEC compatibility by requiring the
+ -- pragma to appear in a declarative part or package spec.
if Prag_Id = Pragma_Ident then
Check_Is_In_Decl_Part_Or_Package_Spec;
begin
GP := Parent (Parent (N));
- if Nkind (GP) = N_Package_Declaration
- or else
- Nkind (GP) = N_Generic_Package_Declaration
+ if Nkind_In (GP, N_Package_Declaration,
+ N_Generic_Package_Declaration)
then
GP := Parent (GP);
end if;
- -- If we have a compilation unit, then record the ident
- -- value, checking for improper duplication.
+ -- If we have a compilation unit, then record the ident value,
+ -- checking for improper duplication.
if Nkind (GP) = N_Compilation_Unit then
CS := Ident_String (Current_Sem_Unit);
if Prag_Id = Pragma_Ident then
Error_Pragma ("duplicate% pragma not permitted");
- -- For Comment, we concatenate the string, unless we
- -- want to preserve the tree structure for ASIS.
+ -- For Comment, we concatenate the string, unless we want
+ -- to preserve the tree structure for ASIS.
elsif not ASIS_Mode then
Start_String (Strval (CS));
Set_Ident_String (Current_Sem_Unit, Str);
end if;
- -- For subunits, we just ignore the Ident, since in GNAT
- -- these are not separate object files, and hence not
- -- separate units in the unit table.
+ -- For subunits, we just ignore the Ident, since in GNAT these
+ -- are not separate object files, and hence not separate units
+ -- in the unit table.
elsif Nkind (GP) = N_Subunit then
null;
Code : Node_Id renames Args (4);
begin
+ GNAT_Pragma;
Gather_Associations (Names, Args);
if Present (External) and then Present (Code) then
Check_Valid_Configuration_Pragma;
Check_Restriction (No_Initialize_Scalars, N);
- if not Restriction_Active (No_Initialize_Scalars) then
+ -- Initialize_Scalars creates false positives in CodePeer,
+ -- so ignore this pragma in this mode.
+
+ if not Restriction_Active (No_Initialize_Scalars)
+ and then not CodePeer_Mode
+ then
Init_Or_Norm_Scalars := True;
Initialize_Scalars := True;
end if;
-- pragma Inline_Always ( NAME {, NAME} );
when Pragma_Inline_Always =>
+ GNAT_Pragma;
Process_Inline (True);
--------------------
-- pragma Inline_Generic (NAME {, NAME});
when Pragma_Inline_Generic =>
+ GNAT_Pragma;
Process_Generic_List;
----------------------
Preanalyze_Spec_Expression (Arg, RTE (RE_Interrupt_Priority));
end if;
- if Nkind (P) /= N_Task_Definition
- and then Nkind (P) /= N_Protected_Definition
- then
+ if not Nkind_In (P, N_Task_Definition, N_Protected_Definition) then
Pragma_Misplaced;
return;
-- INTERRUPT_ID => IDENTIFIER | static_integer_EXPRESSION
-- INTERRUPT_STATE => System | Runtime | User
- -- Note: if the interrupt id is given as an identifier, then
- -- it must be one of the identifiers in Ada.Interrupts.Names.
- -- Otherwise it is given as a static integer expression which
- -- must be in the range of Ada.Interrupts.Interrupt_ID.
+ -- Note: if the interrupt id is given as an identifier, then it must
+ -- be one of the identifiers in Ada.Interrupts.Names. Otherwise it is
+ -- given as a static integer expression which must be in the range of
+ -- Ada.Interrupts.Interrupt_ID.
when Pragma_Interrupt_State => Interrupt_State : declare
Next_Entity (Int_Ent);
end loop;
- -- First argument is not an identifier, so it must be a
- -- static expression of type Ada.Interrupts.Interrupt_ID.
+ -- First argument is not an identifier, so it must be a static
+ -- expression of type Ada.Interrupts.Interrupt_ID.
else
Check_Arg_Is_Static_Expression (Arg1, Any_Integer);
and then
(Is_Value_Type (Etype (Def_Id))
or else
+ (Ekind (Etype (Def_Id)) = E_Access_Subprogram_Type
+ and then
+ Atree.Convention (Etype (Def_Id)) = Convention)
+ or else
(Ekind (Etype (Def_Id)) in Access_Kind
and then
(Atree.Convention
pragma Assert (Convention = Convention_CIL);
Error_Pragma_Arg
("pragma% requires function returning a " &
- "'CIL access type", Arg1);
+ "'C'I'L access type", Arg1);
end if;
end if;
Typ := Underlying_Type (Entity (Arg));
- -- For now we simply check some of the semantic constraints
- -- on the type. This currently leaves out some restrictions
- -- on interface types, namely that the parent type must be
- -- java.lang.Object.Typ and that all primitives of the type
- -- should be declared abstract. ???
+ -- For now simply check some of the semantic constraints on the
+ -- type. This currently leaves out some restrictions on interface
+ -- types, namely that the parent type must be java.lang.Object.Typ
+ -- and that all primitives of the type should be declared
+ -- abstract. ???
if not Is_Tagged_Type (Typ) or else not Is_Abstract_Type (Typ) then
Error_Pragma_Arg ("pragma% requires an abstract "
while Present (Arg) loop
Check_Arg_Is_Static_Expression (Arg, Standard_String);
- -- Store argument, converting sequences of spaces
- -- to a single null character (this is one of the
- -- differences in processing between Link_With
- -- and Linker_Options).
+ -- Store argument, converting sequences of spaces to a
+ -- single null character (this is one of the differences
+ -- in processing between Link_With and Linker_Options).
Arg_Store : declare
C : constant Char_Code := Get_Char_Code (' ');
Skip_Spaces; -- skip leading spaces
-- Loop through characters, changing any embedded
- -- sequence of spaces to a single null character
- -- (this is how Link_With/Linker_Options differ)
+ -- sequence of spaces to a single null character (this
+ -- is how Link_With/Linker_Options differ)
while F <= L loop
if Get_String_Char (S, F) = C then
Check_Arg_Is_Library_Level_Local_Name (Arg1);
Check_Arg_Is_Static_Expression (Arg2, Standard_String);
+ -- This pragma applies only to objects
+
+ if not Is_Object (Entity (Expression (Arg1))) then
+ Error_Pragma_Arg ("pragma% applies only to objects", Arg1);
+ end if;
+
-- The only processing required is to link this item on to the
-- list of rep items for the given entity. This is accomplished
-- by the call to Rep_Item_Too_Late (when no error is detected
-- pragma List (On | Off)
- -- There is nothing to do here, since we did all the processing
- -- for this pragma in Par.Prag (so that it works properly even in
- -- syntax only mode)
+ -- There is nothing to do here, since we did all the processing for
+ -- this pragma in Par.Prag (so that it works properly even in syntax
+ -- only mode).
when Pragma_List =>
null;
Error_Msg_Sloc := Locking_Policy_Sloc;
Error_Pragma ("locking policy incompatible with policy#");
- -- Set new policy, but always preserve System_Location since
- -- we like the error message with the run time name.
+ -- Set new policy, but always preserve System_Location since we
+ -- like the error message with the run time name.
else
Locking_Policy := LP;
-- pragma Machine_Attribute (
-- [Entity =>] LOCAL_NAME,
-- [Attribute_Name =>] static_string_EXPRESSION
- -- [, [Info =>] static_string_EXPRESSION] );
+ -- [, [Info =>] static_EXPRESSION] );
when Pragma_Machine_Attribute => Machine_Attribute : declare
Def_Id : Entity_Id;
if Arg_Count = 3 then
Check_Optional_Identifier (Arg3, Name_Info);
- Check_Arg_Is_Static_Expression (Arg3, Standard_String);
+ Check_Arg_Is_Static_Expression (Arg3);
else
Check_Arg_Count (2);
end if;
-- it was misplaced.
when Pragma_No_Body =>
+ GNAT_Pragma;
Pragma_Misplaced;
---------------
Arg : Node_Id;
begin
- GNAT_Pragma;
+ Ada_2005_Pragma;
Check_At_Least_N_Arguments (1);
-- Loop through arguments of pragma
end loop;
end No_Return;
+ -----------------
+ -- No_Run_Time --
+ -----------------
+
+ -- pragma No_Run_Time;
+
+ -- Note: this pragma is retained for backwards compatibility. See
+ -- body of Rtsfind for full details on its handling.
+
+ when Pragma_No_Run_Time =>
+ GNAT_Pragma;
+ Check_Valid_Configuration_Pragma;
+ Check_Arg_Count (0);
+
+ No_Run_Time_Mode := True;
+ Configurable_Run_Time_Mode := True;
+
+ -- 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);
+ Set_Restriction (Max_Tasks, N, 0);
+ Set_Restriction (No_Tasking, N);
+
------------------------
-- No_Strict_Aliasing --
------------------------
-- pragma No_Strict_Aliasing [([Entity =>] type_LOCAL_NAME)];
- when Pragma_No_Strict_Aliasing => No_Strict_Alias : declare
+ when Pragma_No_Strict_Aliasing => No_Strict_Aliasing : declare
E_Id : Entity_Id;
begin
Set_No_Strict_Aliasing (Implementation_Base_Type (E_Id));
end if;
- end No_Strict_Alias;
+ end No_Strict_Aliasing;
+
+ -----------------------
+ -- Normalize_Scalars --
+ -----------------------
+
+ -- pragma Normalize_Scalars;
+
+ when Pragma_Normalize_Scalars =>
+ Check_Ada_83_Warning;
+ Check_Arg_Count (0);
+ Check_Valid_Configuration_Pragma;
+
+ -- Normalize_Scalars creates false positives in CodePeer, so
+ -- ignore this pragma in this mode.
+
+ if not CodePeer_Mode then
+ Normalize_Scalars := True;
+ Init_Or_Norm_Scalars := True;
+ end if;
-----------------
-- Obsolescent --
-----------------
- -- pragma Obsolescent [(
- -- [Entity => NAME,]
- -- [(static_string_EXPRESSION [, Ada_05])];
+ -- pragma Obsolescent;
+
+ -- pragma Obsolescent (
+ -- [Message =>] static_string_EXPRESSION
+ -- [,[Version =>] Ada_05]]);
+
+ -- pragma Obsolescent (
+ -- [Entity =>] NAME
+ -- [,[Message =>] static_string_EXPRESSION
+ -- [,[Version =>] Ada_05]] );
when Pragma_Obsolescent => Obsolescent : declare
Ename : Node_Id;
if Present (Ename) then
- -- If entity name matches, we are fine
+ -- If entity name matches, we are fine. Save entity in
+ -- pragma argument, for ASIS use.
if Chars (Ename) = Chars (Ent) then
- null;
+ Set_Entity (Ename, Ent);
+ Generate_Reference (Ent, Ename);
-- If entity name does not match, only possibility is an
-- enumeration literal from an enumeration type declaration.
"enumeration literal");
elsif Chars (Ent) = Chars (Ename) then
+ Set_Entity (Ename, Ent);
+ Generate_Reference (Ent, Ename);
exit;
else
-- See if first argument specifies an entity name
if Arg_Count >= 1
- and then Chars (Arg1) = Name_Entity
+ and then
+ (Chars (Arg1) = Name_Entity
+ or else
+ Nkind_In (Get_Pragma_Arg (Arg1), N_Character_Literal,
+ N_Identifier,
+ N_Operator_Symbol))
then
Ename := Get_Pragma_Arg (Arg1);
- if Nkind (Ename) /= N_Character_Literal
- and then
- Nkind (Ename) /= N_Identifier
- and then
- Nkind (Ename) /= N_Operator_Symbol
- then
- Error_Pragma_Arg ("entity name expected for pragma%", Arg1);
- end if;
-
-- Eliminate first argument, so we can share processing
Arg1 := Arg2;
Ename := Empty;
end if;
- Check_No_Identifiers;
+ if Arg_Count >= 1 then
+ Check_Optional_Identifier (Arg1, Name_Message);
+
+ if Arg_Count = 2 then
+ Check_Optional_Identifier (Arg2, Name_Version);
+ end if;
+ end if;
-- Get immediately preceding declaration
declare
Ent : constant Entity_Id := Find_Lib_Unit_Name;
begin
- if Ekind (Ent) = E_Package
- or else Ekind (Ent) = E_Generic_Package
- then
+ if Is_Package_Or_Generic_Package (Ent) then
Set_Obsolescent (Ent);
return;
end if;
-- Cases where we must follow a declaration
else
- if Nkind (Decl) not in N_Declaration
+ if Nkind (Decl) not in N_Declaration
and then Nkind (Decl) not in N_Later_Decl_Item
and then Nkind (Decl) not in N_Generic_Declaration
+ and then Nkind (Decl) not in N_Renaming_Declaration
then
Error_Pragma
- ("pragma% misplaced, " &
- "must immediately follow a declaration");
+ ("pragma% misplaced, "
+ & "must immediately follow a declaration");
else
Set_Obsolescent (Defining_Entity (Decl));
end if;
end Obsolescent;
- -----------------
- -- No_Run_Time --
- -----------------
-
- -- pragma No_Run_Time
-
- -- Note: this pragma is retained for backwards compatibility.
- -- See body of Rtsfind for full details on its handling.
-
- when Pragma_No_Run_Time =>
- GNAT_Pragma;
- Check_Valid_Configuration_Pragma;
- Check_Arg_Count (0);
-
- No_Run_Time_Mode := True;
- Configurable_Run_Time_Mode := True;
-
- -- 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);
- Set_Restriction (Max_Tasks, N, 0);
- Set_Restriction (No_Tasking, N);
-
- -----------------------
- -- Normalize_Scalars --
- -----------------------
-
- -- pragma Normalize_Scalars;
-
- when Pragma_Normalize_Scalars =>
- Check_Ada_83_Warning;
- Check_Arg_Count (0);
- Check_Valid_Configuration_Pragma;
- Normalize_Scalars := True;
- Init_Or_Norm_Scalars := True;
-
--------------
-- Optimize --
--------------
else
if not Rep_Item_Too_Late (Typ, N) then
- if VM_Target = No_VM then
- Set_Is_Packed (Base_Type (Typ));
+
+ -- In the context of static code analysis, we do not need
+ -- complex front-end expansions related to pragma Pack,
+ -- so disable handling of pragma Pack in this case.
+
+ if CodePeer_Mode then
+ null;
+
+ -- For normal non-VM target, do the packing
+
+ elsif VM_Target = No_VM then
+ Set_Is_Packed (Base_Type (Typ));
+ Set_Has_Pragma_Pack (Base_Type (Typ));
+ Set_Has_Non_Standard_Rep (Base_Type (Typ));
+
+ -- If we ignore the pack, then warn about this, except
+ -- that we suppress the warning in GNAT mode.
+
elsif not GNAT_Mode then
Error_Pragma
("?pragma% ignored in this configuration");
end if;
-
- Set_Has_Pragma_Pack (Base_Type (Typ));
- Set_Has_Non_Standard_Rep (Base_Type (Typ));
end if;
end if;
else pragma Assert (Is_Record_Type (Typ));
if not Rep_Item_Too_Late (Typ, N) then
if VM_Target = No_VM then
- Set_Is_Packed (Base_Type (Typ));
+ Set_Is_Packed (Base_Type (Typ));
+ Set_Has_Pragma_Pack (Base_Type (Typ));
+ Set_Has_Non_Standard_Rep (Base_Type (Typ));
+
elsif not GNAT_Mode then
Error_Pragma ("?pragma% ignored in this configuration");
end if;
-
- Set_Has_Pragma_Pack (Base_Type (Typ));
- Set_Has_Non_Standard_Rep (Base_Type (Typ));
end if;
end if;
end Pack;
-- pragma Page;
- -- There is nothing to do here, since we did all the processing
- -- for this pragma in Par.Prag (so that it works properly even in
- -- syntax only mode)
+ -- There is nothing to do here, since we did all the processing for
+ -- this pragma in Par.Prag (so that it works properly even in syntax
+ -- only mode).
when Pragma_Page =>
null;
end if;
end Preelab_Init;
- -------------
- -- Polling --
- -------------
-
- -- pragma Polling (ON | OFF);
-
- when Pragma_Polling =>
- GNAT_Pragma;
- Check_Arg_Count (1);
- Check_No_Identifiers;
- Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
- Polling_Required := (Chars (Expression (Arg1)) = Name_On);
-
--------------------
-- Persistent_BSS --
--------------------
end if;
end Persistent_BSS;
+ -------------
+ -- Polling --
+ -------------
+
+ -- pragma Polling (ON | OFF);
+
+ when Pragma_Polling =>
+ GNAT_Pragma;
+ Check_Arg_Count (1);
+ Check_No_Identifiers;
+ Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
+ Polling_Required := (Chars (Expression (Arg1)) = Name_On);
+
-------------------
-- Postcondition --
-------------------
Check_Precondition_Postcondition (In_Body);
- -- If in spec, nothing to do. If in body, then we convert the
- -- pragma to pragma Check (Precondition, cond [, msg]). Note we
- -- do this whether or not precondition checks are enabled. That
- -- works fine since pragma Check will do this check.
+ -- If in spec, nothing more to do. If in body, then we convert the
+ -- pragma to pragma Check (Precondition, cond [, msg]). Note we do
+ -- this whether or not precondition checks are enabled. That works
+ -- fine since pragma Check will do this check, and will also
+ -- analyze the condition itself in the proper context.
if In_Body then
if Arg_Count = 2 then
Analyze_And_Resolve (Get_Pragma_Arg (Arg2), Standard_String);
end if;
- Analyze_And_Resolve (Get_Pragma_Arg (Arg1), Standard_Boolean);
-
Rewrite (N,
Make_Pragma (Loc,
Chars => Name_Check,
-- Task or Protected, must be of type Integer
- elsif Nkind (P) = N_Protected_Definition
- or else
- Nkind (P) = N_Task_Definition
- then
+ elsif Nkind_In (P, N_Protected_Definition, N_Task_Definition) then
Arg := Expression (Arg1);
-- The expression must be analyzed in the special manner
else
Set_Has_Priority_Pragma (P, True);
- if Nkind (P) = N_Protected_Definition
- or else
- Nkind (P) = N_Task_Definition
- then
+ if Nkind_In (P, N_Protected_Definition, N_Task_Definition) then
Record_Rep_Item (Defining_Identifier (Parent (P)), N);
-- exp_ch9 should use this ???
end if;
if Chars (Argx) = Name_Ravenscar then
Set_Ravenscar_Profile (N);
elsif Chars (Argx) = Name_Restricted then
- Set_Profile_Restrictions (Restricted, N, Warn => False);
+ Set_Profile_Restrictions
+ (Restricted, N, Warn => Treat_Restrictions_As_Warnings);
else
Error_Pragma_Arg ("& is not a valid profile", Argx);
end if;
X : constant Node_Id := Original_Node (Arg);
begin
- if Nkind (X) /= N_String_Literal
- and then
- Nkind (X) /= N_Identifier
- then
+ if not Nkind_In (X, N_String_Literal, N_Identifier) then
Error_Pragma_Arg
("inappropriate argument for pragma %", Arg);
end if;
if not GNAT_Mode then
Error_Pragma ("pragma% only available in GNAT mode");
end if;
+
if Nkind (N) = N_Null_Statement then
return;
end if;
Error_Msg_Sloc := Queuing_Policy_Sloc;
Error_Pragma ("queuing policy incompatible with policy#");
- -- Set new policy, but always preserve System_Location since
- -- we like the error message with the run time name.
+ -- Set new policy, but always preserve System_Location since we
+ -- like the error message with the run time name.
else
Queuing_Policy := QP;
Cunit_Node := Cunit (Current_Sem_Unit);
Cunit_Ent := Cunit_Entity (Current_Sem_Unit);
- if Nkind (Unit (Cunit_Node)) /= N_Package_Declaration
- and then
- Nkind (Unit (Cunit_Node)) /= N_Generic_Package_Declaration
+ if not Nkind_In (Unit (Cunit_Node), N_Package_Declaration,
+ N_Generic_Package_Declaration)
then
- Error_Pragma (
- "pragma% can only apply to a package declaration");
+ Error_Pragma
+ ("pragma% can only apply to a package declaration");
end if;
Set_Is_Remote_Types (Cunit_Ent);
GNAT_Pragma;
Check_Arg_Count (0);
Check_Valid_Configuration_Pragma;
- Set_Profile_Restrictions (Restricted, N, Warn => False);
+ Set_Profile_Restrictions
+ (Restricted, N, Warn => Treat_Restrictions_As_Warnings);
if Warn_On_Obsolescent_Feature then
Error_Msg_N
-- | restriction_parameter_IDENTIFIER => EXPRESSION
when Pragma_Restrictions =>
- Process_Restrictions_Or_Restriction_Warnings (Warn => False);
+ Process_Restrictions_Or_Restriction_Warnings
+ (Warn => Treat_Restrictions_As_Warnings);
--------------------------
-- Restriction_Warnings --
Cunit_Node := Cunit (Current_Sem_Unit);
Cunit_Ent := Cunit_Entity (Current_Sem_Unit);
- if Nkind (Unit (Cunit_Node)) /= N_Package_Declaration
- and then
- Nkind (Unit (Cunit_Node)) /= N_Generic_Package_Declaration
+ if not Nkind_In (Unit (Cunit_Node), N_Package_Declaration,
+ N_Generic_Package_Declaration)
then
- Error_Pragma (
- "pragma% can only apply to a package declaration");
+ Error_Pragma
+ ("pragma% can only apply to a package declaration");
end if;
Set_Is_Shared_Passive (Cunit_Ent);
-- CASING_SPEC ::= Uppercase | Lowercase | Mixedcase
-- Pragma Source_File_Name_Project (SFNP) is equivalent to pragma
- -- Source_File_Name (SFN), however their usage is exclusive:
- -- SFN can only be used when no project file is used, while
- -- SFNP can only be used when a project file is used.
+ -- Source_File_Name (SFN), however their usage is exclusive: SFN can
+ -- only be used when no project file is used, while SFNP can only be
+ -- used when a project file is used.
- -- No processing here. Processing was completed during parsing,
- -- since we need to have file names set as early as possible.
- -- Units are loaded well before semantic processing starts.
+ -- No processing here. Processing was completed during parsing, since
+ -- we need to have file names set as early as possible. Units are
+ -- loaded well before semantic processing starts.
- -- The only processing we defer to this point is the check
- -- for correct placement.
+ -- The only processing we defer to this point is the check for
+ -- correct placement.
when Pragma_Source_File_Name =>
GNAT_Pragma;
-- See Source_File_Name for syntax
- -- No processing here. Processing was completed during parsing,
- -- since we need to have file names set as early as possible.
- -- Units are loaded well before semantic processing starts.
+ -- No processing here. Processing was completed during parsing, since
+ -- we need to have file names set as early as possible. Units are
+ -- loaded well before semantic processing starts.
- -- The only processing we defer to this point is the check
- -- for correct placement.
+ -- The only processing we defer to this point is the check for
+ -- correct placement.
when Pragma_Source_File_Name_Project =>
GNAT_Pragma;
Check_Valid_Configuration_Pragma;
- -- Check that a pragma Source_File_Name_Project is used only
- -- in a configuration pragmas file.
+ -- Check that a pragma Source_File_Name_Project is used only in a
+ -- configuration pragmas file.
- -- Pragmas Source_File_Name_Project should only be generated
- -- by the Project Manager in configuration pragmas files.
+ -- Pragmas Source_File_Name_Project should only be generated by
+ -- the Project Manager in configuration pragmas files.
-- This is really an ugly test. It seems to depend on some
- -- accidental and undocumented property. At the very least
- -- it needs to be documented, but it would be better to have
- -- a clean way of testing if we are in a configuration file???
+ -- accidental and undocumented property. At the very least it
+ -- needs to be documented, but it would be better to have a
+ -- clean way of testing if we are in a configuration file???
if Present (Parent (N)) then
Error_Pragma
-- pragma Source_Reference (INTEGER_LITERAL [, STRING_LITERAL]);
- -- Nothing to do, all processing completed in Par.Prag, since we
- -- need the information for possible parser messages that are output
+ -- Nothing to do, all processing completed in Par.Prag, since we need
+ -- the information for possible parser messages that are output.
when Pragma_Source_Reference =>
GNAT_Pragma;
when Pragma_Stream_Convert => Stream_Convert : declare
procedure Check_OK_Stream_Convert_Function (Arg : Node_Id);
- -- Check that the given argument is the name of a local
- -- function of one argument that is not overloaded earlier
- -- in the current local scope. A check is also made that the
- -- argument is a function with one parameter.
+ -- Check that the given argument is the name of a local function
+ -- of one argument that is not overloaded earlier in the current
+ -- local scope. A check is also made that the argument is a
+ -- function with one parameter.
--------------------------------------
-- Check_OK_Stream_Convert_Function --
-- pragma Style_Checks (On | Off | ALL_CHECKS | STRING_LITERAL);
- -- This is processed by the parser since some of the style
- -- checks take place during source scanning and parsing. This
- -- means that we don't need to issue error messages here.
+ -- This is processed by the parser since some of the style checks
+ -- take place during source scanning and parsing. This means that
+ -- we don't need to issue error messages here.
when Pragma_Style_Checks => Style_Checks : declare
A : constant Node_Id := Expression (Arg1);
-- pragma Suppress_All;
- -- The only check made here is that the pragma appears in the
- -- proper place, i.e. following a compilation unit. If indeed
- -- it appears in this context, then the parser has already
- -- inserted an equivalent pragma Suppress (All_Checks) to get
- -- the required effect.
+ -- The only check made here is that the pragma appears in the proper
+ -- place, i.e. following a compilation unit. If indeed it appears in
+ -- this context, then the parser has already inserted an equivalent
+ -- pragma Suppress (All_Checks) to get the required effect.
when Pragma_Suppress_All =>
GNAT_Pragma;
-- pragma System_Name (DIRECT_NAME);
- -- Syntax check: one argument, which must be the identifier GNAT
- -- or the identifier GCC, no other identifiers are acceptable.
+ -- Syntax check: one argument, which must be the identifier GNAT or
+ -- the identifier GCC, no other identifiers are acceptable.
when Pragma_System_Name =>
+ GNAT_Pragma;
Check_No_Identifiers;
Check_Arg_Count (1);
Check_Arg_Is_One_Of (Arg1, Name_Gcc, Name_Gnat);
Error_Pragma
("task dispatching policy incompatible with policy#");
- -- Set new policy, but always preserve System_Location since
- -- we like the error message with the run time name.
+ -- Set new policy, but always preserve System_Location since we
+ -- like the error message with the run time name.
else
Task_Dispatching_Policy := DP;
Check_Arg_Count (1);
Arg := Expression (Arg1);
- Analyze_And_Resolve (Arg, Standard_String);
+
+ -- The expression is used in the call to Create_Task, and must be
+ -- expanded there, not in the context of the current spec. It must
+ -- however be analyzed to capture global references, in case it
+ -- appears in a generic context.
+
+ Preanalyze_And_Resolve (Arg, Standard_String);
if Nkind (P) /= N_Task_Definition then
Pragma_Misplaced;
end if;
end Task_Storage;
+ --------------------------
+ -- Thread_Local_Storage --
+ --------------------------
+
+ -- pragma Thread_Local_Storage ([Entity =>] LOCAL_NAME);
+
+ when Pragma_Thread_Local_Storage => Thread_Local_Storage : declare
+ Id : Node_Id;
+ E : Entity_Id;
+
+ begin
+ GNAT_Pragma;
+ Check_Arg_Count (1);
+ Check_Optional_Identifier (Arg1, Name_Entity);
+ Check_Arg_Is_Library_Level_Local_Name (Arg1);
+
+ Id := Expression (Arg1);
+ Analyze (Id);
+
+ if not Is_Entity_Name (Id)
+ or else Ekind (Entity (Id)) /= E_Variable
+ then
+ Error_Pragma_Arg ("local variable name required", Arg1);
+ end if;
+
+ E := Entity (Id);
+
+ if Rep_Item_Too_Early (E, N)
+ or else Rep_Item_Too_Late (E, N)
+ then
+ raise Pragma_Exit;
+ end if;
+
+ Set_Has_Pragma_Thread_Local_Storage (E);
+ Set_Has_Gigi_Rep_Item (E);
+ end Thread_Local_Storage;
+
----------------
-- Time_Slice --
----------------
Variant : Node_Id;
begin
- GNAT_Pragma;
+ Ada_2005_Pragma;
Check_No_Identifiers;
Check_Arg_Count (1);
Check_Arg_Is_Local_Name (Arg1);
-- pragma Unimplemented_Unit;
- -- Note: this only gives an error if we are generating code,
- -- or if we are in a generic library unit (where the pragma
- -- appears in the body, not in the spec).
+ -- Note: this only gives an error if we are generating code, or if
+ -- we are in a generic library unit (where the pragma appears in the
+ -- body, not in the spec).
when Pragma_Unimplemented_Unit => Unimplemented_Unit : declare
Cunitent : constant Entity_Id :=
GNAT_Pragma;
-- If this is a configuration pragma, then set the universal
- -- addressing option, otherwise confirm that the pragma
- -- satisfies the requirements of library unit pragma placement
- -- and leave it to the GNAAMP back end to detect the pragma
- -- (avoids transitive setting of the option due to withed units).
+ -- addressing option, otherwise confirm that the pragma satisfies
+ -- the requirements of library unit pragma placement and leave it
+ -- to the GNAAMP back end to detect the pragma (avoids transitive
+ -- setting of the option due to withed units).
if Is_Configuration_Pragma then
Universal_Addressing_On_AAMP := True;
while Present (Arg_Node) loop
Check_No_Identifier (Arg_Node);
- -- Note: the analyze call done by Check_Arg_Is_Local_Name
- -- will in fact generate reference, so that the entity will
- -- have a reference, which will inhibit any warnings about
- -- it not being referenced, and also properly show up in the
- -- ali file as a reference. But this reference is recorded
- -- before the Has_Pragma_Unreferenced flag is set, so that
- -- no warning is generated for this reference.
+ -- Note: the analyze call done by Check_Arg_Is_Local_Name will
+ -- in fact generate reference, so that the entity will have a
+ -- reference, which will inhibit any warnings about it not
+ -- being referenced, and also properly show up in the ali file
+ -- as a reference. But this reference is recorded before the
+ -- Has_Pragma_Unreferenced flag is set, so that no warning is
+ -- generated for this reference.
Check_Arg_Is_Local_Name (Arg_Node);
Arg_Expr := Get_Pragma_Arg (Arg_Node);
-- pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);
when Pragma_Unsuppress =>
- GNAT_Pragma;
+ Ada_2005_Pragma;
Process_Suppress_Unsuppress (False);
-------------------
-- pragma Wide_Character_Encoding (IDENTIFIER);
when Pragma_Wide_Character_Encoding =>
+ GNAT_Pragma;
-- Nothing to do, handled in parser. Note that we do not enforce
-- configuration pragma placement, this pragma can appear at any
and then
(Is_Generic_Instance (Result)
or else Nkind (Parent (Declaration_Node (Result))) =
- N_Subprogram_Renaming_Declaration)
+ N_Subprogram_Renaming_Declaration)
and then Present (Alias (Result))
loop
Result := Alias (Result);
function Is_Config_Static_String (Arg : Node_Id) return Boolean is
function Add_Config_Static_String (Arg : Node_Id) return Boolean;
- -- This is an internal recursive function that is just like the
- -- outer function except that it adds the string to the name buffer
- -- rather than placing the string in the name buffer.
+ -- This is an internal recursive function that is just like the outer
+ -- function except that it adds the string to the name buffer rather
+ -- than placing the string in the name buffer.
------------------------------
-- Add_Config_Static_String --
Pragma_Annotate => -1,
Pragma_Assert => -1,
Pragma_Assertion_Policy => 0,
+ Pragma_Assume_No_Invalid_Values => 0,
Pragma_Asynchronous => -1,
Pragma_Atomic => 0,
Pragma_Atomic_Components => 0,
Pragma_Task_Info => -1,
Pragma_Task_Name => -1,
Pragma_Task_Storage => 0,
+ Pragma_Thread_Local_Storage => 0,
Pragma_Time_Slice => -1,
Pragma_Title => -1,
Pragma_Unchecked_Union => 0,
-- Is_Pragma_String_Literal --
------------------------------
- -- This function returns true if the corresponding pragma argument is
- -- a static string expression. These are the only cases in which string
- -- literals can appear as pragma arguments. We also allow a string
- -- literal as the first argument to pragma Assert (although it will
- -- of course always generate a type error).
+ -- This function returns true if the corresponding pragma argument is a
+ -- static string expression. These are the only cases in which string
+ -- literals can appear as pragma arguments. We also allow a string literal
+ -- as the first argument to pragma Assert (although it will of course
+ -- always generate a type error).
function Is_Pragma_String_Literal (Par : Node_Id) return Boolean is
Pragn : constant Node_Id := Parent (Par);
procedure Process_Compilation_Unit_Pragmas (N : Node_Id) is
begin
- -- A special check for pragma Suppress_All. This is a strange DEC
- -- pragma, strange because it comes at the end of the unit. If we
- -- have a pragma Suppress_All in the Pragmas_After of the current
- -- unit, then we insert a pragma Suppress (All_Checks) at the start
- -- of the context clause to ensure the correct processing.
+ -- A special check for pragma Suppress_All, a very strange DEC pragma,
+ -- strange because it comes at the end of the unit. If we have a pragma
+ -- Suppress_All in the Pragmas_After of the current unit, then we insert
+ -- a pragma Suppress (All_Checks) at the start of the context clause to
+ -- ensure the correct processing.
declare
PA : constant List_Id := Pragmas_After (Aux_Decls_Node (N));
Hex : constant array (0 .. 15) of Character := "0123456789abcdef";
procedure Encode;
- -- Stores encoded value of character code CC. The encoding we
- -- use an underscore followed by four lower case hex digits.
+ -- Stores encoded value of character code CC. The encoding we use an
+ -- underscore followed by four lower case hex digits.
------------
-- Encode --
-- Start of processing for Set_Encoded_Interface_Name
begin
- -- If first character is asterisk, this is a link name, and we
- -- leave it completely unmodified. We also ignore null strings
- -- (the latter case happens only in error cases) and no encoding
- -- should occur for Java or AAMP interface names.
+ -- If first character is asterisk, this is a link name, and we leave it
+ -- completely unmodified. We also ignore null strings (the latter case
+ -- happens only in error cases) and no encoding should occur for Java or
+ -- AAMP interface names.
if Len = 0
or else Get_String_Char (Str, 1) = Get_Char_Code ('*')