On 2025-12-17 02:57, Alejandro Colomar wrote:

If you want something that will (mostly) work, you could check...
        int j(int) [[gnu::aligned(8)]];  // Attributed:  int(int)

I'm puzzled by that "Attribute: int(int)". What does that mean? Intuitively, I would think it would mean that (uintptr_t)j must be a multiple of 8, but that's not what GCC does when I bump the 8 to 128.


        enum d {D} [[gnu::aligned(8)]] y;  // Attributes can't go here

C23 allows this declaration, and the attribute appertains to the enum type (though just for the declaration of y). GCC 15.2 issues a warning that it ignores the attribute, and so disagrees with C23. Although Clang doesn't support [[gnu::aligned(8)]] on types, it issues no diagnostic when I use a type-related attribute that it does support, like this:

  enum d {D} [[clang::annotate_type("x")]] y;

and so perhaps Clang is following C23 here. However, as Aaron notes there are related examples where Clang doesn't seem to follow C23 - and Aaron thinks the C23 standard has a bug in this area.

It's not a big deal (how many programs will do this sort of thing?) but either the C standard should be fixed (i.e., complicated) to allow the behavior of GCC and Clang (whatever those behaviors happen to be), or GCC and Clang should be fixed to conform to C23.



Reply via email to