diff options
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/sem_ch6.adb | 10 |
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 4784219..b747f8a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,4 +1,10 @@ 2011-09-26 Eric Botcazou <ebotcazou@adacore.com> + Robert Dewar <dewar@adacore.com> + + * 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 <ebotcazou@adacore.com> * gcc-interface/ada-tree.h (DECL_CAN_NEVER_BE_NULL_P): New macro. * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Set the flag. diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index b2a046b..a9a45bc 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); |