summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-06-25 01:14:26 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-06-25 01:14:26 +0900
commit3d8705dcfdd567278c833c252ea11c018c0d3890 (patch)
tree03cfb2e8bc1e37bb1dc51079355c8e7e5bf780df /parse.y
parent419b0596a2ada720ae1b3f2c1bd3ab5e12819ac8 (diff)
Drop token info for endless method definition
Because it does not have closing `end`.
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y23
1 files changed, 23 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 1ab2136711..e580f7f78e 100644
--- a/parse.y
+++ b/parse.y
@@ -1053,6 +1053,7 @@ static void token_info_setup(token_info *ptinfo, const char *ptr, const rb_code_
static void token_info_push(struct parser_params*, const char *token, const rb_code_location_t *loc);
static void token_info_pop(struct parser_params*, const char *token, const rb_code_location_t *loc);
static void token_info_warn(struct parser_params *p, const char *token, token_info *ptinfo_beg, int same, const rb_code_location_t *loc);
+static void token_info_drop(struct parser_params *p, const char *token, rb_code_position_t beg_pos);
#define WARN_EOL(tok) \
(looking_at_eol_p(p) ? \
@@ -2493,6 +2494,7 @@ arg : lhs '=' arg_rhs
}
| defn_head f_paren_args '=' arg
{
+ token_info_drop(p, "def", @1.beg_pos);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
$$ = set_defun_body(p, $1, $2, $4, &@$);
@@ -2502,6 +2504,7 @@ arg : lhs '=' arg_rhs
}
| defn_head f_paren_args '=' arg modifier_rescue arg
{
+ token_info_drop(p, "def", @1.beg_pos);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
$4 = rescued_expr(p, $4, $6, &@4, &@5, &@6);
@@ -5767,6 +5770,26 @@ token_info_pop(struct parser_params *p, const char *token, const rb_code_locatio
}
static void
+token_info_drop(struct parser_params *p, const char *token, rb_code_position_t beg_pos)
+{
+ token_info *ptinfo_beg = p->token_info;
+
+ if (!ptinfo_beg) return;
+ p->token_info = ptinfo_beg->next;
+
+ if (ptinfo_beg->beg.lineno != beg_pos.lineno ||
+ ptinfo_beg->beg.column != beg_pos.column ||
+ strcmp(ptinfo_beg->token, token)) {
+ compile_error(p, "token position mismatch: %d:%d:%s expected but %d:%d:%s",
+ beg_pos.lineno, beg_pos.column, token,
+ ptinfo_beg->beg.lineno, ptinfo_beg->beg.column,
+ ptinfo_beg->token);
+ }
+
+ ruby_sized_xfree(ptinfo_beg, sizeof(*ptinfo_beg));
+}
+
+static void
token_info_warn(struct parser_params *p, const char *token, token_info *ptinfo_beg, int same, const rb_code_location_t *loc)
{
token_info ptinfo_end_body, *ptinfo_end = &ptinfo_end_body;