Hi all,
i'm coding a parametrized crc implementation that can support most of the standards. I want to make it work with CTFE and i stumbled upon a difficulty when using std.bitmanip.nativeToLittleEndian and std.bitmanip.nativeToBigEndian. The code below is the concept used by EndianSwapper and it does not compile because of unions and CTFE. Also as the error message is very obscure, is it intended behaviour or a bug?

module testunionctfe;

import std.traits;

auto f(T)(T data) {
  union DataBytes {
    Unqual!T data;
    ubyte[T.sizeof] bytes;
  };

  DataBytes tmp;
  tmp.data = data;
  return tmp.bytes;
}

void main(){
  auto a = f( 0x01020304 );
enum b = f( 0x01020304 ); //testunionctfe.d(18): Error: uninitialized variable 'data' cannot be returned from CTFE
  assert( a == b );
}

If it is intended behaviour, i think i come up with an alternative implementation for these two functions with shifts and masks to be used only in ctfe(union implementation is faster) when the type is uint and ushort(and maybe ulong), that i will prepare in a pull request.
Otherwise if it is a bug i will file a bugreport instead.

Reply via email to