aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-09-26 08:37:32 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-09-26 08:37:32 +0000
commita1d7228158d344b16ef9baf8c8ed7a27649fc410 (patch)
tree1d6e7e65f276bcee9b39e805d783db259b4fedbd /gcc
parenta1c7d7973c44afbee5e1251b200cc6e7a27409b1 (diff)
downloadgcc-a1d7228158d344b16ef9baf8c8ed7a27649fc410.zip
gcc-a1d7228158d344b16ef9baf8c8ed7a27649fc410.tar.gz
gcc-a1d7228158d344b16ef9baf8c8ed7a27649fc410.tar.bz2
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 <dewar@adacore.com> From-SVN: r179183
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/sem_ch6.adb10
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);