2011-11-07 Yannick Moy <moy@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Nov 2011 16:22:28 +0000 (16:22 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Nov 2011 16:22:28 +0000 (16:22 +0000)
* sem_util.adb (Unique_Entity): For a parameter on a subprogram
body that has a corresponding parameter on the subprogram
declaration, define the unique entity as being the declaration
one.

2011-11-07  Ed Schonberg  <schonberg@adacore.com>

* sem_ch6.adb (Analyze_Return_Type): In Ada 2012 mode, if the
return type of a function is the class-wide type of an incomplete
type T, T can be a Taft-amendment type and does not have to be
completed in the current private part.

2011-11-07  Ed Schonberg  <schonberg@adacore.com>

* aspects.ads (Inherited_Aspect): Map that indicates type aspects
that are inherited by default, and apply to the class-wide type
as well.
* aspects.adb (Find_Aspect): If the entity is class-wide and the
aspect is inherited, use the aspect of the specific type.

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

gcc/ada/ChangeLog
gcc/ada/aspects.adb
gcc/ada/aspects.ads
gcc/ada/sem_ch6.adb
gcc/ada/sem_util.adb

index dce0797..f0f5bf9 100644 (file)
@@ -1,3 +1,25 @@
+2011-11-07  Yannick Moy  <moy@adacore.com>
+
+       * sem_util.adb (Unique_Entity): For a parameter on a subprogram
+       body that has a corresponding parameter on the subprogram
+       declaration, define the unique entity as being the declaration
+       one.
+
+2011-11-07  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch6.adb (Analyze_Return_Type): In Ada 2012 mode, if the
+       return type of a function is the class-wide type of an incomplete
+       type T, T can be a Taft-amendment type and does not have to be
+       completed in the current private part.
+
+2011-11-07  Ed Schonberg  <schonberg@adacore.com>
+
+       * aspects.ads (Inherited_Aspect): Map that indicates type aspects
+       that are inherited by default, and apply to the class-wide type
+       as well.
+       * aspects.adb (Find_Aspect): If the entity is class-wide and the
+       aspect is inherited, use the aspect of the specific type.
+
 2011-11-07  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * exp_alfa.adb: Remove with and use clause for
index 48a1c89..9b70773 100755 (executable)
@@ -127,7 +127,19 @@ package body Aspects is
       Ritem : Node_Id;
 
    begin
-      Ritem := First_Rep_Item (Ent);
+
+      --  If the aspect is an inherited one and the entity is a class-wide
+      --  type, use the aspect of the specific type.
+
+      if Is_Type (Ent)
+        and then Is_Class_Wide_Type (Ent)
+        and then Inherited_Aspect (A)
+      then
+         Ritem := First_Rep_Item (Etype (Ent));
+      else
+         Ritem := First_Rep_Item (Ent);
+      end if;
+
       while Present (Ritem) loop
          if Nkind (Ritem) = N_Aspect_Specification
            and then Get_Aspect_Id (Chars (Identifier (Ritem))) = A
index dfca9b1..a281d9c 100755 (executable)
@@ -176,6 +176,18 @@ package Aspects is
                              (Aspect_Test_Case => False,
                               others           => True);
 
+   --  The following array indicates type aspects that are inherited and apply
+   --  to the class-wide type as well.
+
+   Inherited_Aspect : constant array (Aspect_Id) of Boolean :=
+     (Aspect_Constant_Indexing    => True,
+      Aspect_Default_Iterator     => True,
+      Aspect_Implicit_Dereference => True,
+      Aspect_Iterator_Element     => True,
+      Aspect_Remote_Types         => True,
+      Aspect_Variable_Indexing    => True,
+      others                      => False);
+
    --  The following subtype defines aspects corresponding to library unit
    --  pragmas, these can only validly appear as aspects for library units,
    --  and result in a corresponding pragma being inserted immediately after
index 5d30faa..a9f84d3 100644 (file)
@@ -1641,10 +1641,13 @@ package body Sem_Ch6 is
 
                   --  The type must be completed in the current package. This
                   --  is checked at the end of the package declaraton, when
-                  --  Taft amemdment types are identified.
+                  --  Taft-amendment types are identified. If the return type
+                  --  is class-wide, there is no required check, the type can
+                  --  be a bona fide TAT.
 
                   if Ekind (Scope (Current_Scope)) = E_Package
                     and then In_Private_Part (Scope (Current_Scope))
+                    and then not Is_Class_Wide_Type (Typ)
                   then
                      Append_Elmt (Designator, Private_Dependents (Typ));
                   end if;
index 9dfecd3..6fbe399 100644 (file)
@@ -12835,6 +12835,11 @@ package body Sem_Util is
                U := Corresponding_Spec (P);
             end if;
 
+         when Formal_Kind =>
+            if Present (Spec_Entity (E)) then
+               U := Spec_Entity (E);
+            end if;
+
          when others =>
             null;
       end case;