[Issue 19946] New: In betterC filling an array with a non-zero value fails for types of size > 1 due to missing _memset16/_memset32/etc.
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Jun 7 08:59:48 UTC 2019
https://issues.dlang.org/show_bug.cgi?id=19946
Issue ID: 19946
Summary: In betterC filling an array with a non-zero value
fails for types of size > 1 due to missing
_memset16/_memset32/etc.
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: n8sh.secondary at hotmail.com
Example of code that doesn't work:
```d
extern(C) void main()
{
alias int3 = int[3];
union U { ulong a = 1; uint[3] b; }
// Can't set entire array slice to non-zero value unless type is size 1.
{ ushort[] a; a[] = 1; } //error: undefined reference to '_memset16'
{ int[] a; a[] = 1; } //error: undefined reference to '_memset32'
{ ulong[] a; a[] = 1; } //error: undefined reference to '_memset64'
{ float[] a; a[] = 1; } //error: undefined reference to '_memsetFloat'
{ double[] a; a[] = 1; } //error: undefined reference to '_memsetDouble'
{ cdouble[] a; a[] = cdouble.max; } //error: undefined reference to
'_memset128'
{ creal[] a; a[] = creal.max; } //error: undefined reference to
'_memset160'
{ int3[] a; int3 val = [1, 2, 3]; a[] = val; } //error: undefined reference
to '_memsetn'
{ U[] a; a[] = U.init; } //error: undefined reference to '_memset128ii'
// Can't give all members of static array non-zero initial value unless
type is size 1.
{ ushort[4] a = 1; } //error: undefined reference to '_memset16'
{ int[4] a = 1; } //error: undefined reference to '_memset32'
{ ulong[4] a = 1; } //error: undefined reference to '_memset64'
{ float[4] a = 1; } //error: undefined reference to '_memsetFloat'
{ double[4] a = 1; } //error: undefined reference to '_memsetDouble'
{ cdouble[4] a = cdouble.max; } //error: undefined reference to
'_memset128'
{ creal[4] a = creal.max; } //error: undefined reference to '_memset160'
{ U[4] a = U.init; } //error: undefined reference to '_memset128ii'
// Static arrays of types with non-zero init also fail if not explicitly
initialized.
{ wchar[4] a; } //error: undefined reference to '_memset16'
{ float[4] a; } //error: undefined reference to '_memsetFloat'
{ double[4] a; } //error: undefined reference to '_memsetDouble'
{ real[4] a; } //error: undefined reference to '_memset80'
{ cdouble[4] a; } //error: undefined reference to '_memset128'
{ creal[4] a; } //error: undefined reference to '_memset160'
{ U[4] a; } //error: undefined reference to '_memset128ii'
// Static arrays of scalars wider than 8 bytes can't even be explicitly
initialized as zero.
{ real[4] a = 0; } //error: undefined reference to '_memset80'
{ cdouble[4] a = 0+0i; } //error: undefined reference to '_memset128'
{ creal[4] a = 0+0i; } //error: undefined reference to '_memset160'
{ U[4] a = U(0); } //error: undefined reference to '_memset128ii'
// Sometimes there is trouble even when individually specifying each
element of the array.
{ int[4] a = [1, 1, 1, 1]; } //error: undefined reference to '_memset32'
{ int[4] a = [1, 2, 3, 4]; } //Works because compiler doesn't try to use
memset-alike.
// These work.
{ char[10] a; } //Works because ubyte.sizeof == 1 so it can use memset.
{ wchar[2] a = [0x1234, 0x5678]; a[] = 0; } //Works because the compiler
realizes that it can use memset to zero the bits of a type regardless of its
width.
}
```
--
More information about the Digitalmars-d-bugs
mailing list