From: Eric Botcazou Date: Mon, 26 Sep 2011 08:37:32 +0000 (+0000) Subject: sem_ch6.adb (Set_Formal_Mode): Set Can_Never_Be_Null on an IN or IN OUT formal parame... X-Git-Tag: releases/gcc-4.7.0~3576 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a1d7228158d344b16ef9baf8c8ed7a27649fc410;p=thirdparty%2Fgcc.git sem_ch6.adb (Set_Formal_Mode): Set Can_Never_Be_Null on an IN or IN OUT formal parameter which is of an... * sem_ch6.adb (Set_Formal_Mode): Set Can_Never_Be_Null on an IN or IN OUT formal parameter which is of an null-exclusion access subtype. Co-Authored-By: Robert Dewar From-SVN: r179183 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 47842198be60..b747f8ab2df5 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2011-09-26 Eric Botcazou + Robert Dewar + + * sem_ch6.adb (Set_Formal_Mode): Set Can_Never_Be_Null on an IN or IN + OUT formal parameter which is of an null-exclusion access subtype. + 2011-09-26 Eric Botcazou * gcc-interface/ada-tree.h (DECL_CAN_NEVER_BE_NULL_P): New macro. diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index b2a046bb4f8e..a9a45bc6445f 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -10267,6 +10267,16 @@ package body Sem_Ch6 is and then Can_Never_Be_Null (Etype (Formal_Id)) then Set_Is_Known_Non_Null (Formal_Id); + + -- We can also set Can_Never_Be_Null (thus preventing some junk + -- access checks) for the case of an IN parameter, which cannot + -- be changed, or for an IN OUT parameter, which can be changed but + -- not to a null value. But for an OUT parameter, the initial value + -- passed in can be null, so we can't set this flag in that case. + + if Ekind (Formal_Id) /= E_Out_Parameter then + Set_Can_Never_Be_Null (Formal_Id); + end if; end if; Set_Mechanism (Formal_Id, Default_Mechanism);