digitalmars.D.bugs - [Issue 22326] New: ImportC: struct with flexible array member is
- d-bugmail puremagic.com (38/38) Sep 20 2021 https://issues.dlang.org/show_bug.cgi?id=22326
https://issues.dlang.org/show_bug.cgi?id=22326 Issue ID: 22326 Summary: ImportC: struct with flexible array member is incorrectly handled Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: major Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: dave287091 gmail.com C11 states: As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. Consider the following C program: struct S { char c; int x[]; // flexible array member }; int printf(const char*, ...); int main(){ _Alignas(int) char buff[sizeof(struct S) + sizeof(int[8])]; struct S* s = (struct S*)buff; printf("%zu\n", sizeof(buff)); // prints 56, should print 36 on 64 bit printf("%zu\n", sizeof(struct S)); // should print 4, prints 24 on 64bit. for(int i = 0; i < 8; i++) s->x[i] = i; // program segfaults here return 0; } I have to compile with -betterC to get it to compile at all (errors with Error: `tupleof` is not a member of `const(S)`, Error: invalid `foreach` aggregate `_error_` without it). When it does compile, it gives incorrect results. I’m guessing it is treating it as a D dynamic array (which would explain the incorrect size). --
Sep 20 2021