[PATCH] D123649: Allow flexible array initialization in C++.

Akira Hatanaka via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 18 16:53:09 PDT 2022


ahatanak added inline comments.


================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:4639
+          getDataLayout().getTypeAllocSize(Init->getType()));
+      assert(VarSize == CstSize && "Emitted constant has unexpected size");
+#endif
----------------
efriedma wrote:
> ahatanak wrote:
> > This assertion fails when the following code is compiled:
> > 
> > 
> > ```
> > typedef unsigned char uint8_t;
> > typedef uint8_t uint8_a16 __attribute__((aligned(16)));
> > 
> > void foo1() {
> >   static const uint8_a16 array1[] = { 1 };
> > }
> > ```
> `sizeof(uint8_a16[1])` is 16, but we currently emit a one-byte global.  So it seems like there's an underlying bug exposed by the assertion.
> 
> gcc thinks this is nonsense, and just prints an error.
It seems to me that we should disallow arrays that have an element whose alignment is larger than its size, just as gcc does.

But I see arrays like that declared in a couple of clang's regression tests (e.g., `Sema/attr-aligned.c`). I'm not sure whether there was a reason for not rejecting it or it was just an oversight.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D123649/new/

https://reviews.llvm.org/D123649



More information about the cfe-commits mailing list