This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Test on i686-linux, committed on trunk.
There was an implicit type conversion missing in case of allocation
of an object implementing an abstract interface. As a consequence the
secondary dispatch table is not referenced and any dispatching call
that uses the secondary dispatch table fails. After this patch the
execution of the following test is correct.
--
with Ada.Finalization; use Ada.Finalization;
package Demo is
type I is interface;
type I_Ptr is access all I'Class;
procedure M (Self : in out I) is abstract;
type Impl is new Controlled and I with null record;
type Impl_Ptr is access all Impl'Class;
overriding procedure M (Self : in out Impl);
end Demo;
with Ada.Text_IO; use Ada.Text_IO;
package body Demo is
overriding procedure M (Self : in out Impl) is begin Put ("OK "); end M;
end Demo;
with Demo; use Demo;
with Ada.Text_IO; use Ada.Text_IO;
procedure Do_Test is
procedure Test (Ptr : access I'Class) is
begin
M (Ptr.all);
Ptr.M;
end Test;
P : constant I_Ptr := new Impl; -- test 1
begin
Put ("Test 1: ");
M (P.all);
P.M;
New_Line;
Put ("Test 2: ");
Test (new Impl); -- test 2
end Do_Test;
--
Command: gnatmake do_test.adb
Output:
Test 1: OK OK
Test 2: OK OK
This patch also fixes missing validity checks for type conversions and
qualified expressions. These checks are under control of -gnatVo
(validity checking for operands).
A test program is:
pragma Validity_Checks ("a");
pragma Initialize_Scalars;
procedure B is
X, Y : Natural;
I : Integer;
begin
I := Integer (X);
I := Integer'(X);
I := Y;
end;
Compiling this with -gnatG should show three validity checks, one
for each assignment (previously only the third generated a check).
When run, an exception is raised at the first assignment.
Finally, this patch also corrects an error in configurable run-time mode of
not allowing 64-bit divides by the constant 8 on some targets when using the
configurable run-time with 64-bit divides not supported.
The following should compile clean using a version of system.ads
that has Configurable_Run_Time set True, and Support_LonG_Shifts
set True, and Support_64_Bit_Divides set False.
procedure Bit_Arrays (Length : Integer) is
Len : constant Integer := Length;
type Bit_Array_Type is array (1 .. Len) of Boolean;
pragma Pack (Bit_Array_Type);
Bit_Array : Bit_Array_Type := (others => False);
begin
null;
end Bit_Arrays;
Note: this program does 64-bit divides by 8 when computing the
length of the packed array type.
2006-02-17 Javier Miranda <miranda@adacore.com>
Robert Dewar <dewar@adacore.com>
* exp_ch4.adb (Expand_N_Allocator): If the allocated object is accessed
through an access to class-wide interface we force the displacement of
the pointer to the allocated object to reference the corresponding
secondary dispatch table.
(Expand_N_Op_Divide): Allow 64 bit divisions by small power of 2,
if Long_Shifts are supported on the target, even if 64 bit divides
are not supported (configurable run time mode).
(Expand_N_Type_Conversion): Do validity check if validity checks on
operands are enabled.
(Expand_N_Qualified_Expression): Do validity check if validity checks
on operands are enabled.
Attachment:
difs.4
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |