'int' is enough for 'length' to migrate code from x86 to x64

Walter Bright via Digitalmars-d digitalmars-d at puremagic.com
Fri Nov 21 11:52:29 PST 2014


On 11/21/2014 11:36 AM, ketmar via Digitalmars-d wrote:
> On Fri, 21 Nov 2014 10:59:13 -0800
> Walter Bright via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>
>> On 11/21/2014 6:03 AM, ketmar via Digitalmars-d wrote:
>>> On Thu, 20 Nov 2014 13:28:37 -0800
>>> Walter Bright via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>>>
>>>> On 11/20/2014 7:52 AM, H. S. Teoh via Digitalmars-d wrote:
>>>>> What *could* be improved, is the prevention of obvious mistakes in
>>>>> *mixing* signed and unsigned types. Right now, D allows code like the
>>>>> following with no warning:
>>>>>
>>>>> 	uint x;
>>>>> 	int y;
>>>>> 	auto z = x - y;
>>>>>
>>>>> BTW, this one is the same in essence as an actual bug that I fixed in
>>>>> druntime earlier this year, so downplaying it as a mistake people make
>>>>> 'cos they confound computer math with math math is fallacious.
>>>>
>>>> What about:
>>>>
>>>>        uint x;
>>>>        auto z = x - 1;
>>>>
>>>> ?
>>>>
>>> here z must be `long`. and for `ulong` compiler must emit error.
>>
>>
>> So, any time an integer literal appears in an unsigned expression, the type of
>> the expression becomes signed?
> nope. only for `auto` expressions.
>

So 'auto' has different type rules for expressions than anywhere else in D?

Consider:

     void foo(T)(T a) { ... }

     if (x - 1) foo(x - 1);
     if (auto a = x - 1) foo(a);

and now foo() is instantiated with a different type?

I'm afraid I can't sell that to anyone :-(


More information about the Digitalmars-d mailing list