digitalmars.D.bugs - [Issue 23054] New: importC: struct compound-literal assigned by
- d-bugmail puremagic.com (71/71) Apr 24 2022 https://issues.dlang.org/show_bug.cgi?id=23054
https://issues.dlang.org/show_bug.cgi?id=23054 Issue ID: 23054 Summary: importC: struct compound-literal assigned by pointer has wrong storage duration Product: D Version: D2 Hardware: All OS: All Status: NEW Keywords: ImportC, wrong-code Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: duser neet.fi CC: duser neet.fi test program: struct S { int x; }; int test1(int x) { // compile error because it's static (but currently this segfaults when compiling) // using a local variable assigned to x, it gives "Error: non-constant expression `y = x`" struct S *b = &(struct S){x}; return 0; } int test2(int x) { struct S *s = &(struct S){0}; s->x = x; if (x != 0) { test2(0); // detect if it's static instead of automatic // the recursive call shouldn't have affected this copy if (s->x != x) return 2; } return 0; } int test3(void) { // detect if it's GC instead of static or automatic // this is true in CTFE void *prev; for (int i = 0; i < 2; i++) { void *curr = &(struct S){0}; // should have the same address on both loop iterations if (i == 0) prev = curr; else if (curr != prev) return 3; } return 0; } _Static_assert(test1(1) == 0, "1"); _Static_assert(test2(1) == 0, "2"); _Static_assert(test3() == 0, "3"); // fails int main() { int rv; if (rv = test1(1)) return rv; // function fails to compile if (rv = test2(1)) return rv; // fails if (rv = test3()) return rv; return 0; } "&(struct S){0}" here should work like taking the address of a local variable outside CTFE, it works like a static variable, in CTFE it's allocated using GC (which is also wrong) --
Apr 24 2022