www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 18926] New: Template-related intpromote deprecation message

https://issues.dlang.org/show_bug.cgi?id=18926

          Issue ID: 18926
           Summary: Template-related intpromote deprecation message spam
           Product: D
           Version: D2
          Hardware: x86_64
               URL: http://dlang.org/
                OS: Mac OS X
            Status: NEW
          Severity: normal
          Priority: P3
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: meapineapple gmail.com

I downloaded a newer version of DMD and when I went to compile some code, I got
a LOT of intpromote deprecation errors. Many of them repeated for the same
line, and in one case it was repeated 300+ times for a single line of code.

This is probably because this particular function gets a lot of different
template parameters when running unit tests.

/Users/pineapple/Dropbox/Projects/mach.d/mach/math/bits/inject.d(112):
Deprecation: integral promotion not done for -cast(ubyte)bit, use
'-transition=intpromote' switch or -cast(int)(cast(ubyte)bit)

This was the function causing the error, due to `-(cast(ubyte) bit)`

/// Inject bit into a value where the bit offset is known at compile time.
/// When the `assumezero` template argument is true, the operation is able
/// to be optimized by assuming the targeted bits are all initialized to 0.
auto injectbit(uint offset, bool assumezero = false, T)(
    T value, in bool bit
) if(
    offset < T.sizeof * 8
){
    enum byteoffset = offset / 8;
    enum bitoffset = offset % 8;
    T target = value;
    auto ptr = cast(ubyte*) &target + byteoffset;
    static if(assumezero){
        *ptr |= cast(ubyte) bit << bitoffset;
    }else{
        *ptr ^= (-(cast(ubyte) bit) ^ *ptr) & (1 << bitoffset);
    }
    return target;
}

--
May 31 2018