comp.lang.ada
 help / color / mirror / Atom feed
From: butch!rapnet!lvonrude@uunet.uu.net  (Lowell S. VonRuden x5294)
Subject: Re: Unchecked_Conversion question
Date: 2 Sep 93 13:38:59 GMT	[thread overview]
Message-ID: <1993Sep2.133859.26958@Rapnet.Sanders.Lockheed.Com> (raw)

In article <CCop4H.Hz8@irvine.com> adam@irvine.com (Adam Beneschan) writes:
>In article <1993Sep1.154715.10498@Rapnet.Sanders.Lockheed.Com> lvonrude@Rapnet
.Sanders.Lockheed.Com (Lowell S. VonRuden x5294) writes:
>
>>   I am doing something that seems to work using a Verdix compiler, but I
>>   have not been able to determine if this is something that will be safely
>>   transportable.  Hopefully, someone here can tell me.
>>
>>   I have a 32 bit value coming in from an external interface as an
>>   integer, which I am mapping to an enumeration type.  The enumeration
>>   type has representation clauses for both size (Integer'Size) and
>>   implementation values.  Assigning the result of an unchecked conversion
>>   from the integer to an object of the enumeration type doesn't raise any
>>   exception if the integer is out of range for the enumeration type
>>   representation.  I found that if I do an explicit conversion of the
>>   enumeration object to its type, then the range gets checked.
>>
>>   procedure Sample (Int : Integer) is
>>
>>     type Enum is (AAA, BBB, CCC, DDD);
>>     for  Enum use (AAA=> 1,
>>                    BBB=> 2,
>>                    CCC=> 13,
>>                    DDD=> 14);
>>     for  Enum'Size use Integer'Size;
>>
>>     function Convert is new Unchecked_Conversion (Source => Integer,
>>                                                   Target => Enum);
>>   begin
>>
>>     E := Convert (Int);  -- no exception raised here if Int is out of range
>>
>>     E := Enum (Convert (Int));  -- this does raise constraint error if
>>                                 -- Int is out of range
>>
>>   end Sample;
>>
>>
>>   So, is this a dependable thing to do?
>
>I don't think so.
>
>In fact, I'm surprised that your two statements generate different
>code at all.  After all, Convert is a function that returns an Enum,
>so saying Enum(X) as a type conversion should be a no-op.  I would
>guess that many compilers would recognize this, and not generate any
>constraint checking code when "converting" an object to an object of
>the exact same type.  
>
>I don't such a check is required by the LRM, either.  I believe that
>if you say
>
>    X : Enum;
>...
>   ... Enum(X) ...
>
>the compiler is allowed to assume that "X" contains a valid Enum
>value, and therefore the compiler can determine that no range check is
>required.

That's what I'm concerned about.  The Verdix compiler I'm using
generates the check for the seemingly unnecessary conversion both with
and without the optimizer turned on, but I still feel funny trusting
this in all situations.

I saw someone else's attempt at trying to catch bad values for X.  They
passed the Enum resulting from the unchecked conversion into a procedure,
which did some unrelated thing, but they had a local block with an exception
handler for Constraint_Error surrounding the call.  This would assume
that the constraints of the Enum type would always be checked when the
object is passed to another procedure.

  E := Convert (Int);

  begin
    Do_Something_Unrelated (E);
  exception
    when Constraint_Error =>
      -- assume Int must not have been a valid Enum representation
  end;

Would this be a safe assumption?

-- 
--------------------------------------------------------------------
-- Usual disclaimers apply...               Lowell Von Ruden      --
-- lvonrude@rapnet.sanders.lockheed.com     Lockheed Sanders, Inc --
--------------------------------------------------------------------

             reply	other threads:[~1993-09-02 13:38 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1993-09-02 13:38 Lowell S. VonRuden x5294 [this message]
  -- strict thread matches above, loose matches on Subject: below --
1993-09-04  0:13 Unchecked_Conversion question Robert Dewar
1993-09-03 21:55 Robert Parkhill
1993-09-03 20:14 Wes Groleau x1240 C73-8
1993-09-03 19:51 dog.ee.lbl.gov!agate!howland.reston.ans.net!spool.mu.edu!sdd.hp.com!netwo
1993-09-03 19:06 dog.ee.lbl.gov!agate!spool.mu.edu!umn.edu!email.sp.paramax.com!not-for-ma
1993-09-02 15:43 dog.ee.lbl.gov!overload.lbl.gov!agate!howland.reston.ans.net!noc.near.net
1993-09-02  3:00 Robert Dewar
1993-09-01 16:43 dog.ee.lbl.gov!network.ucsd.edu!news.cerf.net!shrike.irvine.com!adam
1993-09-01 15:47 Lowell S. VonRuden x5294
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox