Added a bit_flags attribute to enum declarations that 1<<N every value.

Change-Id: Ib9ec0cb3ddec60b1ca124eaf815fb1ae0cc53e1c
Tested: on Windows and Linux
Bug: 16186562
This commit is contained in:
Wouter van Oortmerssen
2014-07-17 15:12:37 -07:00
parent bd86bf60ec
commit 127d35085a
11 changed files with 40 additions and 24 deletions

View File

@@ -629,10 +629,10 @@ void Parser::ParseEnum(bool is_union) {
std::string dc = doc_comment_;
Expect(kTokenIdentifier);
auto prevsize = enum_def.vals.vec.size();
auto &ev = *new EnumVal(name, static_cast<int>(
enum_def.vals.vec.size()
? enum_def.vals.vec.back()->value + 1
: 0));
auto value = enum_def.vals.vec.size()
? enum_def.vals.vec.back()->value + 1
: 0;
auto &ev = *new EnumVal(name, value);
if (enum_def.vals.Add(name, &ev))
Error("enum value already exists: " + name);
ev.doc_comment = dc;
@@ -647,6 +647,15 @@ void Parser::ParseEnum(bool is_union) {
}
} while (IsNext(','));
Expect('}');
if (enum_def.attributes.Lookup("bit_flags")) {
for (auto it = enum_def.vals.vec.begin(); it != enum_def.vals.vec.end();
++it) {
if (static_cast<size_t>((*it)->value) >=
SizeOf(enum_def.underlying_type.base_type) * 8)
Error("bit flag out of range of underlying integral type");
(*it)->value = 1 << (*it)->value;
}
}
}
void Parser::ParseDecl() {