[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 7 Jul 2009 13:12:32 +0000 (15:12 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 7 Jul 2009 13:12:32 +0000 (15:12 +0200)
2009-07-07  Emmanuel Briot  <briot@adacore.com>

* prj-nmsc.adb (Process_Naming): canonicalize file suffixes read in the
project file.

2009-07-07  Ed Schonberg  <schonberg@adacore.com>

* exp_ch3.adb (Expand_Freeze_Record_Type): Add extra formals to
primitive operations, in case one of them is called in the
initialization procedure for the type.

From-SVN: r149325

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb
gcc/ada/prj-nmsc.adb

index c8c03216382cfd73438ddf82a9a1090164a8caf5..42a633170156eabff3b8aaa615278ea7e7c1c01f 100644 (file)
@@ -1,3 +1,14 @@
+2009-07-07  Emmanuel Briot  <briot@adacore.com>
+
+       * prj-nmsc.adb (Process_Naming): canonicalize file suffixes read in the
+       project file.
+
+2009-07-07  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_ch3.adb (Expand_Freeze_Record_Type): Add extra formals to
+       primitive operations, in case one of them is called in the
+       initialization procedure for the type.
+
 2009-07-07  Robert Dewar  <dewar@adacore.com>
 
        * a-calend.adb: Minor code reorganization (use conditional expressions)
index 5aa5b64453989b14864794ae70a1aa0c094e8bea..bb5d1f1388074aa2fbc7cbc77e0ed8763f1a233f 100644 (file)
@@ -53,6 +53,7 @@ with Sem_Aux;  use Sem_Aux;
 with Sem_Attr; use Sem_Attr;
 with Sem_Cat;  use Sem_Cat;
 with Sem_Ch3;  use Sem_Ch3;
+with Sem_Ch6;  use Sem_Ch6;
 with Sem_Ch8;  use Sem_Ch8;
 with Sem_Disp; use Sem_Disp;
 with Sem_Eval; use Sem_Eval;
@@ -6012,6 +6013,29 @@ package body Exp_Ch3 is
          if Present (Wrapper_Body_List) then
             Append_Freeze_Actions (Def_Id, Wrapper_Body_List);
          end if;
+
+         --  Create extra actuals for the primitive operations of the type.
+         --  This must be done before analyzing the body of the initialization
+         --  procedure, because a self-referential type might call one of these
+         --  primitives in the body of the init_proc itself.
+
+         declare
+            Elmt : Elmt_Id;
+            Subp : Entity_Id;
+
+         begin
+            Elmt := First_Elmt (Primitive_Operations (Def_Id));
+            while Present (Elmt) loop
+               Subp := Node (Elmt);
+               if not Has_Foreign_Convention (Subp)
+                 and then not Is_Predefined_Dispatching_Operation (Subp)
+               then
+                  Create_Extra_Formals (Subp);
+               end if;
+
+               Next_Elmt (Elmt);
+            end loop;
+         end;
       end if;
    end Expand_Freeze_Record_Type;
 
index 4e49b50abd91a91bf23e0682336cf3b29eaf19ea..be323be1e0897fa9bb3bd098c8279894ec1f4671 100644 (file)
@@ -1677,7 +1677,9 @@ package body Prj.Nmsc is
 
                      --  Attribute Separate_Suffix
 
-                     Separate_Suffix := File_Name_Type (Attribute.Value.Value);
+                     Get_Name_String (Attribute.Value.Value);
+                     Canonical_Case_File_Name (Name_Buffer (1 .. Name_Len));
+                     Separate_Suffix := Name_Find;
 
                   elsif Attribute.Name = Name_Casing then
 
@@ -1736,18 +1738,24 @@ package body Prj.Nmsc is
 
                            --  Attribute Spec_Suffix (<language>)
 
+                           Get_Name_String (Element.Value.Value);
+                           Canonical_Case_File_Name
+                             (Name_Buffer (1 .. Name_Len));
                            Lang_Index.Config.Naming_Data.Spec_Suffix :=
-                             File_Name_Type (Element.Value.Value);
+                             Name_Find;
 
                         when Name_Implementation_Suffix | Name_Body_Suffix =>
 
+                           Get_Name_String (Element.Value.Value);
+                           Canonical_Case_File_Name
+                             (Name_Buffer (1 .. Name_Len));
+
                            --  Attribute Body_Suffix (<language>)
 
                            Lang_Index.Config.Naming_Data.Body_Suffix :=
-                             File_Name_Type (Element.Value.Value);
-
+                             Name_Find;
                            Lang_Index.Config.Naming_Data.Separate_Suffix :=
-                             File_Name_Type (Element.Value.Value);
+                             Lang_Index.Config.Naming_Data.Body_Suffix;
 
                         when others =>
                            null;
@@ -3360,9 +3368,10 @@ package body Prj.Nmsc is
              (Name_Body_Suffix,
               Naming.Decl.Arrays,
               In_Tree);
-         Lang    : Language_Ptr;
+         Lang      : Language_Ptr;
          Lang_Name : Name_Id;
-         Value   : Variable_Value;
+         Value     : Variable_Value;
+         Extended  : Project_Id;
 
       begin
          --  At this stage, the project already contains the default
@@ -3375,6 +3384,31 @@ package body Prj.Nmsc is
             Lang := Get_Language_From_Name
               (Project, Name => Get_Name_String (Lang_Name));
 
+            --  An extending project inherits its parent projects' languages
+            --  so if needed we should create entries for those languages
+
+            if Lang = null  then
+               Extended := Project.Extends;
+
+               while Extended /= null loop
+                  Lang := Get_Language_From_Name
+                    (Extended, Name => Get_Name_String (Lang_Name));
+                  exit when Lang /= null;
+
+                  Extended := Extended.Extends;
+               end loop;
+
+               if Lang /= null then
+                  Lang := new Language_Data'(Lang.all);
+                  Lang.First_Source := null;
+                  Lang.Next := Project.Languages;
+                  Project.Languages := Lang;
+               end if;
+            end if;
+
+            --  If the language was not found in project or the projects it
+            --  extends
+
             if Lang = null then
                if Current_Verbosity = High then
                   Write_Line