From: Ed Schonberg Date: Tue, 7 Jul 2009 10:40:14 +0000 (+0000) Subject: sem_ch4.adb (Analyze_Conditional_Expression): handle properly overloaded expressions... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e0ba1bfd6445f979c50a9faba4ac91f90722ef4e;p=gcc.git sem_ch4.adb (Analyze_Conditional_Expression): handle properly overloaded expressions in a conditional expressions. 2009-07-07 Ed Schonberg * sem_ch4.adb (Analyze_Conditional_Expression): handle properly overloaded expressions in a conditional expressions. * sem_res.adb (Resolve): Handle properly overloaded conditional expressions. From-SVN: r149317 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 455f0a51dfe..a923a920a60 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2009-07-07 Ed Schonberg + + * sem_ch4.adb (Analyze_Conditional_Expression): handle properly + overloaded expressions in a conditional expressions. + + * sem_res.adb (Resolve): Handle properly overloaded conditional + expressions. + 2009-07-07 Robert Dewar * scng.adb: Minor reformattting diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 6303dd1ac41..98cbde31d43 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -1250,7 +1250,25 @@ package body Sem_Ch4 is Analyze_Expression (Else_Expr); end if; - Set_Etype (N, Etype (Then_Expr)); + if not Is_Overloaded (Then_Expr) then + Set_Etype (N, Etype (Then_Expr)); + else + declare + I : Interp_Index; + It : Interp; + + begin + Set_Etype (N, Any_Type); + Get_First_Interp (Then_Expr, I, It); + while Present (It.Nam) loop + if Has_Compatible_Type (Else_Expr, It.Typ) then + Add_One_Interp (N, It.Typ, It.Typ); + end if; + + Get_Next_Interp (I, It); + end loop; + end; + end if; end Analyze_Conditional_Expression; ------------------------- diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 95f3c9b1470..ba06ee8b58c 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -2146,6 +2146,9 @@ package body Sem_Res is elsif Nkind (N) = N_Character_Literal then Set_Etype (N, Expr_Type); + elsif Nkind (N) = N_Conditional_Expression then + Set_Etype (N, Expr_Type); + -- For an explicit dereference, attribute reference, range, -- short-circuit form (which is not an operator node), or call -- with a name that is an explicit dereference, there is