diff options
Diffstat (limited to 'gcc/ada/sem_attr.adb')
-rw-r--r-- | gcc/ada/sem_attr.adb | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index bde4d40..e9e245a 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -12851,7 +12851,10 @@ package body Sem_Attr is end Proper_Op; begin - Resolve (Init_Value_Exp, Typ); + -- First try to resolve the reducer and then, if this succeeds, + -- resolve the initial value. This nicely deals with confused + -- programmers who swap the two items. + if Is_Overloaded (Reducer_Subp_Name) then Outer : for Retry in Boolean loop @@ -12873,14 +12876,18 @@ package body Sem_Attr is then Op := Reducer_Subp_Name; - elsif Proper_Op (Entity (Reducer_Subp_Name)) then + elsif Is_Entity_Name (Reducer_Subp_Name) + and then Proper_Op (Entity (Reducer_Subp_Name)) + then Op := Entity (Reducer_Subp_Name); Set_Etype (N, Typ); end if; if No (Op) then - Error_Msg_N ("No suitable reducer subprogram found", + Error_Msg_N ("no suitable reducer subprogram found", Reducer_Subp_Name); + else + Resolve (Init_Value_Exp, Typ); end if; end; |