> From: W. Wesley Groleau x4923
> Just curious. Long, long ago, in a company far, far away,
> we were NOT getting constraint error that we thought we
> should at an assignment statement.
> The vendor's argument was that if you traced back the origin of the right
> side far enough, you'd find an unchecked conversion, therefore no checks
> were necessary.
> Our argument was that the compiler could not trace back that far, since
> that would require all the bodies to be compiled at the same time as the
> specs, therefore the compiler had no business skipping checks at the
> various calls along the way.
> Opinions? (not that it matters now)
It's a little hard to judge without being able to see the code in question,
but ASSUMING it's something like the John McCabe's example...
My opinion would be that you were both right, I mean wrong, I mean... half
right/wrong :-) :-)
I think it's easy to get confused between range constraints (of a subtype)
and validity (of a "representation", i.e. the bit pattern), because both
concepts entail the idea of something being "out of range"... nevertheless,
they're two different concepts.
The vendor's argument (if what you're relating is indeed what they meant)
was bogus, it has nothing to do with "tracing back" anything. But on the
other hand, it is not a matter of "skipping checks", either. Still assuming
this was a case such as exemplified in the John's question, there's no
language-required check, so it's not really "skipping" anything. Since both
the target of the assignment and the expression are of the same subtype,
there is no range check to perform (this is one of the really cool things
about Ada's subtype system, IMHO). The vendor let you suck him in to the
Unchecked_Conversion irrelevancy :-) He should have stuck to talking about
Now suppose, using John McCabe's example, we were to write:
subtype Spring_Month is Month_Type range March .. May;
-- The unchecked conversion (I can't remember the original name cuz
-- I deleted the mail) and an assignment:
Happy : Spring_Month := To_Month_Type (Whatever);
In that example, the assignment *does* have to do a range check.
But here's the kicker... if the representation of the result of the
unchecked conversion is invalid, the language rules do not guarantee that
the above range check will fail! The language doesn't tell the
implementation how to perform the check, it only specifies what a range
check means (for valid representations). The range check is an evaluation
of the value of the object, so in the case of invalid bits we are still
under the rule of 13.9.1(9) -- that is, it's erroneous.