aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-08-17 15:11:41 +0100
committergingerBill <bill@gingerbill.org>2018-08-17 15:11:41 +0100
commitb216e44870b1883cf3fb71994eb94f642fea43a1 (patch)
tree35deeadee9a5d2c5c0d7fe74d4d874385ce68897 /src/parser.cpp
parent7d39b26cf4537943ecd668777d830dfa8579edbe (diff)
Add underlying type for `bit_set`
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 94d87ecee..cce1729c1 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -347,7 +347,8 @@ Ast *clone_ast(Ast *node) {
n->BitFieldType.align = clone_ast(n->BitFieldType.align);
break;
case Ast_BitSetType:
- n->BitSetType.base = clone_ast(n->BitSetType.base);
+ n->BitSetType.elem = clone_ast(n->BitSetType.elem);
+ n->BitSetType.underlying = clone_ast(n->BitSetType.underlying);
break;
case Ast_MapType:
n->MapType.count = clone_ast(n->MapType.count);
@@ -927,10 +928,11 @@ Ast *ast_bit_field_type(AstFile *f, Token token, Array<Ast *> fields, Ast *align
return result;
}
-Ast *ast_bit_set_type(AstFile *f, Token token, Ast *base) {
+Ast *ast_bit_set_type(AstFile *f, Token token, Ast *elem, Ast *underlying) {
Ast *result = alloc_ast_node(f, Ast_BitSetType);
result->BitSetType.token = token;
- result->BitSetType.base = base;
+ result->BitSetType.elem = elem;
+ result->BitSetType.underlying = underlying;
return result;
}
@@ -1963,14 +1965,20 @@ Ast *parse_operand(AstFile *f, bool lhs) {
Token token = expect_token(f, Token_bit_set);
Token open = expect_token(f, Token_OpenBracket);
+ Ast *elem = nullptr;
+ Ast *underlying = nullptr;
+
bool prev_allow_range = f->allow_range;
f->allow_range = true;
- Ast *base = parse_expr(f, false);
+ elem = parse_expr(f, false);
f->allow_range = prev_allow_range;
+ if (allow_token(f, Token_Semicolon)) {
+ underlying = parse_type(f);
+ }
Token close = expect_token(f, Token_CloseBracket);
- return ast_bit_set_type(f, token, base);
+ return ast_bit_set_type(f, token, elem, underlying);
}
default: {