www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 3147] New: Incorrect value range propagation for addition

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147

           Summary: Incorrect value range propagation for addition
           Product: D
           Version: unspecified
          Platform: Other
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: andrei metalanguage.com


This code doesn't compile and it should:

void main()
{
    byte x, y, z;
    short a = x+y;
}

Although the manifest type of x+y is int, the actual range of x+y, regardless
of the values of x and y, is -byte.min-byte.min to byte.max+byte.max. That
range fits properly in a short so the compiler should let the code go through.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jul 06 2009
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147


Rob Jacques <sandford jhu.edu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |sandford jhu.edu




--- Comment #1 from Rob Jacques <sandford jhu.edu>  2009-07-07 08:07:25 PDT ---
Additionally, propagation doesn't work for
byte, ubyte, bool and char.
for operations + * - / % >>

Also
    byte x,y;
    short z;
    z = x<<1; // Error: cannot implicitly convert expression (cast(int)x << 1)
of type int to byte
    z = x << y; // compiles


    // Repeat for >>>

Also
    ubyte x,y=10;
    ubyte z;
    z = -y;  // compiles

Inconsistancies:
    byte x,y;
    short z;
    z += x; //compiles, z = z + x doesn't
    x += y; //compiles, x = x + y doesn't
    x++;    //compiles, x = x+1, doesn't
    ++x;    //compiles, x = x+1, doesn't
    x = x + 1; // Error: cannot implicitly convert expression (cast(int)x + 1)
of type int to byte

    // Again repeat for the other operations/type combos

also
   byte[] x, y, z;
   z[] = x[] * z[]; //compiles
   // repeat for other array operation and type combos

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jul 07 2009
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147



--- Comment #2 from Sobirari Muhomori <dfj1esp02 sneakemail.com> 2010-11-16
13:40:52 PST ---
Some asserts for modulus and shifts
---
byte b;
short s;
int i;
long l;
static assert(is(typeof(s%b)==byte));
static assert(is(typeof(i%s)==short));
static assert(is(typeof(b<<b)==int));
static assert(is(typeof(b>>i)==byte));
static assert(is(typeof(b>>>b)==byte));
static assert(is(typeof(b>>l)==byte));
---

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 16 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147



--- Comment #3 from Andrei Alexandrescu <andrei metalanguage.com> 2010-11-16
13:54:16 PST ---
The point is not to ascribe the smallest static type to the result. That would
break compatibility with C in many ways. All that happens is the compiler
tracks the range of the expression statically while using the same typing rules
as C.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 16 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147



--- Comment #4 from Sobirari Muhomori <dfj1esp02 sneakemail.com> 2010-11-16
14:01:34 PST ---
---
l = cast(int)(s%b);
l = cast(short)(s%b);
---
What's the difference?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 16 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147



--- Comment #5 from Sobirari Muhomori <dfj1esp02 sneakemail.com> 2010-11-16
14:22:01 PST ---
In any case
---
static if(__traits(compiles, s=b+b))
{
    static assert(__traits(compiles, b=s%b));
    static assert(__traits(compiles, s=s>>b));
    static assert(__traits(compiles, s=s>>>b));
}
---

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 16 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3147



--- Comment #6 from Sobirari Muhomori <dfj1esp02 sneakemail.com> 2010-11-16
22:03:08 PST ---
There should be ints in shift asserts
---
static if(__traits(compiles, s=b+b))
{
    static assert(__traits(compiles, b=i%b));
    static assert(__traits(compiles, b=b>>i));
    static assert(__traits(compiles, b=b>>>i));
}
---

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