aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJustin Squirek <squirek@adacore.com>2023-02-09 17:00:46 +0000
committerMarc Poulhiès <poulhies@adacore.com>2023-05-22 10:46:12 +0200
commit6675552bacd41361d8d445438cb6d978d44c1402 (patch)
tree3e33ec4bc86ee4683ad8512202d4d72adcdde028 /gcc
parenteb16654e44775841f82488311fcf08ef521756d9 (diff)
downloadgcc-6675552bacd41361d8d445438cb6d978d44c1402.zip
gcc-6675552bacd41361d8d445438cb6d978d44c1402.tar.gz
gcc-6675552bacd41361d8d445438cb6d978d44c1402.tar.bz2
ada: Incorrect constant folding in postcondition involving 'Old
The following patch fixes an issue in the compiler whereby certain flavors of access comparisons may be incorrectly constant-folded out of contract expressions - notably in postcondition expressions featuring a reference to 'Old. gcc/ada/ * checks.adb (Install_Null_Excluding_Check): Avoid non-null optimizations when assertions are enabled.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/checks.adb13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index 9f3c679..0d47296 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -8437,7 +8437,18 @@ package body Checks is
Right_Opnd => Make_Null (Loc)),
Reason => CE_Access_Check_Failed));
- Mark_Non_Null;
+ -- Mark the entity of N "non-null" except when assertions are enabled -
+ -- since expansion becomes much more complicated (especially when it
+ -- comes to contracts) due to the generation of wrappers and wholesale
+ -- moving of declarations and statements which may happen.
+
+ -- Additionally, it is assumed that extra checks will exist with
+ -- assertions enabled so some potentially redundant checks are
+ -- acceptable.
+
+ if not Assertions_Enabled then
+ Mark_Non_Null;
+ end if;
end Install_Null_Excluding_Check;
-----------------------------------------