OSDN Git Service

2009-04-08 Vincent Celier <celier@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Apr 2009 14:41:45 +0000 (14:41 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Apr 2009 14:41:45 +0000 (14:41 +0000)
* snames.adb, snames.ads: Add new standard names IDE and
Compiler_Command.

2009-04-08  Ed Schonberg  <schonberg@adacore.com>

* exp_util.adb (Safe_Unchecked_Type_Conversion): Conversion is safe,
i.e. does not need a temporary to capture the value, if expression is
an acceess type, even if target type is a record whose size may not
have been determined yet.

* exp_disp.adb (Expand_Dispatching_Call): Set size info for generated
access_to_subprogram type, to avoid order-of-elaboration anomalies in
gigi.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145743 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/exp_disp.adb
gcc/ada/exp_util.adb
gcc/ada/snames.adb
gcc/ada/snames.ads

index 96dd8da..b4f4429 100644 (file)
@@ -36,6 +36,7 @@ with Exp_Tss;  use Exp_Tss;
 with Exp_Util; use Exp_Util;
 with Freeze;   use Freeze;
 with Itypes;   use Itypes;
+with Layout;   use Layout;
 with Nlists;   use Nlists;
 with Nmake;    use Nmake;
 with Namet;    use Namet;
@@ -557,7 +558,7 @@ package body Exp_Disp is
          Res_Typ := Etype (Subp);
       end if;
 
-      Subp_Typ := Create_Itype (E_Subprogram_Type, Call_Node);
+      Subp_Typ     := Create_Itype (E_Subprogram_Type, Call_Node);
       Subp_Ptr_Typ := Create_Itype (E_Access_Subprogram_Type, Call_Node);
       Set_Etype          (Subp_Typ, Res_Typ);
       Set_Returns_By_Ref (Subp_Typ, Returns_By_Ref (Subp));
@@ -615,9 +616,14 @@ package body Exp_Disp is
          Create_Extra_Formals (Subp_Typ);
       end;
 
+      --  Complete description of pointer type, including size information, as
+      --  must be done with itypes to prevent order-of-elaboration anomalies
+      --  in gigi.
+
       Set_Etype (Subp_Ptr_Typ, Subp_Ptr_Typ);
       Set_Directly_Designated_Type (Subp_Ptr_Typ, Subp_Typ);
       Set_Convention (Subp_Ptr_Typ, Convention (Subp_Typ));
+      Layout_Type    (Subp_Ptr_Typ);
 
       --  If the controlling argument is a value of type Ada.Tag or an abstract
       --  interface class-wide type then use it directly. Otherwise, the tag
index b36f80d..6b91569 100644 (file)
@@ -4842,6 +4842,14 @@ package body Exp_Util is
       then
          return True;
 
+      --  If the expression has an access type (object or subprogram) we
+      --  assume that the conversion is safe, because the size of the target
+      --  is safe, even it is a record (which might be treated as having
+      --  unknown size at this point).
+
+      elsif Is_Access_Type (Ityp) then
+         return True;
+
       --  If the size of output type is known at compile time, there is
       --  never a problem.  Note that unconstrained records are considered
       --  to be of known size, but we can't consider them that way here,
index 0617391..820d30c 100644 (file)
@@ -705,6 +705,7 @@ package body Snames is
      "builder#" &
      "builder_switches#" &
      "compiler#" &
+     "compiler_command#" &
      "compiler_kind#" &
      "config_body_file_name#" &
      "config_body_file_name_pattern#" &
@@ -734,6 +735,7 @@ package body Snames is
      "global_config_file#" &
      "gnatls#" &
      "gnatstub#" &
+     "ide#" &
      "implementation#" &
      "implementation_exceptions#" &
      "implementation_suffix#" &
index b5fbeb1..a9d90c7 100644 (file)
@@ -1029,131 +1029,133 @@ package Snames is
    Name_Builder                        : constant Name_Id := N + 644;
    Name_Builder_Switches               : constant Name_Id := N + 645;
    Name_Compiler                       : constant Name_Id := N + 646;
-   Name_Compiler_Kind                  : constant Name_Id := N + 647;
-   Name_Config_Body_File_Name          : constant Name_Id := N + 648;
-   Name_Config_Body_File_Name_Pattern  : constant Name_Id := N + 649;
-   Name_Config_File_Switches           : constant Name_Id := N + 650;
-   Name_Config_File_Unique             : constant Name_Id := N + 651;
-   Name_Config_Spec_File_Name          : constant Name_Id := N + 652;
-   Name_Config_Spec_File_Name_Pattern  : constant Name_Id := N + 653;
-   Name_Configuration                  : constant Name_Id := N + 654;
-   Name_Cross_Reference                : constant Name_Id := N + 655;
-   Name_Default_Language               : constant Name_Id := N + 656;
-   Name_Default_Switches               : constant Name_Id := N + 657;
-   Name_Dependency_Driver              : constant Name_Id := N + 658;
-   Name_Dependency_File_Kind           : constant Name_Id := N + 659;
-   Name_Dependency_Switches            : constant Name_Id := N + 660;
-   Name_Driver                         : constant Name_Id := N + 661;
-   Name_Excluded_Source_Dirs           : constant Name_Id := N + 662;
-   Name_Excluded_Source_Files          : constant Name_Id := N + 663;
-   Name_Excluded_Source_List_File      : constant Name_Id := N + 664;
-   Name_Exec_Dir                       : constant Name_Id := N + 665;
-   Name_Executable                     : constant Name_Id := N + 666;
-   Name_Executable_Suffix              : constant Name_Id := N + 667;
-   Name_Extends                        : constant Name_Id := N + 668;
-   Name_Externally_Built               : constant Name_Id := N + 669;
-   Name_Finder                         : constant Name_Id := N + 670;
-   Name_Global_Compilation_Switches    : constant Name_Id := N + 671;
-   Name_Global_Configuration_Pragmas   : constant Name_Id := N + 672;
-   Name_Global_Config_File             : constant Name_Id := N + 673;
-   Name_Gnatls                         : constant Name_Id := N + 674;
-   Name_Gnatstub                       : constant Name_Id := N + 675;
-   Name_Implementation                 : constant Name_Id := N + 676;
-   Name_Implementation_Exceptions      : constant Name_Id := N + 677;
-   Name_Implementation_Suffix          : constant Name_Id := N + 678;
-   Name_Include_Switches               : constant Name_Id := N + 679;
-   Name_Include_Path                   : constant Name_Id := N + 680;
-   Name_Include_Path_File              : constant Name_Id := N + 681;
-   Name_Inherit_Source_Path            : constant Name_Id := N + 682;
-   Name_Language_Kind                  : constant Name_Id := N + 683;
-   Name_Language_Processing            : constant Name_Id := N + 684;
-   Name_Languages                      : constant Name_Id := N + 685;
-   Name_Library                        : constant Name_Id := N + 686;
-   Name_Library_Ali_Dir                : constant Name_Id := N + 687;
-   Name_Library_Auto_Init              : constant Name_Id := N + 688;
-   Name_Library_Auto_Init_Supported    : constant Name_Id := N + 689;
-   Name_Library_Builder                : constant Name_Id := N + 690;
-   Name_Library_Dir                    : constant Name_Id := N + 691;
-   Name_Library_GCC                    : constant Name_Id := N + 692;
-   Name_Library_Interface              : constant Name_Id := N + 693;
-   Name_Library_Kind                   : constant Name_Id := N + 694;
-   Name_Library_Name                   : constant Name_Id := N + 695;
-   Name_Library_Major_Minor_Id_Supported : constant Name_Id := N + 696;
-   Name_Library_Options                : constant Name_Id := N + 697;
-   Name_Library_Partial_Linker         : constant Name_Id := N + 698;
-   Name_Library_Reference_Symbol_File  : constant Name_Id := N + 699;
-   Name_Library_Src_Dir                : constant Name_Id := N + 700;
-   Name_Library_Support                : constant Name_Id := N + 701;
-   Name_Library_Symbol_File            : constant Name_Id := N + 702;
-   Name_Library_Symbol_Policy          : constant Name_Id := N + 703;
-   Name_Library_Version                : constant Name_Id := N + 704;
-   Name_Library_Version_Switches       : constant Name_Id := N + 705;
-   Name_Linker                         : constant Name_Id := N + 706;
-   Name_Linker_Executable_Option       : constant Name_Id := N + 707;
-   Name_Linker_Lib_Dir_Option          : constant Name_Id := N + 708;
-   Name_Linker_Lib_Name_Option         : constant Name_Id := N + 709;
-   Name_Local_Config_File              : constant Name_Id := N + 710;
-   Name_Local_Configuration_Pragmas    : constant Name_Id := N + 711;
-   Name_Locally_Removed_Files          : constant Name_Id := N + 712;
-   Name_Map_File_Option                : constant Name_Id := N + 713;
-   Name_Mapping_File_Switches          : constant Name_Id := N + 714;
-   Name_Mapping_Spec_Suffix            : constant Name_Id := N + 715;
-   Name_Mapping_Body_Suffix            : constant Name_Id := N + 716;
-   Name_Metrics                        : constant Name_Id := N + 717;
-   Name_Naming                         : constant Name_Id := N + 718;
-   Name_Object_Generated               : constant Name_Id := N + 719;
-   Name_Objects_Linked                 : constant Name_Id := N + 720;
-   Name_Objects_Path                   : constant Name_Id := N + 721;
-   Name_Objects_Path_File              : constant Name_Id := N + 722;
-   Name_Object_Dir                     : constant Name_Id := N + 723;
-   Name_Path_Syntax                    : constant Name_Id := N + 724;
-   Name_Pic_Option                     : constant Name_Id := N + 725;
-   Name_Pretty_Printer                 : constant Name_Id := N + 726;
-   Name_Prefix                         : constant Name_Id := N + 727;
-   Name_Project                        : constant Name_Id := N + 728;
-   Name_Roots                          : constant Name_Id := N + 729;
-   Name_Required_Switches              : constant Name_Id := N + 730;
-   Name_Run_Path_Option                : constant Name_Id := N + 731;
-   Name_Runtime_Project                : constant Name_Id := N + 732;
-   Name_Shared_Library_Minimum_Switches : constant Name_Id := N + 733;
-   Name_Shared_Library_Prefix          : constant Name_Id := N + 734;
-   Name_Shared_Library_Suffix          : constant Name_Id := N + 735;
-   Name_Separate_Suffix                : constant Name_Id := N + 736;
-   Name_Source_Dirs                    : constant Name_Id := N + 737;
-   Name_Source_Files                   : constant Name_Id := N + 738;
-   Name_Source_List_File               : constant Name_Id := N + 739;
-   Name_Spec                           : constant Name_Id := N + 740;
-   Name_Spec_Suffix                    : constant Name_Id := N + 741;
-   Name_Specification                  : constant Name_Id := N + 742;
-   Name_Specification_Exceptions       : constant Name_Id := N + 743;
-   Name_Specification_Suffix           : constant Name_Id := N + 744;
-   Name_Stack                          : constant Name_Id := N + 745;
-   Name_Switches                       : constant Name_Id := N + 746;
-   Name_Symbolic_Link_Supported        : constant Name_Id := N + 747;
-   Name_Sync                           : constant Name_Id := N + 748;
-   Name_Synchronize                    : constant Name_Id := N + 749;
-   Name_Toolchain_Description          : constant Name_Id := N + 750;
-   Name_Toolchain_Version              : constant Name_Id := N + 751;
-   Name_Runtime_Library_Dir            : constant Name_Id := N + 752;
+   Name_Compiler_Command               : constant Name_Id := N + 647;
+   Name_Compiler_Kind                  : constant Name_Id := N + 648;
+   Name_Config_Body_File_Name          : constant Name_Id := N + 649;
+   Name_Config_Body_File_Name_Pattern  : constant Name_Id := N + 650;
+   Name_Config_File_Switches           : constant Name_Id := N + 651;
+   Name_Config_File_Unique             : constant Name_Id := N + 652;
+   Name_Config_Spec_File_Name          : constant Name_Id := N + 653;
+   Name_Config_Spec_File_Name_Pattern  : constant Name_Id := N + 654;
+   Name_Configuration                  : constant Name_Id := N + 655;
+   Name_Cross_Reference                : constant Name_Id := N + 656;
+   Name_Default_Language               : constant Name_Id := N + 657;
+   Name_Default_Switches               : constant Name_Id := N + 658;
+   Name_Dependency_Driver              : constant Name_Id := N + 659;
+   Name_Dependency_File_Kind           : constant Name_Id := N + 660;
+   Name_Dependency_Switches            : constant Name_Id := N + 661;
+   Name_Driver                         : constant Name_Id := N + 662;
+   Name_Excluded_Source_Dirs           : constant Name_Id := N + 663;
+   Name_Excluded_Source_Files          : constant Name_Id := N + 664;
+   Name_Excluded_Source_List_File      : constant Name_Id := N + 665;
+   Name_Exec_Dir                       : constant Name_Id := N + 666;
+   Name_Executable                     : constant Name_Id := N + 667;
+   Name_Executable_Suffix              : constant Name_Id := N + 668;
+   Name_Extends                        : constant Name_Id := N + 669;
+   Name_Externally_Built               : constant Name_Id := N + 670;
+   Name_Finder                         : constant Name_Id := N + 671;
+   Name_Global_Compilation_Switches    : constant Name_Id := N + 672;
+   Name_Global_Configuration_Pragmas   : constant Name_Id := N + 673;
+   Name_Global_Config_File             : constant Name_Id := N + 674;
+   Name_Gnatls                         : constant Name_Id := N + 675;
+   Name_Gnatstub                       : constant Name_Id := N + 676;
+   Name_Ide                            : constant Name_Id := N + 677;
+   Name_Implementation                 : constant Name_Id := N + 678;
+   Name_Implementation_Exceptions      : constant Name_Id := N + 679;
+   Name_Implementation_Suffix          : constant Name_Id := N + 680;
+   Name_Include_Switches               : constant Name_Id := N + 681;
+   Name_Include_Path                   : constant Name_Id := N + 682;
+   Name_Include_Path_File              : constant Name_Id := N + 683;
+   Name_Inherit_Source_Path            : constant Name_Id := N + 684;
+   Name_Language_Kind                  : constant Name_Id := N + 685;
+   Name_Language_Processing            : constant Name_Id := N + 686;
+   Name_Languages                      : constant Name_Id := N + 687;
+   Name_Library                        : constant Name_Id := N + 688;
+   Name_Library_Ali_Dir                : constant Name_Id := N + 689;
+   Name_Library_Auto_Init              : constant Name_Id := N + 690;
+   Name_Library_Auto_Init_Supported    : constant Name_Id := N + 691;
+   Name_Library_Builder                : constant Name_Id := N + 692;
+   Name_Library_Dir                    : constant Name_Id := N + 693;
+   Name_Library_GCC                    : constant Name_Id := N + 694;
+   Name_Library_Interface              : constant Name_Id := N + 695;
+   Name_Library_Kind                   : constant Name_Id := N + 696;
+   Name_Library_Name                   : constant Name_Id := N + 697;
+   Name_Library_Major_Minor_Id_Supported : constant Name_Id := N + 698;
+   Name_Library_Options                : constant Name_Id := N + 699;
+   Name_Library_Partial_Linker         : constant Name_Id := N + 700;
+   Name_Library_Reference_Symbol_File  : constant Name_Id := N + 701;
+   Name_Library_Src_Dir                : constant Name_Id := N + 702;
+   Name_Library_Support                : constant Name_Id := N + 703;
+   Name_Library_Symbol_File            : constant Name_Id := N + 704;
+   Name_Library_Symbol_Policy          : constant Name_Id := N + 705;
+   Name_Library_Version                : constant Name_Id := N + 706;
+   Name_Library_Version_Switches       : constant Name_Id := N + 707;
+   Name_Linker                         : constant Name_Id := N + 708;
+   Name_Linker_Executable_Option       : constant Name_Id := N + 709;
+   Name_Linker_Lib_Dir_Option          : constant Name_Id := N + 710;
+   Name_Linker_Lib_Name_Option         : constant Name_Id := N + 711;
+   Name_Local_Config_File              : constant Name_Id := N + 712;
+   Name_Local_Configuration_Pragmas    : constant Name_Id := N + 713;
+   Name_Locally_Removed_Files          : constant Name_Id := N + 714;
+   Name_Map_File_Option                : constant Name_Id := N + 715;
+   Name_Mapping_File_Switches          : constant Name_Id := N + 716;
+   Name_Mapping_Spec_Suffix            : constant Name_Id := N + 717;
+   Name_Mapping_Body_Suffix            : constant Name_Id := N + 718;
+   Name_Metrics                        : constant Name_Id := N + 719;
+   Name_Naming                         : constant Name_Id := N + 720;
+   Name_Object_Generated               : constant Name_Id := N + 721;
+   Name_Objects_Linked                 : constant Name_Id := N + 722;
+   Name_Objects_Path                   : constant Name_Id := N + 723;
+   Name_Objects_Path_File              : constant Name_Id := N + 724;
+   Name_Object_Dir                     : constant Name_Id := N + 725;
+   Name_Path_Syntax                    : constant Name_Id := N + 726;
+   Name_Pic_Option                     : constant Name_Id := N + 727;
+   Name_Pretty_Printer                 : constant Name_Id := N + 728;
+   Name_Prefix                         : constant Name_Id := N + 729;
+   Name_Project                        : constant Name_Id := N + 730;
+   Name_Roots                          : constant Name_Id := N + 731;
+   Name_Required_Switches              : constant Name_Id := N + 732;
+   Name_Run_Path_Option                : constant Name_Id := N + 733;
+   Name_Runtime_Project                : constant Name_Id := N + 734;
+   Name_Shared_Library_Minimum_Switches : constant Name_Id := N + 735;
+   Name_Shared_Library_Prefix          : constant Name_Id := N + 736;
+   Name_Shared_Library_Suffix          : constant Name_Id := N + 737;
+   Name_Separate_Suffix                : constant Name_Id := N + 738;
+   Name_Source_Dirs                    : constant Name_Id := N + 739;
+   Name_Source_Files                   : constant Name_Id := N + 740;
+   Name_Source_List_File               : constant Name_Id := N + 741;
+   Name_Spec                           : constant Name_Id := N + 742;
+   Name_Spec_Suffix                    : constant Name_Id := N + 743;
+   Name_Specification                  : constant Name_Id := N + 744;
+   Name_Specification_Exceptions       : constant Name_Id := N + 745;
+   Name_Specification_Suffix           : constant Name_Id := N + 746;
+   Name_Stack                          : constant Name_Id := N + 747;
+   Name_Switches                       : constant Name_Id := N + 748;
+   Name_Symbolic_Link_Supported        : constant Name_Id := N + 749;
+   Name_Sync                           : constant Name_Id := N + 750;
+   Name_Synchronize                    : constant Name_Id := N + 751;
+   Name_Toolchain_Description          : constant Name_Id := N + 752;
+   Name_Toolchain_Version              : constant Name_Id := N + 753;
+   Name_Runtime_Library_Dir            : constant Name_Id := N + 754;
 
    --  Other miscellaneous names used in front end
 
-   Name_Unaligned_Valid                : constant Name_Id := N + 753;
+   Name_Unaligned_Valid                : constant Name_Id := N + 755;
 
    --  Ada 2005 reserved words
 
-   First_2005_Reserved_Word            : constant Name_Id := N + 754;
-   Name_Interface                      : constant Name_Id := N + 754;
-   Name_Overriding                     : constant Name_Id := N + 755;
-   Name_Synchronized                   : constant Name_Id := N + 756;
-   Last_2005_Reserved_Word             : constant Name_Id := N + 756;
+   First_2005_Reserved_Word            : constant Name_Id := N + 756;
+   Name_Interface                      : constant Name_Id := N + 756;
+   Name_Overriding                     : constant Name_Id := N + 757;
+   Name_Synchronized                   : constant Name_Id := N + 758;
+   Last_2005_Reserved_Word             : constant Name_Id := N + 758;
 
    subtype Ada_2005_Reserved_Words is
      Name_Id range First_2005_Reserved_Word .. Last_2005_Reserved_Word;
 
    --  Mark last defined name for consistency check in Snames body
 
-   Last_Predefined_Name                : constant Name_Id := N + 756;
+   Last_Predefined_Name                : constant Name_Id := N + 758;
 
    ---------------------------------------
    -- Subtypes Defining Name Categories --