...that had been introduced with (since reverted) https://github.com/llvm/llvm-project/commit/886715af962de2c92fac4bd37104450345711e4a "[clang] Introduce -fstrict-flex-arrays=<n> for stricter handling of flexible arrays", and caused issues in the wild:
For one, the HarfBuzz project has various "fake" flexible array members of the form
Type arrayZ[HB_VAR_ARRAY];
in https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-open-type.hh, where HB_VAR_ARRAY is a macro defined as
#ifndef HB_VAR_ARRAY #define HB_VAR_ARRAY 1 #endif
in https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-machinery.hh.
For another, the Firebird project in https://github.com/FirebirdSQL/firebird/blob/master/src/lock/lock_proto.h uses a trailing member
srq lhb_hash[1]; // Hash table
as a "fake" flexible array, but declared in a
struct lhb : public Firebird::MemoryHeader
that is not a standard-layout class (because the Firebird::MemoryHeader base class also declares non-static data members).
(Checking for the second case required changing the test file from C to C++.)
Another C++-specific behavior: if the bound results from the substitution of a template parameter, event if its value is 1 it's currently not considered a FAM