January 05, 2022 [Issue 22652] New: importC: Braceless initializer of nested struct is rejected. | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=22652 Issue ID: 22652 Summary: importC: Braceless initializer of nested struct is rejected. Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: dave287091@gmail.com Consider the following C program: // s.c struct S1 { int x, y; }; struct S2 { struct S1 s; }; int printf(const char*, ...); int main(void){ int x = {1}; struct S1 a = {0}; // ok struct S2 b = {{0}}; // ok struct S2 c = {1}; // Error: cannot implicitly convert expression `1` of type `int` to `S1` struct S2 c2 = {1, 2}; // Error: cannot implicitly convert expression `1` of type `int` to `S1` struct S1 d[2] = {1, 2}; // Error: variable `s.main.d` is not a static and cannot have static initializer struct S1 e[] = {3, 4}; // Error: variable `s.main.e` is not a static and cannot have static initializer printf("%d,%d\n", b.s.x, b.s.y); // should print 0, 0 printf("%d,%d\n", c.s.x, c.s.y); // should print 1, 0 printf("%d,%d\n", c2.s.x, c2.s.y); // should print 1, 2 printf("%d,%d\n", d[0].x, d[0].y); // should print 1, 2 printf("%d,%d\n", d[1].x, d[1].y); // should print 0, 0 printf("%zu\n", sizeof(e) / sizeof(e[0])); // should print 1 printf("%d,%d\n", e[0].x, e[0].y); // should print 3, 4 return 0; } C11 does not require braces. Clauses 20 and 21 of 6.7.9 Initialization address what should be done. "variable `s.main.d` is not a static and cannot have static initializer” is also a weird error message in this case. -- |
Copyright © 1999-2021 by the D Language Foundation