diff --git a/src/cc65/declare.c b/src/cc65/declare.c index 59eb555c4..80be9ceb7 100644 --- a/src/cc65/declare.c +++ b/src/cc65/declare.c @@ -515,6 +515,13 @@ static void CheckArrayElementType (Type* DataType) if (!IsTypeVoid (T) || IS_Get (&Standard) != STD_CC65) { Error ("Array of 0-size element type '%s'", GetFullTypeName (T)); } + } else { + if (IsTypeStruct (T)) { + SymEntry* TagEntry = GetESUTagSym (T); + if (TagEntry && SymHasFlexibleArrayMember (TagEntry)) { + Error ("Invalid use of struct with flexible array member"); + } + } } } else { ++T; @@ -1193,6 +1200,9 @@ static SymEntry* ParseStructSpec (const char* Name, unsigned* DSFlags) if (TagEntry && SymHasFlexibleArrayMember (TagEntry)) { Field->Flags |= SC_HAVEFAM; Flags |= SC_HAVEFAM; + if (IsTypeStruct (Decl.Type)) { + Error ("Invalid use of struct with flexible array member"); + } } } diff --git a/test/err/bug2016-fam-member.c b/test/err/bug2016-fam-member.c new file mode 100644 index 000000000..02c9ec275 --- /dev/null +++ b/test/err/bug2016-fam-member.c @@ -0,0 +1,11 @@ +/* Bug #2016 - cc65 erroneously allows struct fields that are structs with flexible array members */ + +typedef struct x { + int a; + int b[]; /* Ok: Flexible array member can be last */ +} x; + +struct y { + x x; /* Not ok: Contains flexible array member */ + int a; +}; diff --git a/test/err/bug2017-fam-element.c b/test/err/bug2017-fam-element.c new file mode 100644 index 000000000..195ca6597 --- /dev/null +++ b/test/err/bug2017-fam-element.c @@ -0,0 +1,9 @@ +/* Bug #2017 - cc65 erroneously allows arrays of structs with flexible array members */ + +struct z { + int a; + int c; + int b[]; +}; + +struct z y[3]; /* Should be an error */