在 2018-08-30 01:36, Nathan Sidwell 写道:
But, it would be bad to make that particular ABI fix in a point release, so this patch just reverts the regression I caused.  Sadly, because it requires understanding TEMPLATE_DECL, we can't simply update place_field.  Instead I temporarily stitch out undesired DECLs around the call to place_field.  This seems the least intrusive, and happens only when ms_bitfield_layout_p is in effect.



It is strictly an ABI break but I doubt whether code in real world that got broken by this bug ever exists. Usually when people expect consecutive bitfields to be packed into a single word they wouldn't put irrelevant declarations between them.

An important reason why such code could be rare is that the following code compiles differently as C and C++:

```
E:\Desktop>cat test.cc
#include <stdio.h>

struct foo
  {
    unsigned a : 21;
    union x1 { char x; };
    unsigned b : 11;
    union x1 u;
  };

struct bar
  {
    union x2 { char x; };
    unsigned a : 21;
    unsigned b : 11;
    union x2 u;
  };

int main(void)
  {
    printf("%d\n", (int)sizeof(struct foo));
    printf("%d\n", (int)sizeof(struct bar));
  }
```

When compiled as C the output is:
```
E:\Desktop>cl /nologo /Tctest.cc /Fe:a.exe && a.exe
test.cc
16
12
```

while as C++ the output is:
```
E:\Desktop>cl /nologo /Tptest.cc /Fe:a.exe && a.exe
test.cc
8
8
```

Basing on the fact that such code is rare I think it should be safe to trade tolerance (or 'compatibility for this bug') for the correct behavior.


--
Best regards,
LH_Mouse

Reply via email to