PR# 3710 Inserting an 'expanded B' to a 'TUPLE [expanded B]'
Problem Report Summary
Submitter: gobobe
Category: EiffelBase
Priority: Medium
Date: 2004/03/20
Class: Bug
Severity: Serious
Number: 3710
Release: 5.5.0409
Confidential: No
Status: Open
Responsible:
Environment: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02
Synopsis: Inserting an 'expanded B' to a 'TUPLE [expanded B]'
Description
ISE Eiffel 5.5.0409
Following the bug report [Run-time/3709], let's consider again this class:
---------------------
class B
inherit
ANY
redefine
default_create
end
create
default_create,
make_from_expanded
convert
make_from_expanded ({expanded B}),
to_expanded: {expanded B}
feature
default_create is
--
do
i := 45
end
make_from_expanded (b: expanded B) is
do
i := b.i
end
to_expanded: expanded B is
do
Result.set_i (i)
end
i: INTEGER
set_i (int: INTEGER) is
do
i := int
end
end
---------------------
We saw in the bug report [Run-time/3709] that the item of 'TUPLE [expanded B]' was not initialized as expected when creating the Tuple (it was erroneously set to Void, which is not a valid value for an expanded entity). In order to work around this problem I tried to give this item a valid value:
---------------------
class A
create
make
feature
make is
local
tb: TUPLE [expanded B]
b: expanded B
do
create tb
tb.put (b, 1)
end
end
---------------------
This code compiles fine, but I got the following exception trace when executing it:
-------------------------------------------------------------------------------
Class / Object Routine Nature of exception Effect
-------------------------------------------------------------------------------
TUPLE put @2 valid_type_for_index:
<0000000000B80060> Precondition violated. Fail
-------------------------------------------------------------------------------
A make @2
<0000000000B80048> Routine failure. Fail
-------------------------------------------------------------------------------
A root's creation
<0000000000B80048> Routine failure. Exit
-------------------------------------------------------------------------------
Indeed, in the call to `put' the expanded entity `b' is converted to its reference form, and 'reference B' does not conform to 'expanded B', it only converts to it.
It seems to me that the problem is in the implementation of `valid_type_for_index' in class TUPLE. Apparently we go into the 'reference_code' branch, even though the item of the Tuple is expanded. And then only conformance is considered, not convertability.
To Reproduce
Problem Report Interactions