mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-03 12:21:23 +00:00
Disallowed 0 byte structs.
This is because they are incompatible with C++ and possibly other languages that make them minimum size 1 (to make sure multiple such objects don't reside at the same address). Forcing them to size 1 was also not practical, as that is requires updating the logic of a lot of implementations and thus possibly backwards incompatible. More here: https://github.com/google/flatbuffers/issues/4122 Change-Id: I2bfdc8597b7cfd2235bb4074bb2ae06f81f8e57d
This commit is contained in:
@@ -1778,21 +1778,24 @@ CheckedError Parser::ParseDecl() {
|
||||
EXPECT('{');
|
||||
while (token_ != '}') ECHECK(ParseField(*struct_def));
|
||||
auto force_align = struct_def->attributes.Lookup("force_align");
|
||||
if (fixed && force_align) {
|
||||
auto align = static_cast<size_t>(atoi(force_align->constant.c_str()));
|
||||
if (force_align->type.base_type != BASE_TYPE_INT ||
|
||||
align < struct_def->minalign || align > FLATBUFFERS_MAX_ALIGNMENT ||
|
||||
align & (align - 1))
|
||||
return Error(
|
||||
"force_align must be a power of two integer ranging from the"
|
||||
"struct\'s natural alignment to " +
|
||||
NumToString(FLATBUFFERS_MAX_ALIGNMENT));
|
||||
struct_def->minalign = align;
|
||||
if (fixed) {
|
||||
if (force_align) {
|
||||
auto align = static_cast<size_t>(atoi(force_align->constant.c_str()));
|
||||
if (force_align->type.base_type != BASE_TYPE_INT ||
|
||||
align < struct_def->minalign || align > FLATBUFFERS_MAX_ALIGNMENT ||
|
||||
align & (align - 1))
|
||||
return Error(
|
||||
"force_align must be a power of two integer ranging from the"
|
||||
"struct\'s natural alignment to " +
|
||||
NumToString(FLATBUFFERS_MAX_ALIGNMENT));
|
||||
struct_def->minalign = align;
|
||||
}
|
||||
if (!struct_def->bytesize) return Error("size 0 structs not allowed");
|
||||
}
|
||||
struct_def->PadLastField(struct_def->minalign);
|
||||
// Check if this is a table that has manual id assignments
|
||||
auto &fields = struct_def->fields.vec;
|
||||
if (!struct_def->fixed && fields.size()) {
|
||||
if (!fixed && fields.size()) {
|
||||
size_t num_id_fields = 0;
|
||||
for (auto it = fields.begin(); it != fields.end(); ++it) {
|
||||
if ((*it)->attributes.Lookup("id")) num_id_fields++;
|
||||
|
||||
Reference in New Issue
Block a user