From: Piotr Trojanek <[email protected]>
Use existing machinery for internal attributes to handle attributes
related to Ada 2012 iterators. All these attributes exist exclusively
as a mean to delay processing.
Code cleanup. The only change in behavior is the wording of error
emitted when one of the internal attributes appears in source code:
from "illegal attribute" (which used to be emitted in the analysis)
to "unrecognized attribute (which is emitted by the parser).
gcc/ada/ChangeLog:
* exp_attr.adb (Expand_N_Attribute_Reference): Remove explicit
handling of attributes related to Ada 2012 iterators.
* sem_attr.adb (Analyze_Attribute, Eval_Attribute): Likewise;
move attribute Reduce according to alphabetic order.
* snames.adb-tmpl (Get_Attribute_Id): Add support for new internal
attributes.
* snames.ads-tmpl: Recognize names of new internal attributes.
(Attribute_Id): Recognize new internal attributes.
(Internal_Attribute_Id): Likewise.
(Is_Internal_Attribute_Name): Avoid duplication in comment.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/exp_attr.adb | 12 ------------
gcc/ada/sem_attr.adb | 32 +++++++-------------------------
gcc/ada/snames.adb-tmpl | 33 ++++++++++++++++++++++++---------
gcc/ada/snames.ads-tmpl | 32 +++++++++++++++-----------------
4 files changed, 46 insertions(+), 63 deletions(-)
diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 904293bbd1d..911b9dcf807 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -2266,18 +2266,6 @@ package body Exp_Attr is
case Id is
- -- Attributes related to Ada 2012 iterators. They are only allowed in
- -- attribute definition clauses and should never be expanded.
-
- when Attribute_Constant_Indexing
- | Attribute_Default_Iterator
- | Attribute_Implicit_Dereference
- | Attribute_Iterable
- | Attribute_Iterator_Element
- | Attribute_Variable_Indexing
- =>
- raise Program_Error;
-
-- Internal attributes used to deal with Ada 2012 delayed aspects. These
-- were already rejected by the parser. Thus they shouldn't appear here.
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 7295784704f..53b96501d78 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -3423,18 +3423,6 @@ package body Sem_Attr is
case Attr_Id is
- -- Attributes related to Ada 2012 iterators. Attribute specifications
- -- exist for these, but they cannot be queried.
-
- when Attribute_Constant_Indexing
- | Attribute_Default_Iterator
- | Attribute_Implicit_Dereference
- | Attribute_Iterator_Element
- | Attribute_Iterable
- | Attribute_Variable_Indexing
- =>
- Error_Msg_N ("illegal attribute", N);
-
-- Internal attributes used to deal with Ada 2012 delayed aspects. These
-- were already rejected by the parser. Thus they shouldn't appear here.
@@ -9015,19 +9003,6 @@ package body Sem_Attr is
case Id is
- -- Attributes related to Ada 2012 iterators; nothing to evaluate for
- -- these.
-
- when Attribute_Constant_Indexing
- | Attribute_Default_Iterator
- | Attribute_Implicit_Dereference
- | Attribute_Iterator_Element
- | Attribute_Iterable
- | Attribute_Reduce
- | Attribute_Variable_Indexing
- =>
- null;
-
-- Internal attributes used to deal with Ada 2012 delayed aspects.
-- These were already rejected by the parser. Thus they shouldn't
-- appear here.
@@ -10208,6 +10183,13 @@ package body Sem_Attr is
end case;
end Range_Length;
+ ------------
+ -- Reduce --
+ ------------
+
+ when Attribute_Reduce =>
+ null;
+
---------
-- Ref --
---------
diff --git a/gcc/ada/snames.adb-tmpl b/gcc/ada/snames.adb-tmpl
index d49fdf4d74a..62ca4de4866 100644
--- a/gcc/ada/snames.adb-tmpl
+++ b/gcc/ada/snames.adb-tmpl
@@ -125,15 +125,30 @@ package body Snames is
function Get_Attribute_Id (N : Name_Id) return Attribute_Id is
begin
- if N = Name_CPU then
- return Attribute_CPU;
- elsif N = Name_Dispatching_Domain then
- return Attribute_Dispatching_Domain;
- elsif N = Name_Interrupt_Priority then
- return Attribute_Interrupt_Priority;
- else
- return Attribute_Id'Val (N - First_Attribute_Name);
- end if;
+ case N is
+ when Name_Constant_Indexing =>
+ return Attribute_Constant_Indexing;
+ when Name_CPU =>
+ return Attribute_CPU;
+ when Name_Default_Iterator =>
+ return Attribute_Default_Iterator;
+ when Name_Dispatching_Domain =>
+ return Attribute_Dispatching_Domain;
+ when Name_Implicit_Dereference =>
+ return Attribute_Implicit_Dereference;
+ when Name_Interrupt_Priority =>
+ return Attribute_Interrupt_Priority;
+ when Name_Iterable =>
+ return Attribute_Iterable;
+ when Name_Iterator_Element =>
+ return Attribute_Iterator_Element;
+ when Name_Variable_Indexing =>
+ return Attribute_Variable_Indexing;
+ when First_Attribute_Name .. Last_Attribute_Name =>
+ return Attribute_Id'Val (N - First_Attribute_Name);
+ when others =>
+ raise Program_Error;
+ end case;
end Get_Attribute_Id;
-----------------------
diff --git a/gcc/ada/snames.ads-tmpl b/gcc/ada/snames.ads-tmpl
index 59637940bee..4e0d94f5113 100644
--- a/gcc/ada/snames.ads-tmpl
+++ b/gcc/ada/snames.ads-tmpl
@@ -943,12 +943,10 @@ package Snames is
Name_Compiler_Version : constant Name_Id := N + $; -- GNAT
Name_Component_Size : constant Name_Id := N + $;
Name_Compose : constant Name_Id := N + $;
- Name_Constant_Indexing : constant Name_Id := N + $; -- GNAT
Name_Constrained : constant Name_Id := N + $;
Name_Count : constant Name_Id := N + $;
Name_Default_Bit_Order : constant Name_Id := N + $; -- GNAT
Name_Default_Scalar_Storage_Order : constant Name_Id := N + $; -- GNAT
- Name_Default_Iterator : constant Name_Id := N + $; -- GNAT
Name_Definite : constant Name_Id := N + $;
Name_Delta : constant Name_Id := N + $;
Name_Denorm : constant Name_Id := N + $;
@@ -975,13 +973,10 @@ package Snames is
Name_Has_Same_Storage : constant Name_Id := N + $; -- Ada 12
Name_Has_Tagged_Values : constant Name_Id := N + $; -- GNAT
Name_Identity : constant Name_Id := N + $;
- Name_Implicit_Dereference : constant Name_Id := N + $; -- GNAT
Name_Index : constant Name_Id := N + $; -- Ada 22
Name_Initialized : constant Name_Id := N + $; -- GNAT
Name_Integer_Value : constant Name_Id := N + $; -- GNAT
Name_Invalid_Value : constant Name_Id := N + $; -- GNAT
- Name_Iterator_Element : constant Name_Id := N + $; -- GNAT
- Name_Iterable : constant Name_Id := N + $; -- GNAT
Name_Large : constant Name_Id := N + $; -- Ada 83
Name_Last : constant Name_Id := N + $;
Name_Last_Bit : constant Name_Id := N + $;
@@ -1063,7 +1058,6 @@ package Snames is
Name_Valid : constant Name_Id := N + $;
Name_Valid_Scalars : constant Name_Id := N + $; -- GNAT
Name_Value_Size : constant Name_Id := N + $; -- GNAT
- Name_Variable_Indexing : constant Name_Id := N + $; -- GNAT
Name_Version : constant Name_Id := N + $;
Name_Wchar_T_Size : constant Name_Id := N + $; -- GNAT
Name_Wide_Wide_Width : constant Name_Id := N + $; -- Ada 05
@@ -1152,10 +1146,16 @@ package Snames is
-- internal attributes is not permitted).
First_Internal_Attribute_Name : constant Name_Id := N + $;
+ Name_Constant_Indexing : constant Name_Id := N + $; -- GNAT
Name_CPU : constant Name_Id := N + $;
+ Name_Default_Iterator : constant Name_Id := N + $; -- GNAT
Name_Dispatching_Domain : constant Name_Id := N + $;
+ Name_Implicit_Dereference : constant Name_Id := N + $; -- GNAT
Name_Interrupt_Priority : constant Name_Id := N + $;
+ Name_Iterable : constant Name_Id := N + $; -- GNAT
+ Name_Iterator_Element : constant Name_Id := N + $; -- GNAT
Name_Secondary_Stack_Size : constant Name_Id := N + $; -- GNAT
+ Name_Variable_Indexing : constant Name_Id := N + $; -- GNAT
Last_Internal_Attribute_Name : constant Name_Id := N + $;
-- Names of recognized locking policy identifiers
@@ -1480,12 +1480,10 @@ package Snames is
Attribute_Compiler_Version,
Attribute_Component_Size,
Attribute_Compose,
- Attribute_Constant_Indexing,
Attribute_Constrained,
Attribute_Count,
Attribute_Default_Bit_Order,
Attribute_Default_Scalar_Storage_Order,
- Attribute_Default_Iterator,
Attribute_Definite,
Attribute_Delta,
Attribute_Denorm,
@@ -1512,13 +1510,10 @@ package Snames is
Attribute_Has_Same_Storage,
Attribute_Has_Tagged_Values,
Attribute_Identity,
- Attribute_Implicit_Dereference,
Attribute_Index,
Attribute_Initialized,
Attribute_Integer_Value,
Attribute_Invalid_Value,
- Attribute_Iterator_Element,
- Attribute_Iterable,
Attribute_Large,
Attribute_Last,
Attribute_Last_Bit,
@@ -1600,7 +1595,6 @@ package Snames is
Attribute_Valid,
Attribute_Valid_Scalars,
Attribute_Value_Size,
- Attribute_Variable_Indexing,
Attribute_Version,
Attribute_Wchar_T_Size,
Attribute_Wide_Wide_Width,
@@ -1662,12 +1656,18 @@ package Snames is
-- the special processing required to deal with the fact that their
-- names are not attribute names.
+ Attribute_Constant_Indexing,
Attribute_CPU,
+ Attribute_Default_Iterator,
Attribute_Dispatching_Domain,
- Attribute_Interrupt_Priority);
+ Attribute_Implicit_Dereference,
+ Attribute_Interrupt_Priority,
+ Attribute_Iterable,
+ Attribute_Iterator_Element,
+ Attribute_Variable_Indexing);
subtype Internal_Attribute_Id is Attribute_Id
- range Attribute_CPU .. Attribute_Interrupt_Priority;
+ range Attribute_Constant_Indexing .. Attribute_Variable_Indexing;
type Attribute_Set is array (Attribute_Id) of Boolean;
-- Type used to build attribute classification flag arrays
@@ -2058,9 +2058,7 @@ package Snames is
-- i.e. an attribute reference that returns an entity.
function Is_Internal_Attribute_Name (N : Name_Id) return Boolean;
- -- Test to see if the name N is the name of an INT attribute (Name_CPU,
- -- Name_Dispatching_Domain, Name_Interrupt_Priority,
- -- Name_Secondary_Stack_Size).
+ -- Test to see if the name N is the name of an internal attribute
function Is_Procedure_Attribute_Name (N : Name_Id) return Boolean;
-- Test to see if the name N is the name of a recognized attribute that
--
2.43.0