June 07, 2019 [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. | ||||
---|---|---|---|---|
| ||||
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@puremagic.com Reporter: n8sh.secondary@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. } ``` -- |
Copyright © 1999-2021 by the D Language Foundation