https://gcc.gnu.org/g:585ade15412ae056c5ee17c046ae6316ca5d23c1
commit r16-2420-g585ade15412ae056c5ee17c046ae6316ca5d23c1 Author: Gary Dismukes <dismu...@adacore.com> Date: Fri Jul 11 23:30:18 2025 +0000 ada: Nested use_type_clause with "all" cancels use_type_clause with wider scope The compiler mishandles nested use_type_clauses in the case where the outer one is a normal use_type_clause and the inner one has "all". Upon leaving the scope of the inner use_type_clause, the outer one is effectively disabled, because it's not considered redundant (and in fact it's only partially redundant). This is fixed by testing for the presence of a use_type_clause for the same type that has a wider scope when ending the inner use_type_clause. gcc/ada/ChangeLog: * sem_ch8.adb (End_Use_Type): Add a test for there not being an earlier use_type_clause for the same type as an additional criterion for turning off In_Use and Current_Use_Clause. Diff: --- gcc/ada/sem_ch8.adb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index 54066b4f23ea..e6ef65860d63 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -5444,7 +5444,15 @@ package body Sem_Ch8 is elsif In_Open_Scopes (Scope (Base_Type (T))) then null; - elsif not Redundant_Use (Id) then + -- Turn off the use_type_clause on the type unless the clause is + -- redundant, or there's a previous use_type_clause. (The case where + -- a use_type_clause without "all" is followed by one with "all" in + -- a more nested scope is not considered redundant, necessitating + -- the test for a previous clause. One might expect the latter test + -- to suffice, but it turns out there are cases where Redundant_Use + -- is set, but Prev_Use_Clause is not set. ???) + + elsif not Redundant_Use (Id) and then No (Prev_Use_Clause (N)) then Set_In_Use (T, False); Set_In_Use (Base_Type (T), False); Set_Current_Use_Clause (T, Empty);