aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/i-cpoint.adb
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2015-01-07 10:52:50 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2015-01-07 10:52:50 +0100
commitc3831524bc0bf8d15bc95e26832a2a5e0752f9cc (patch)
tree24a17934b629bb46778ca5d90adbe1188eb86824 /gcc/ada/i-cpoint.adb
parent1a9ee22281e0902c673d3c2e4cb5b83e07786569 (diff)
downloadgcc-c3831524bc0bf8d15bc95e26832a2a5e0752f9cc.zip
gcc-c3831524bc0bf8d15bc95e26832a2a5e0752f9cc.tar.gz
gcc-c3831524bc0bf8d15bc95e26832a2a5e0752f9cc.tar.bz2
[multiple changes]
2015-01-07 Tristan Gingold <gingold@adacore.com> * i-cpoint.adb (Copy_Terminated_Array): Use Copy_Array to handle overlap. 2015-01-07 Eric Botcazou <ebotcazou@adacore.com> * sem_ch3.adb (Analyze_Full_Type_Declaration): Do not automatically set No_Strict_Aliasing on access types. * fe.h (No_Strict_Aliasing_CP): Declare. * gcc-interface/trans.c (gigi): Force flag_strict_aliasing to 0 if No_Strict_Aliasing_CP is set. 2015-01-07 Johannes Kanig <kanig@adacore.com> * sem_ch8.adb (Analyze_Subprogram_Renaming) do not build function wrapper in gnatprove mode when the package is externally axiomatized. 2015-01-07 Jose Ruiz <ruiz@adacore.com> * a-reatim.adb (Time_Of): Reduce the number of spurious overflows in intermediate computations when the parameters have different signs. 2015-01-07 Javier Miranda <miranda@adacore.com> * exp_ch3.adb (Build_Init_Procedure): For derived types, improve the code which takes care of identifying and moving to the beginning of the init-proc the call to the init-proc of the parent type. From-SVN: r219287
Diffstat (limited to 'gcc/ada/i-cpoint.adb')
-rw-r--r--gcc/ada/i-cpoint.adb26
1 files changed, 12 insertions, 14 deletions
diff --git a/gcc/ada/i-cpoint.adb b/gcc/ada/i-cpoint.adb
index afcb96b..6b3c84d 100644
--- a/gcc/ada/i-cpoint.adb
+++ b/gcc/ada/i-cpoint.adb
@@ -143,23 +143,21 @@ package body Interfaces.C.Pointers is
Limit : ptrdiff_t := ptrdiff_t'Last;
Terminator : Element := Default_Terminator)
is
- S : Pointer := Source;
- T : Pointer := Target;
- L : ptrdiff_t := Limit;
-
+ L : ptrdiff_t;
+ S : Pointer := Source;
begin
- if S = null or else T = null then
+ if Source = null then
raise Dereference_Error;
-
- else
- while L > 0 loop
- T.all := S.all;
- exit when T.all = Terminator;
- Increment (T);
- Increment (S);
- L := L - 1;
- end loop;
end if;
+
+ -- Compute array length (including the terminator)
+ L := 1;
+ while S.all /= Terminator and then L < Limit loop
+ L := L + 1;
+ Increment (S);
+ end loop;
+
+ Copy_Array (Source, Target, L);
end Copy_Terminated_Array;
---------------