aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-02-17 11:54:08 +0000
committergingerBill <bill@gingerbill.org>2018-02-17 11:54:08 +0000
commitc4d2d287fc0eac7348951ce275a1f3d80f25ef3d (patch)
treee082b0f1d744689ced0cdab73dd405981cacbf3a /src/parser.cpp
parent6a85546b761b67fa012a2cd49e32b2211bf02971 (diff)
#complete switch; Removal of dyncall
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 8dd5d6d30..2643fb2b3 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -375,6 +375,17 @@ void error(AstNode *node, char *fmt, ...) {
va_end(va);
}
+void error_no_newline(AstNode *node, char *fmt, ...) {
+ Token token = {};
+ if (node != nullptr) {
+ token = ast_node_token(node);
+ }
+ va_list va;
+ va_start(va, fmt);
+ error_no_newline_va(token, fmt, va);
+ va_end(va);
+}
+
void warning(AstNode *node, char *fmt, ...) {
va_list va;
va_start(va, fmt);
@@ -3700,6 +3711,20 @@ AstNode *parse_stmt(AstFile *f) {
syntax_error(token, "#bounds_check and #no_bounds_check cannot be applied together");
}
return s;
+ } else if (tag == "complete") {
+ s = parse_stmt(f);
+ switch (s->kind) {
+ case AstNode_SwitchStmt:
+ s->SwitchStmt.complete = true;
+ break;
+ case AstNode_TypeSwitchStmt:
+ s->TypeSwitchStmt.complete = true;
+ break;
+ default:
+ syntax_error(token, "#complete can only be applied to a switch statement");
+ break;
+ }
+ return s;
}
if (tag == "include") {