diff options
author | Ed Schonberg <schonberg@adacore.com> | 2022-02-15 15:38:42 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2022-05-13 08:04:36 +0000 |
commit | 7b6fa643ef03f898a6e7284167fa6d064ba8b524 (patch) | |
tree | a9bac34cad6d2fc74a02ffb2a431e7a5fabfe101 | |
parent | 3fe35ab093de715e88fc837155954bbe74b326f3 (diff) | |
download | gcc-7b6fa643ef03f898a6e7284167fa6d064ba8b524.zip gcc-7b6fa643ef03f898a6e7284167fa6d064ba8b524.tar.gz gcc-7b6fa643ef03f898a6e7284167fa6d064ba8b524.tar.bz2 |
[Ada] Handle IN iterator for class-wide derived object of iterator type
The compiler currently rejects iterating on an interface type derived
from an iterator type.
See Ada RM 5.5.1(6/3) and 5.5.2(3/3).
gcc/ada/
* sem_ch5.adb (Analyze_Iterator_Specification): Fix Typ in the
case of a class-wide derived iterator.
-rw-r--r-- | gcc/ada/sem_ch5.adb | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb index 0a83608..7fd5ab3 100644 --- a/gcc/ada/sem_ch5.adb +++ b/gcc/ada/sem_ch5.adb @@ -2761,9 +2761,21 @@ package body Sem_Ch5 is end; end if; - -- IN iterator, domain is a range, or a call to Iterate function + -- IN iterator, domain is a range, a call to Iterate function, + -- or an object/actual parameter of an iterator type. else + -- If the type of the name is class-wide and its root type is a + -- derived type, the primitive operations (First, Next, etc.) are + -- those inherited by its specific type. Calls to these primitives + -- will be dispatching. + + if Is_Class_Wide_Type (Typ) + and then Is_Derived_Type (Etype (Typ)) + then + Typ := Etype (Typ); + end if; + -- For an iteration of the form IN, the name must denote an -- iterator, typically the result of a call to Iterate. Give a -- useful error message when the name is a container by itself. |