[Issue 2809] Wrong constant folding for unsigned shift

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Nov 15 15:07:45 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=2809



--- Comment #4 from Don <clugdbug at yahoo.com.au> 2010-11-15 15:06:34 PST ---
(In reply to comment #3)
> Mr Bs test case is wrong:
> 
> static assert((cast(short)-1 >>> 1) == int.max);
> 
> should be:
> 
> static assert((cast(short)-1 >>> 1) == short.max);

Not so. You might be thinking of this, which _is_ true:
static assert((cast(short)-1 >>> cast(short)1) == short.max);

The problem is that >>> interacts badly with implicit type conversions.
With every other operator,  typeof(short OP int) == int.

Possible solutions are:
(a) special case for >>>
(b) disallow >>> for types smaller than int
(c) drop it from the language
Personally I think (c) is the only option that makes sense.

> unsigned right shift is perfectly well defined,
> though giving it it's own operator seems like overkill.
> 
> I think it would be better as a function in std.intrinsic.

You don't need it at all. Just cast to unsigned, then >>.
>>> is a ridiculous operator.

> You aren't going to use unsigned shift unless you know what you doing and care
> about performance.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list