aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-01-29 22:28:33 -0500
committerAndrew Kelley <andrew@ziglang.org>2019-01-29 22:29:56 -0500
commit9c328b42916d463465b134457c7f13b5c65da406 (patch)
treea7c7a12ffcfe140c5912a09d742aa62180508536 /src/parser.cpp
parent5bf9ffdc5be02e67b57fe9398ad9d13147bfb0c8 (diff)
downloadzig-9c328b42916d463465b134457c7f13b5c65da406.tar.gz
zig-9c328b42916d463465b134457c7f13b5c65da406.zip
simpler implementation of `&&` and `||` hints
This accomplishes the same goal, but with less changes, so that I can backport copy elision stuff easier.
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp35
1 files changed, 6 insertions, 29 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 9425df2430..077365995e 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -122,37 +122,19 @@ static AstNode *ast_parse_container_decl_type(ParseContext *pc);
static AstNode *ast_parse_byte_align(ParseContext *pc);
ATTRIBUTE_PRINTF(3, 4)
-static ErrorMsg *ast_error(ParseContext *pc, Token *token, const char *format, ...) {
- va_list ap;
- va_start(ap, format);
- Buf *msg = buf_vprintf(format, ap);
- va_end(ap);
-
- ErrorMsg *err = err_msg_create_with_line(pc->owner->path, token->start_line, token->start_column,
- pc->owner->source_code, pc->owner->line_offsets, msg);
- err->line_start = token->start_line;
- err->column_start = token->start_column;
-
- return err;
-}
-
-ATTRIBUTE_PRINTF(4, 5)
ATTRIBUTE_NORETURN
-static void ast_error_exit(ParseContext *pc, Token *token, ErrorMsg *note, const char *format, ...) {
+static void ast_error(ParseContext *pc, Token *token, const char *format, ...) {
va_list ap;
va_start(ap, format);
Buf *msg = buf_vprintf(format, ap);
va_end(ap);
+
ErrorMsg *err = err_msg_create_with_line(pc->owner->path, token->start_line, token->start_column,
pc->owner->source_code, pc->owner->line_offsets, msg);
err->line_start = token->start_line;
err->column_start = token->start_column;
- if (note) {
- err->notes.append(note);
- }
-
print_err_msg(err, pc->err_color);
exit(EXIT_FAILURE);
}
@@ -182,7 +164,7 @@ static Buf ast_token_str(Buf *input, Token *token) {
ATTRIBUTE_NORETURN
static void ast_invalid_token_error(ParseContext *pc, Token *token) {
Buf token_value = ast_token_str(pc->buf, token);
- ast_error_exit(pc, token, NULL, "invalid token: '%s'", buf_ptr(&token_value));
+ ast_error(pc, token, "invalid token: '%s'", buf_ptr(&token_value));
}
static AstNode *ast_create_node_no_line_info(ParseContext *pc, NodeType type) {
@@ -232,13 +214,8 @@ static Token *eat_token_if(ParseContext *pc, TokenId id) {
static Token *expect_token(ParseContext *pc, TokenId id) {
Token *res = eat_token(pc);
- if (res->id != id) {
- ErrorMsg *note = NULL;
- if (res->id == TokenIdAmpersandAmpersand) {
- note = ast_error(pc, res, "did you mean to use `and`?");
- }
- ast_error_exit(pc, res, note, "expected token '%s', found '%s'", token_name(id), token_name(res->id));
- }
+ if (res->id != id)
+ ast_error(pc, res, "expected token '%s', found '%s'", token_name(id), token_name(res->id));
return res;
}
@@ -860,7 +837,7 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc) {
if (param_decl->data.param_decl.is_var_args)
res->data.fn_proto.is_var_args = true;
if (i != params.length - 1 && res->data.fn_proto.is_var_args)
- ast_error_exit(pc, first, NULL, "Function prototype have varargs as a none last paramter.");
+ ast_error(pc, first, "Function prototype have varargs as a none last paramter.");
}
return res;
}