[Issue 1977] Relax warnings for implicit narrowing conversions caused by promotions
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Nov 22 10:51:34 PST 2008
http://d.puremagic.com/issues/show_bug.cgi?id=1977
------- Comment #11 from andrei at metalanguage.com 2008-11-22 12:51 -------
(In reply to comment #9)
> (In reply to comment #8)
> > The plan is to have sensible bitwise operations preserve the size of their
> > operands. Only arithmetic and shift will "spill" into larger types.
> >
>
> I hope you mean only *left* shift will spill into a larger type.
Correct. So let's recap a possible set of rules:
(a) Operations will yield the statically tightest type possible, but never
smaller than the largest of the two operands.
(b) However, (a) will not cause automatic promotion from 32-bit to 64-bit,
i.e., unless at least one operand is 64-bit, the result will never be 64-bit.
(c) (Not yet implemented) If one operand's value is statically-known, further
tightening without a cast is possible, e.g.:
uint a = ...;
byte b = a & 1; // pass, no cast needed
(d) (Not yet implemented, open-ended) Even if operand values are not statically
known, their possible range is computed statically in a flow-insensitive manner
and used for validation, e.g.:
uint a = 4;
if (condition) a = 200;
// a is not in range [4, 200]
ubyte x = a & 200; // pass
====
The "but never smaller than the largest of the two operands" is meant to avoid
surprises of the following sort:
uint a = ...;
auto b = a & 1;
// how do you mean b is ubyte?!?
However, notice that due to (c), explicitly asking for a byte does work.
--
More information about the Digitalmars-d-bugs
mailing list