digitalmars.D.bugs - [Issue 17685] New: DMD 2.060 regression: align is not respected for
- via Digitalmars-d-bugs (42/42) Jul 25 2017 https://issues.dlang.org/show_bug.cgi?id=17685
https://issues.dlang.org/show_bug.cgi?id=17685 Issue ID: 17685 Summary: DMD 2.060 regression: align is not respected for structs Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: regression Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: clugdbug yahoo.com.au Yes, I know this a regression from 5 years ago. But some of us are using compilers from even earlier.... There is a real problem with the behaviour of align(). -------------------- align(1) struct A { align(1): int a; } static assert(A.alignof == 1); // fails, A.alignof is 4 -------------------- In 2.059 and earlier (including D1), that static assert would pass. Note that for a struct which should have the same properties: struct B { ubyte[4] b; } static assert(B.alignof == 1); // ok So the padding is not because of the struct size. The offending commit was made here, with a dreadful commit message: https://github.com/dlang/dmd/commit/20fb83928b12af809798f3fa0247a4d5cdf80e4f Previously in fact this would work even without the outer "align(1)" around the struct. I am not sure what the motivation for that silent breaking language change was, but it does not make any sense to me. It certainly introduces opportunity for subtle, hideous bugs. It's particularly nasty when passing structs to other languages. At the time, there was a bug report on a similar issue which was closed as invalid. https://issues.dlang.org/show_bug.cgi?id=8565 I suspect that was closed rather too hastily. --
Jul 25 2017