aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2017-01-23 12:17:23 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2017-01-23 12:17:23 +0100
commit64a4f612f932d54d242f9c0f6594a84c2f764fcc (patch)
treef2ef337dca39b77083913e1e53d25e6319480d4f /gcc
parentbe4e989cd110e3eda9b9b14e6d3f73c9408e8816 (diff)
downloadgcc-64a4f612f932d54d242f9c0f6594a84c2f764fcc.zip
gcc-64a4f612f932d54d242f9c0f6594a84c2f764fcc.tar.gz
gcc-64a4f612f932d54d242f9c0f6594a84c2f764fcc.tar.bz2
[multiple changes]
2017-01-23 Hristian Kirtchev <kirtchev@adacore.com> * exp_ch9.adb (Expand_N_Protected_Type_Declaration): Remove extra spaces from error messages. 2017-01-23 Ed Schonberg <schonberg@adacore.com> * exp_ch3.adb (Check_Large_Modular_Array): New procedure, subsidiary to Expand_N_Object_ Declaration, to compute a guard on an object declaration for an array type with a modular index type with the size of Long_Long_Integer. Special processing is needed in this case to compute reliably the size of the object, and eventually to raise Storage_Error, when wrap-around arithmetic might compute a meangingless size for the object. 2017-01-23 Justin Squirek <squirek@adacore.com> * a-wtenau.adb, par-endh.adb, sem_prag.adb, sem_type.adb: Code cleanups. From-SVN: r244775
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog20
-rw-r--r--gcc/ada/a-wtenau.adb4
-rw-r--r--gcc/ada/exp_ch3.adb61
-rw-r--r--gcc/ada/exp_ch9.adb7
-rw-r--r--gcc/ada/par-endh.adb3
-rw-r--r--gcc/ada/sem_prag.adb2
-rw-r--r--gcc/ada/sem_type.adb1
7 files changed, 87 insertions, 11 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index e482e85..76ee520 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,23 @@
+2017-01-23 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * exp_ch9.adb (Expand_N_Protected_Type_Declaration): Remove extra
+ spaces from error messages.
+
+2017-01-23 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch3.adb (Check_Large_Modular_Array): New procedure,
+ subsidiary to Expand_N_Object_ Declaration, to compute a guard on
+ an object declaration for an array type with a modular index type
+ with the size of Long_Long_Integer. Special processing is needed
+ in this case to compute reliably the size of the object, and
+ eventually to raise Storage_Error, when wrap-around arithmetic
+ might compute a meangingless size for the object.
+
+2017-01-23 Justin Squirek <squirek@adacore.com>
+
+ * a-wtenau.adb, par-endh.adb, sem_prag.adb,
+ sem_type.adb: Code cleanups.
+
2017-01-23 Bob Duff <duff@adacore.com>
* sem_res.adb (Resolve_Call): In the part of the code where
diff --git a/gcc/ada/a-wtenau.adb b/gcc/ada/a-wtenau.adb
index d09306b..709703e 100644
--- a/gcc/ada/a-wtenau.adb
+++ b/gcc/ada/a-wtenau.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2012, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -307,8 +307,6 @@ package body Ada.Wide_Text_IO.Enumeration_Aux is
and then
not Is_Letter (To_Character (WC))
and then
- not Is_Letter (To_Character (WC))
- and then
(WC /= '_' or else From (Stop - 1) = '_');
Stop := Stop + 1;
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb
index 0acd94f..4024349 100644
--- a/gcc/ada/exp_ch3.adb
+++ b/gcc/ada/exp_ch3.adb
@@ -5465,6 +5465,13 @@ package body Exp_Ch3 is
-- value, it may be possible to build an equivalent aggregate instead,
-- and prevent an actual call to the initialization procedure.
+ procedure Check_Large_Modular_Array;
+ -- Check that the size of the array can be computed without overflow,
+ -- and generate a Storage_Error otherwise. This is only relevant for
+ -- array types whose index in a (mod 2**64) type, where wrap-around
+ -- arithmetic might yield a meaningless value for the length of the
+ -- array, or its corresponding attribute.
+
procedure Default_Initialize_Object (After : Node_Id);
-- Generate all default initialization actions for object Def_Id. Any
-- new code is inserted after node After.
@@ -5603,6 +5610,58 @@ package body Exp_Ch3 is
end Build_Equivalent_Aggregate;
-------------------------------
+ -- Check_Large_Modular_Array --
+ -------------------------------
+
+ procedure Check_Large_Modular_Array is
+ Index_Typ : Entity_Id;
+
+ begin
+ if Is_Array_Type (Typ)
+ and then Is_Modular_Integer_Type (Etype (First_Index (Typ)))
+ then
+ -- To prevent arithmetic overflow with large values, we
+ -- raise Storage_Error under the following guard:
+ --
+ -- (Arr'Last / 2 - Arr'First / 2) > (Typ'Last - 1) / 2
+
+ -- This takes care of the boundary case, but it is preferable
+ -- to use a smaller limit, because even on 64-bit architectures
+ -- an array of more than 2 ** 30 bytes is likely to raise
+ -- Storage_Error.
+
+ Index_Typ := Etype (First_Index (Typ));
+ if RM_Size (Index_Typ) = RM_Size (Standard_Long_Long_Integer) then
+ Insert_Action (N,
+ Make_Raise_Storage_Error (Loc,
+ Condition =>
+ Make_Op_Ge (Loc,
+ Left_Opnd =>
+ Make_Op_Subtract (Loc,
+ Left_Opnd =>
+ Make_Op_Divide (Loc,
+ Left_Opnd =>
+ Make_Attribute_Reference (Loc,
+ Prefix => New_Occurrence_Of (Typ, Loc),
+ Attribute_Name => Name_Last),
+ Right_Opnd =>
+ Make_Integer_Literal (Loc, Uint_2)),
+ Right_Opnd =>
+ Make_Op_Divide (Loc,
+ Left_Opnd =>
+ Make_Attribute_Reference (Loc,
+ Prefix => New_Occurrence_Of (Typ, Loc),
+ Attribute_Name => Name_First),
+ Right_Opnd =>
+ Make_Integer_Literal (Loc, Uint_2))),
+ Right_Opnd =>
+ Make_Integer_Literal (Loc, (Uint_2 ** 30))),
+ Reason => SE_Object_Too_Large));
+ end if;
+ end if;
+ end Check_Large_Modular_Array;
+
+ -------------------------------
-- Default_Initialize_Object --
-------------------------------
@@ -6012,6 +6071,8 @@ package body Exp_Ch3 is
Build_Master_Entity (Def_Id);
end if;
+ Check_Large_Modular_Array;
+
-- Default initialization required, and no expression present
if No (Expr) then
diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb
index d2772ca..2ae495e 100644
--- a/gcc/ada/exp_ch9.adb
+++ b/gcc/ada/exp_ch9.adb
@@ -9038,13 +9038,12 @@ package body Exp_Ch9 is
& "violate restriction "
& "No_Implicit_Heap_Allocations??", Priv, Prot_Typ);
else
-
-- Object will be non-static if discriminants are
Error_Msg_NE
("creation of protected object of type& with "
- & "non-static discriminants will violate"
- & " restriction No_Implicit_Heap_Allocations??",
+ & "non-static discriminants will violate "
+ & "restriction No_Implicit_Heap_Allocations??",
Priv, Prot_Typ);
end if;
@@ -9068,7 +9067,7 @@ package body Exp_Ch9 is
Error_Msg_NE
("creation of protected object of type& with "
- & "non-static discriminants will violate "
+ & "non-static discriminants will violate "
& "restriction "
& "No_Implicit_Protected_Object_Allocations??",
Priv, Prot_Typ);
diff --git a/gcc/ada/par-endh.adb b/gcc/ada/par-endh.adb
index 3c065ec..bbcbff9 100644
--- a/gcc/ada/par-endh.adb
+++ b/gcc/ada/par-endh.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2016, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -576,7 +576,6 @@ package body Endh is
-- Cases of normal tokens following an END
(Token = Tok_Case or else
- Token = Tok_For or else
Token = Tok_If or else
Token = Tok_Loop or else
Token = Tok_Record or else
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index f1520d5..f34e2ff 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -23951,7 +23951,7 @@ package body Sem_Prag is
-- Attribute 'Result matches attribute 'Result
elsif Is_Attribute_Result (Dep_Item)
- and then Is_Attribute_Result (Dep_Item)
+ and then Is_Attribute_Result (Ref_Item)
then
Matched := True;
diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb
index 555184a..26415ae 100644
--- a/gcc/ada/sem_type.adb
+++ b/gcc/ada/sem_type.adb
@@ -2578,7 +2578,6 @@ package body Sem_Type is
loop
if Present (Interfaces (E))
- and then Present (Interfaces (E))
and then not Is_Empty_Elmt_List (Interfaces (E))
then
Elmt := First_Elmt (Interfaces (E));