diff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 7e71422eba3bc90a0d07b3906134b1055b42a289..2aac1063cc513ffb4aaf4b91825744a30570a31b 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -5982,7 +5982,7 @@ package body Exp_Attr is
             E2  : constant Node_Id    := Next (E1);
             Bnn : constant Entity_Id  := Make_Temporary (Loc, 'B', N);
 
-            Accum_Typ : Entity_Id;
+            Accum_Typ : Entity_Id := Empty;
             New_Loop  : Node_Id;
 
             function Build_Stat (Comp : Node_Id) return Node_Id;
@@ -6001,7 +6001,6 @@ package body Exp_Attr is
 
             begin
                if Nkind (E1) = N_Attribute_Reference then
-                  Accum_Typ := Entity (Prefix (E1));
                   Stat := Make_Assignment_Statement (Loc,
                             Name => New_Occurrence_Of (Bnn, Loc),
                             Expression => Make_Attribute_Reference (Loc,
@@ -6012,14 +6011,12 @@ package body Exp_Attr is
                                 Comp)));
 
                elsif Ekind (Entity (E1)) = E_Procedure then
-                  Accum_Typ := Etype (First_Formal (Entity (E1)));
                   Stat := Make_Procedure_Call_Statement (Loc,
                             Name => New_Occurrence_Of (Entity (E1), Loc),
                                Parameter_Associations => New_List (
                                  New_Occurrence_Of (Bnn, Loc),
                                  Comp));
                else
-                  Accum_Typ := Etype (Entity (E1));
                   Stat := Make_Assignment_Statement (Loc,
                             Name => New_Occurrence_Of (Bnn, Loc),
                             Expression => Make_Function_Call (Loc,
@@ -6080,12 +6077,9 @@ package body Exp_Attr is
                       Statements =>
                         New_List (Build_Stat (Relocate_Node (Expr))));
 
-                  --  If the reducer subprogram is a universal operator, then
-                  --  we still look at the context to find the type for now.
+                  --  Look at the context to find the type.
 
-                  if Is_Universal_Numeric_Type (Accum_Typ) then
-                     Accum_Typ := Etype (N);
-                  end if;
+                  Accum_Typ := Etype (N);
                end;
 
             else
@@ -6115,43 +6109,40 @@ package body Exp_Attr is
                       Statements => New_List (
                         Build_Stat (New_Occurrence_Of (Elem, Loc))));
 
-                  --  If the reducer subprogram is a universal operator, then
-                  --  we need to look at the prefix to find the type. This is
+                  --  Look at the prefix to find the type. This is
                   --  modeled on Analyze_Iterator_Specification in Sem_Ch5.
 
-                  if Is_Universal_Numeric_Type (Accum_Typ) then
-                     declare
-                        Ptyp : constant Entity_Id :=
-                                 Base_Type (Etype (Prefix (N)));
+                  declare
+                     Ptyp : constant Entity_Id :=
+                              Base_Type (Etype (Prefix (N)));
 
-                     begin
-                        if Is_Array_Type (Ptyp) then
-                           Accum_Typ := Component_Type (Ptyp);
-
-                        elsif Has_Aspect (Ptyp, Aspect_Iterable) then
-                           declare
-                              Element : constant Entity_Id :=
-                                          Get_Iterable_Type_Primitive
-                                            (Ptyp, Name_Element);
-                           begin
-                              if Present (Element) then
-                                 Accum_Typ := Etype (Element);
-                              end if;
-                           end;
-
-                        else
-                           declare
-                              Element : constant Node_Id :=
-                                          Find_Value_Of_Aspect
-                                            (Ptyp, Aspect_Iterator_Element);
-                           begin
-                              if Present (Element) then
-                                 Accum_Typ := Entity (Element);
-                              end if;
-                           end;
-                        end if;
-                     end;
-                  end if;
+                  begin
+                     if Is_Array_Type (Ptyp) then
+                        Accum_Typ := Component_Type (Ptyp);
+
+                     elsif Has_Aspect (Ptyp, Aspect_Iterable) then
+                        declare
+                           Element : constant Entity_Id :=
+                                       Get_Iterable_Type_Primitive
+                                         (Ptyp, Name_Element);
+                        begin
+                           if Present (Element) then
+                              Accum_Typ := Etype (Element);
+                           end if;
+                        end;
+
+                     else
+                        declare
+                           Element : constant Node_Id :=
+                                       Find_Value_Of_Aspect
+                                         (Ptyp, Aspect_Iterator_Element);
+                        begin
+                           if Present (Element) then
+                              Accum_Typ := Entity (Element);
+                           end if;
+                        end;
+                     end if;
+                  end;
                end;
             end if;