In the following code, the first element is aligned on a 16-byte boundary, but the remaining elements aren't:
typedef char int8_a16 __attribute__((aligned(16))); int8_a16 array[4];
Currently clang doesn't reject the code, but it should since it can cause crashes at runtime. This patch also fixes assertion failures in CodeGen caused by the changes in https://reviews.llvm.org/D123649.
I think you need to check that the size is a multiple of the alignment, not just larger than the alignment. (Those are only the same thing if the size is a power of two; it looks like you don't have any test coverage for non-power-of-two sizes.)