sem_ch10.adb, [...] (Not_Impl_Defined_Unit): New name for Is_RM_Defined_Unit.
2011-09-06 Robert Dewar <dewar@adacore.com> * sem_ch10.adb, impunit.ads, impunit.adb (Not_Impl_Defined_Unit): New name for Is_RM_Defined_Unit. Also several fixes to this unit. From-SVN: r178596
This commit is contained in:
parent
5a7d7f9cf3
commit
ef417be147
@ -1,3 +1,8 @@
|
||||
2011-09-06 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* sem_ch10.adb, impunit.ads, impunit.adb (Not_Impl_Defined_Unit): New
|
||||
name for Is_RM_Defined_Unit. Also several fixes to this unit.
|
||||
|
||||
2011-09-06 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* impunit.ads, impunit.adb (Is_RM_Defined_Unit): New function.
|
||||
|
@ -826,11 +826,11 @@ package body Impunit is
|
||||
return False;
|
||||
end Is_Known_Unit;
|
||||
|
||||
------------------------
|
||||
-- Is_RM_Defined_Unit --
|
||||
------------------------
|
||||
---------------------------
|
||||
-- Not_Impl_Defined_Unit --
|
||||
---------------------------
|
||||
|
||||
function Is_RM_Defined_Unit (U : Unit_Number_Type) return Boolean is
|
||||
function Not_Impl_Defined_Unit (U : Unit_Number_Type) return Boolean is
|
||||
Fname : constant File_Name_Type := Unit_File_Name (U);
|
||||
|
||||
begin
|
||||
@ -848,21 +848,22 @@ package body Impunit is
|
||||
return True;
|
||||
end if;
|
||||
|
||||
-- If length of file name is greater than 12, not RM-defined. The value
|
||||
-- 12 here is an 8 char name with extension .ads.
|
||||
-- If length of file name is greater than 12, then it's a user unit
|
||||
-- and not a GNAT implementation defined unit.
|
||||
|
||||
if Name_Len > 12 then
|
||||
return True;
|
||||
end if;
|
||||
|
||||
-- Implementation defined if unit in the gnat hierarchy
|
||||
|
||||
if (Name_Len = 8 and then Name_Buffer (1 .. 8) = "gnat.ads")
|
||||
or else (Name_Len > 2 and then Name_Buffer (1 .. 2) = "g-")
|
||||
then
|
||||
return False;
|
||||
end if;
|
||||
|
||||
-- Not RM-defined if length of name greater than 12 (12 is 8 characters
|
||||
-- plus 4 for ".ads" appended at the end).
|
||||
|
||||
if Length_Of_Name (Fname) > 12 then
|
||||
return False;
|
||||
end if;
|
||||
|
||||
-- Not RM defined if file name does not start with a- s- i-
|
||||
-- Not implementation defined if file name does not start with a- s- i-
|
||||
|
||||
if Name_Len < 3
|
||||
or else Name_Buffer (2) /= '-'
|
||||
@ -872,14 +873,14 @@ package body Impunit is
|
||||
and then
|
||||
Name_Buffer (1) /= 's')
|
||||
then
|
||||
return False;
|
||||
return True;
|
||||
end if;
|
||||
|
||||
-- Not RM defined if file name does not end in .ads. This can happen
|
||||
-- Not impl-defined if file name does not end in .ads. This can happen
|
||||
-- when non-standard file names are being used.
|
||||
|
||||
if Name_Buffer (Name_Len - 3 .. Name_Len) /= ".ads" then
|
||||
return False;
|
||||
return True;
|
||||
end if;
|
||||
|
||||
-- Otherwise normalize file name to 8 characters
|
||||
@ -891,7 +892,8 @@ package body Impunit is
|
||||
end loop;
|
||||
|
||||
-- Check our lists of names, if we find a match, return corresponding
|
||||
-- indication of whether the file is RM defined.
|
||||
-- indication of whether the file is RM defined, respecting the RM
|
||||
-- version in which it is defined.
|
||||
|
||||
for J in Non_Imp_File_Names_95'Range loop
|
||||
if Name_Buffer (1 .. 8) = Non_Imp_File_Names_95 (J).Fname then
|
||||
@ -913,9 +915,11 @@ package body Impunit is
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
-- If no match in any of the lists, not RM defined
|
||||
-- If unit is in System, Ada or Interfaces hierarchies and did not match
|
||||
-- any entry in the list, means it is an internal implementation defined
|
||||
-- unit which the restriction should definition forbid.
|
||||
|
||||
return False;
|
||||
end Is_RM_Defined_Unit;
|
||||
return True;
|
||||
end Not_Impl_Defined_Unit;
|
||||
|
||||
end Impunit;
|
||||
|
@ -72,10 +72,14 @@ package Impunit is
|
||||
-- the known library units, and if so, returns True. If the name does not
|
||||
-- match any known library unit, False is returned.
|
||||
|
||||
function Is_RM_Defined_Unit (U : Unit_Number_Type) return Boolean;
|
||||
-- This function returns True if U represents a unit that is defined in
|
||||
-- the RM, as defined by the No_Implementation_Units restriction rules.
|
||||
-- It is used to implement this restriction, so if False is returned, it
|
||||
-- means that with'ing the unit violates the restriction.
|
||||
function Not_Impl_Defined_Unit (U : Unit_Number_Type) return Boolean;
|
||||
-- This function returns True if U represents a unit that is permitted by
|
||||
-- the restriction No_Implementation_Units (i.e. a unit in the Ada, System,
|
||||
-- and Interfaces hierarchies that is defined in the RM, or a user defined
|
||||
-- unit. It returns False if U represents a unit that is not permitted by
|
||||
-- this restriction, which includes units in these three hierarchies that
|
||||
-- are GNAT implementation defined. It also returns False for any units in
|
||||
-- the GNAT hierarchy, which is not strictly conforming, but so obviously
|
||||
-- useful that it is a reasonable deviation from the standard.
|
||||
|
||||
end Impunit;
|
||||
|
@ -2380,7 +2380,9 @@ package body Sem_Ch10 is
|
||||
-- Check No_Implementation_Units violation
|
||||
|
||||
if Restriction_Check_Required (No_Implementation_Units) then
|
||||
if not Is_RM_Defined_Unit (Get_Source_Unit (U)) then
|
||||
if Not_Impl_Defined_Unit (Get_Source_Unit (U)) then
|
||||
null;
|
||||
else
|
||||
Check_Restriction (No_Implementation_Units, Nam);
|
||||
Restriction_Violation := True;
|
||||
end if;
|
||||
|
Loading…
Reference in New Issue
Block a user