]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix regression in Root_Type
authorBob Duff <duff@adacore.com>
Mon, 18 Aug 2025 18:35:35 +0000 (14:35 -0400)
committerMarc Poulhiès <dkm@gcc.gnu.org>
Thu, 11 Sep 2025 09:10:48 +0000 (11:10 +0200)
Previous change, "Make pp and friends more robust (base type only)"
introduced a bug in Root_Type. Etype (T) can, in fact, be Empty
(but only in case of errors.) This patch fixes it.

gcc/ada/ChangeLog:

* einfo-utils.adb (Root_Type): Deal with missing Etype.
(Root_Type_If_Set): Likewise.

gcc/ada/einfo-utils.adb

index d84e562853ccb699baa9d52eb982f011634fbfa8..450d4c36b2110c4d9aa43607e8a05812bce96580 100644 (file)
@@ -2585,7 +2585,11 @@ package body Einfo.Utils is
             loop
                Etyp := Etype (T);
 
-               exit when T = Etyp
+               if No (Etyp) then
+                  Check_Error_Detected;
+               end if;
+
+               exit when No (Etyp) or else T = Etyp
                  or else
                    (Is_Private_Type (T) and then Etyp = Full_View (T))
                  or else
@@ -2609,6 +2613,10 @@ package body Einfo.Utils is
       end return;
    end Root_Type;
 
+   ----------------------
+   -- Root_Type_If_Set --
+   ----------------------
+
    function Root_Type_If_Set (Id : E) return Opt_N_Entity_Id is
       Etyp : Entity_Id;
 
@@ -2620,12 +2628,7 @@ package body Einfo.Utils is
             loop
                Etyp := Etype (T);
 
-               if No (Etyp) then
-                  T := Empty;
-                  exit;
-               end if;
-
-               exit when T = Etyp
+               exit when No (Etyp) or else T = Etyp
                  or else
                    (Is_Private_Type (T) and then Etyp = Full_View (T))
                  or else