[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 12 May 2015 08:13:39 +0000 (10:13 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 12 May 2015 08:13:39 +0000 (10:13 +0200)
2015-05-12  Robert Dewar  <dewar@adacore.com>

* sem_type.adb, sem_ch10.adb, freeze.adb, sem_ch6.adb, exp_disp.adb:
Minor reformatting.

2015-05-12  Bob Duff  <duff@adacore.com>

* exp_attr.adb (Size): Remove unnecessary check for types with
unknown discriminants. That was causing the compiler to build
a function call _size(T), where T is a type, not an object.

2015-05-12  Ed Schonberg  <schonberg@adacore.com>

* sem_ch4.adb (Extended_Primitive_Ops): Exclude overriding
primitive operations of a type extension declared in the package
body, to prevent duplicates in extended list.

2015-05-12  Ed Schonberg  <schonberg@adacore.com>

* sem_ch3.adb (Analyze_Component_Declaration): If the component is
an unconstrained synchronized type with discriminants, create a
constrained default subtype for it, so that the enclosing record
can be given the proper size.
* sem_util.adb (Build_Default_Subtype): If the subtype is created
for a record discriminant, do not analyze the declarztion at
once because it is added to the freezing actions of the enclosing
record type.

From-SVN: r223039

gcc/ada/ChangeLog
gcc/ada/exp_attr.adb
gcc/ada/exp_disp.adb
gcc/ada/freeze.adb
gcc/ada/sem_ch10.adb
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch4.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_type.adb
gcc/ada/sem_util.adb

index 5de8f0026598634893ff8390dd88c5194cbfe403..b98c272eed3a19f1347ab479b9e9d3a262efe8d5 100644 (file)
@@ -1,3 +1,31 @@
+2015-05-12  Robert Dewar  <dewar@adacore.com>
+
+       * sem_type.adb, sem_ch10.adb, freeze.adb, sem_ch6.adb, exp_disp.adb:
+       Minor reformatting.
+
+2015-05-12  Bob Duff  <duff@adacore.com>
+
+       * exp_attr.adb (Size): Remove unnecessary check for types with
+       unknown discriminants.  That was causing the compiler to build
+       a function call _size(T), where T is a type, not an object.
+
+2015-05-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch4.adb (Extended_Primitive_Ops): Exclude overriding
+       primitive operations of a type extension declared in the package
+       body, to prevent duplicates in extended list.
+
+2015-05-12  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch3.adb (Analyze_Component_Declaration): If the component is
+       an unconstrained synchronized type with discriminants, create a
+       constrained default subtype for it, so that the enclosing record
+       can be given the proper size.
+       * sem_util.adb (Build_Default_Subtype): If the subtype is created
+       for a record discriminant, do not analyze the declarztion at
+       once because it is added to the freezing actions of the enclosing
+       record type.
+
 2015-05-12  Robert Dewar  <dewar@adacore.com>
 
        * exp_prag.adb (Expand_N_Pragma): Rewrite ignored pragma as
index ef11b1911f1ee6adebb0832e03d1ee5f14384782..c985a426817659dc57b1ed832c0fad1653f71f37 100644 (file)
@@ -5538,14 +5538,11 @@ package body Exp_Attr is
          --  For X'Size applied to an object of a class-wide type, transform
          --  X'Size into a call to the primitive operation _Size applied to X.
 
-         elsif Is_Class_Wide_Type (Ptyp)
-           or else (Id = Attribute_Size
-                      and then Is_Tagged_Type (Ptyp)
-                      and then Has_Unknown_Discriminants (Ptyp))
-         then
+         elsif Is_Class_Wide_Type (Ptyp) then
+
             --  No need to do anything else compiling under restriction
             --  No_Dispatching_Calls. During the semantic analysis we
-            --  already notified such violation.
+            --  already noted this restriction violation.
 
             if Restriction_Active (No_Dispatching_Calls) then
                return;
index 68f504d0ae406e687fa8ad3f5419c4d712667bec..a70cf6a814d2fe6c38e98df15731c9774d4fc75e 100644 (file)
@@ -1612,8 +1612,8 @@ package body Exp_Disp is
                         Set_Scope (Anon, Current_Scope);
                      end if;
 
-                     Set_Directly_Designated_Type (Anon,
-                       Non_Limited_View (Actual_DDT));
+                     Set_Directly_Designated_Type
+                       (Anon, Non_Limited_View (Actual_DDT));
                      Set_Etype (Actual_Dup, Anon);
                   end if;
                end if;
index d43a9fcfc8139d8fa8b2c3ffa17add29555a17dc..8c1681526cff0109e6ae9bbc203a213b0fdc607b 100644 (file)
@@ -425,8 +425,8 @@ package body Freeze is
             Ret_Type : constant Entity_Id := Etype (Result_Definition (Spec));
          begin
             if Has_Non_Limited_View (Ret_Type) then
-               Set_Result_Definition (Spec,
-                  New_Occurrence_Of (Non_Limited_View (Ret_Type), Loc));
+               Set_Result_Definition
+                 (Spec, New_Occurrence_Of (Non_Limited_View (Ret_Type), Loc));
             end if;
          end;
       end if;
@@ -456,10 +456,11 @@ package body Freeze is
             elsif Is_Access_Type (Form_Type)
               and then not Is_Access_Type (Pref)
             then
-               Actuals := New_List
-                 (Make_Attribute_Reference (Loc,
-                   Attribute_Name => Name_Access,
-                   Prefix => Relocate_Node (Pref)));
+               Actuals :=
+                 New_List (
+                   Make_Attribute_Reference (Loc,
+                     Attribute_Name => Name_Access,
+                     Prefix         => Relocate_Node (Pref)));
             else
                Actuals := New_List (Pref);
             end if;
@@ -530,7 +531,7 @@ package body Freeze is
            Make_Simple_Return_Statement (Loc,
               Expression =>
                 Make_Function_Call (Loc,
-                  Name => Call_Name,
+                  Name                   => Call_Name,
                   Parameter_Associations => Actuals));
 
       elsif Ekind (Old_S) = E_Enumeration_Literal then
@@ -540,13 +541,12 @@ package body Freeze is
 
       elsif Nkind (Nam) = N_Character_Literal then
          Call_Node :=
-           Make_Simple_Return_Statement (Loc,
-             Expression => Call_Name);
+           Make_Simple_Return_Statement (Loc, Expression => Call_Name);
 
       else
          Call_Node :=
            Make_Procedure_Call_Statement (Loc,
-             Name => Call_Name,
+             Name                   => Call_Name,
              Parameter_Associations => Actuals);
       end if;
 
index 4973dc15c8092ea332012aa7ac6ed9be7ca3b971..bf1704ed6ef5471810222176d61520f8d8c54ca1 100644 (file)
@@ -5605,8 +5605,8 @@ package body Sem_Ch10 is
             Set_Non_Limited_View (Shadow, Ent);
 
             if Is_Tagged then
-               Set_Non_Limited_View (Class_Wide_Type (Shadow),
-                 Class_Wide_Type (Ent));
+               Set_Non_Limited_View
+                 (Class_Wide_Type (Shadow), Class_Wide_Type (Ent));
             end if;
 
             if Is_Incomplete_Or_Private_Type (Ent) then
index 64761f8a61b45cd1205c6fa9869a72910ca9d9f3..addfc0a56c38d51b3ddd9d74a16ab85b4b062001 100644 (file)
@@ -1794,9 +1794,10 @@ package body Sem_Ch3 is
    -----------------------------------
 
    procedure Analyze_Component_Declaration (N : Node_Id) is
-      Id  : constant Entity_Id := Defining_Identifier (N);
-      E   : constant Node_Id   := Expression (N);
-      Typ : constant Node_Id   :=
+      Loc : constant Source_Ptr := Sloc (N);
+      Id  : constant Entity_Id  := Defining_Identifier (N);
+      E   : constant Node_Id    := Expression (N);
+      Typ : constant Node_Id    :=
               Subtype_Indication (Component_Definition (N));
       T   : Entity_Id;
       P   : Entity_Id;
@@ -2123,6 +2124,27 @@ package body Sem_Ch3 is
          end if;
       end if;
 
+      --  If the component is an unconstrained task or protected type with
+      --  discriminants, the component and the enclosing record are limited
+      --  and the component is constrained by its default values. Compute
+      --  its actual subtype, else it may be allocated the maximum size by
+      --  the backend, and possibly overflow.
+
+      if Is_Concurrent_Type (T)
+        and then not Is_Constrained (T)
+        and then Has_Discriminants (T)
+        and then not Has_Discriminants (Current_Scope)
+      then
+         declare
+            Act_T : constant Entity_Id := Build_Default_Subtype (T, N);
+         begin
+            Set_Etype (Id, Act_T);
+            Set_Component_Definition (N,
+              Make_Component_Definition (Loc,
+                Subtype_Indication => New_Occurrence_Of (Act_T, Loc)));
+         end;
+      end if;
+
       Set_Original_Record_Component (Id, Id);
 
       if Has_Aspects (N) then
index 0af8a4624af197a1d977a92e86107fe5c0ce23c7..c6769c5d54bbfc3751fd8b171dff45f177969b2c 100644 (file)
@@ -8196,6 +8196,12 @@ package body Sem_Ch4 is
                while Present (Op) loop
                   if Comes_From_Source (Op)
                     and then Is_Overloadable (Op)
+
+                    --  Exclude overriding primitive operations of a type
+                    --  extension declared in the package body, to prevent
+                    --  duplicates in extended list.
+
+                    and then not Is_Primitive (Op)
                     and then Is_List_Member (Unit_Declaration_Node (Op))
                     and then List_Containing (Unit_Declaration_Node (Op)) =
                                                                    Body_Decls
index eb09ee3b59713a0eba333c032e372fb19ff658f9..dcbee8cbd868af064475ea57fc9adc20745720d8 100644 (file)
@@ -2921,11 +2921,8 @@ package body Sem_Ch6 is
 
          procedure Detect_And_Exchange (Id : Entity_Id) is
             Typ : constant Entity_Id := Etype (Id);
-
          begin
-            if From_Limited_With (Typ)
-              and then Has_Non_Limited_View (Typ)
-            then
+            if From_Limited_With (Typ) and then Has_Non_Limited_View (Typ) then
                Set_Etype (Id, Non_Limited_View (Typ));
             end if;
          end Detect_And_Exchange;
index b4d752d32588a216ddb3e4944902cf8c44307703..785121adf247925ba684cbd7269b9c8d303d4a47 100644 (file)
@@ -1228,7 +1228,7 @@ package body Sem_Type is
          --  incomplete, get full view if available.
 
          return Has_Non_Limited_View (T1)
-            and then Covers (Get_Full_View (Non_Limited_View (T1)), T2);
+           and then Covers (Get_Full_View (Non_Limited_View (T1)), T2);
 
       elsif From_Limited_With (T2) then
 
@@ -1237,7 +1237,7 @@ package body Sem_Type is
          --  verify that the context type is the nonlimited view.
 
          return Has_Non_Limited_View (T2)
-            and then Covers (T1, Get_Full_View (Non_Limited_View (T2)));
+           and then Covers (T1, Get_Full_View (Non_Limited_View (T2)));
 
       --  Ada 2005 (AI-412): Coverage for regular incomplete subtypes
 
index f6b76e11a7f0f0b0e3bcd43f72000d41dd8984fe..0c176f03067bb607debf286db89cc282c5ddca89 100644 (file)
@@ -1546,7 +1546,15 @@ package body Sem_Util is
                      Constraints => Constraints)));
 
          Insert_Action (N, Decl);
-         Analyze (Decl);
+
+         --  If the context is a component declaration the subtype
+         --  declaration will be analyzed when the enclosing type is
+         --  frozen, otherwise do it now.
+
+         if Ekind (Current_Scope) /= E_Record_Type then
+            Analyze (Decl);
+         end if;
+
          return Act;
       end;
    end Build_Default_Subtype;