From 7b6fa643ef03f898a6e7284167fa6d064ba8b524 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Tue, 15 Feb 2022 15:38:42 +0100 Subject: [PATCH] [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. --- gcc/ada/sem_ch5.adb | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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. -- 2.7.4