[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Thu, 16 Jun 2016 10:39:14 +0000 (12:39 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Thu, 16 Jun 2016 10:39:14 +0000 (12:39 +0200)
2016-06-16  Gary Dismukes  <dismukes@adacore.com>

* sem_util.adb: Minor typo fix.

2016-06-16  Emmanuel Briot  <briot@adacore.com>

* s-regpat.adb: Further fix for invalid index in GNAT.Regexp.

2016-06-16  Eric Botcazou  <ebotcazou@adacore.com>

* sem_ch13.adb (Validate_Address_Clauses): Use the same logic to
issue the warning on the offset for the size as for the alignment
and tweak the wording for the sake of consistency.

2016-06-16  Ed Schonberg  <schonberg@adacore.com>

* sem_prag.adb (Check_Class_Wide_COndition): New procedure,
subsidiary of Analyze_Pre_Post_ Condition_In_Decl_Part, to
check legality rules that follow from the revised semantics of
class-wide pre/postconditions described in AI12-0113.
(Build_Pragma_Check_Equivalent): Abstract subprogram declarations
must be included in list of overriding primitives of a derived
type.

From-SVN: r237521

gcc/ada/ChangeLog
gcc/ada/s-regpat.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_util.adb

index 6cf68c482eb29023c8b6aba93bc0d471922dd207..b661d38e5d45c24a9d9cabd6c137c5302285095d 100644 (file)
@@ -1,3 +1,27 @@
+2016-06-16  Gary Dismukes  <dismukes@adacore.com>
+
+       * sem_util.adb: Minor typo fix.
+
+2016-06-16  Emmanuel Briot  <briot@adacore.com>
+
+       * s-regpat.adb: Further fix for invalid index in GNAT.Regexp.
+
+2016-06-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * sem_ch13.adb (Validate_Address_Clauses): Use the same logic to
+       issue the warning on the offset for the size as for the alignment
+       and tweak the wording for the sake of consistency.
+
+2016-06-16  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_prag.adb (Check_Class_Wide_COndition): New procedure,
+       subsidiary of Analyze_Pre_Post_ Condition_In_Decl_Part, to
+       check legality rules that follow from the revised semantics of
+       class-wide pre/postconditions described in AI12-0113.
+       (Build_Pragma_Check_Equivalent): Abstract subprogram declarations
+       must be included in list of overriding primitives of a derived
+       type.
+
 2016-06-16  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_util.adb (May_Be_Lvalue): An actual in an unexpanded
index f672b9e92a11c3387b9d2b7a6b50229aaea6dbc0..7675f70b1aaa63351705e60988f7a0680a54a7ba 100644 (file)
@@ -2614,16 +2614,28 @@ package body System.Regpat is
                   exit State_Machine when Input_Pos /= BOL_Pos;
 
                when EOL =>
-                  exit State_Machine when Input_Pos <= Last_In_Data
-                    and then ((Self.Flags and Multiple_Lines) = 0
-                               or else Data (Input_Pos) /= ASCII.LF);
+                  --  A combination of MEOL and SEOL
+                  if (Self.Flags and Multiple_Lines) = 0 then
+                     --  single line mode
+                     exit State_Machine when Input_Pos <= Data'Last;
+                  elsif Input_Pos <= Last_In_Data then
+                     exit State_Machine when Data (Input_Pos) /= ASCII.LF;
+                  else
+                     exit State_Machine when Last_In_Data /= Data'Last;
+                  end if;
 
                when MEOL =>
-                  exit State_Machine when Input_Pos <= Last_In_Data
-                    and then Data (Input_Pos) /= ASCII.LF;
+                  if Input_Pos <= Last_In_Data then
+                     exit State_Machine when Data (Input_Pos) /= ASCII.LF;
+                  else
+                     exit State_Machine when Last_In_Data /= Data'Last;
+                  end if;
 
                when SEOL =>
-                  exit State_Machine when Input_Pos <= Last_In_Data;
+                  --  If we have a character before Data'Last (even if
+                  --  Last_In_Data stops before then), we can't have
+                  --  the end of the line.
+                  exit State_Machine when Input_Pos <= Data'Last;
 
                when BOUND | NBOUND =>
 
index 1d732b9b590e1ca5ec1870f503d3ff4d7501cc88..28ccf5666b5a6dd909f425eb15addd33a05579ae 100644 (file)
@@ -13730,9 +13730,9 @@ package body Sem_Ch13 is
                   Error_Msg_Uint_1 := Y_Size;
                   Error_Msg_NE ("\??size of & is ^", ACCR.N, ACCR.Y);
 
-                  if X_Offs /= Uint_0 then
+                  if Y_Size >= X_Size then
                      Error_Msg_Uint_1 := X_Offs;
-                     Error_Msg_NE ("\??and offset of & is ^", ACCR.N, ACCR.X);
+                     Error_Msg_NE ("\??but offset of & is ^", ACCR.N, ACCR.X);
                   end if;
 
                --  Check for inadequate alignment, both of the base object
index fd8352398588ed902055600ea5a515a3d5e7e8a2..51f2e83822a30c6ddfdbd0418c2b24ba982a2952 100644 (file)
@@ -23279,6 +23279,74 @@ package body Sem_Prag is
       Disp_Typ      : Entity_Id;
       Restore_Scope : Boolean := False;
 
+      function Check_References (N : Node_Id) return Traverse_Result;
+      --  Check that the expression does not mention non-primitives of
+      --  the type, global objects of the type, or other illegalities
+      --  described and implied by AI12-0113.
+
+      ----------------------
+      -- Check_References --
+      ----------------------
+
+      function Check_References (N : Node_Id) return Traverse_Result is
+      begin
+         if Nkind (N) = N_Function_Call
+           and then Is_Entity_Name (Name (N))
+         then
+            declare
+               Func : constant Entity_Id := Entity (Name (N));
+               Form : Entity_Id;
+            begin
+
+               --  An operation of the type must be a primitive.
+
+               if No (Find_Dispatching_Type (Func)) then
+                  Form := First_Formal (Func);
+                  while Present (Form) loop
+                     if Etype (Form) = Disp_Typ then
+                        Error_Msg_NE ("operation in class-wide condition "
+                          & "must be primitive of&", N, Disp_Typ);
+                     end if;
+                     Next_Formal (Form);
+                  end loop;
+
+                  --  A return object of the type is illegal as well.
+
+                  if Etype (Func) = Disp_Typ
+                    or else Etype (Func) = Class_Wide_Type (Disp_Typ)
+                  then
+                     Error_Msg_NE ("operation in class-wide condition "
+                       & "must be primitive of&", N, Disp_Typ);
+                  end if;
+               end if;
+            end;
+
+         elsif Is_Entity_Name (N)
+           and then
+             (Etype (N) = Disp_Typ
+               or else Etype (N) = Class_Wide_Type (Disp_Typ))
+           and then Ekind_In (Entity (N),  E_Variable, E_Constant)
+         then
+            Error_Msg_NE
+              ("object in class-wide condition must be formal of type&",
+                N, Disp_Typ);
+
+         elsif Nkind (N) = N_Explicit_Dereference
+           and then (Etype (N) = Disp_Typ
+               or else Etype (N) = Class_Wide_Type (Disp_Typ))
+           and then (not Is_Entity_Name (Prefix (N))
+             or else not Is_Formal (Entity (Prefix (N))))
+         then
+            Error_Msg_NE ("operation in class-wide condition "
+              & "must be primitive of&", N, Disp_Typ);
+         end if;
+
+         return OK;
+      end Check_References;
+
+      procedure Check_Class_Wide_Condition is new
+        Traverse_Proc (Check_References);
+
    --  Start of processing for Analyze_Pre_Post_Condition_In_Decl_Part
 
    begin
@@ -23345,7 +23413,13 @@ package body Sem_Prag is
                  ("pragma % can only be specified for a primitive operation "
                   & "of a tagged type", N);
             end if;
+
+         else
+            --  Remaining semantic checks require a full tree traversal.
+
+            Check_Class_Wide_Condition (Expr);
          end if;
+
       end if;
 
       if Restore_Scope then
@@ -26379,7 +26453,9 @@ package body Sem_Prag is
             --  overridings between them.
 
             while Present (Decl) loop
-               if Nkind (Decl) = N_Subprogram_Declaration then
+               if Nkind_In (Decl,
+                  N_Subprogram_Declaration, N_Abstract_Subprogram_Declaration)
+               then
                   Prim := Defining_Entity (Decl);
 
                   if Is_Subprogram (Prim)
index 9e2aba4dab2a92b0c8e01a83be67870976a5fd10..936b814f96b86ef9e760ac48f3450880aefea43b 100644 (file)
@@ -1231,7 +1231,7 @@ package body Sem_Util is
          pragma Assert (Has_Default_Init_Cond (Typ));
          pragma Assert (Present (Prag));
 
-         --  Nothing to do if the slec was not built. This occurs when the
+         --  Nothing to do if the spec was not built. This occurs when the
          --  expression of the Default_Initial_Condition is missing or is
          --  null.