From f4043faf0b4963550463a3b81dc38b12c6f5d91f Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Mon, 19 Nov 2012 22:27:58 +0100 Subject: [PATCH 1/1] -frelaxed-switch to enable switch on non-constant cases --- opts.def | 1 + parser.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/opts.def b/opts.def index 9b64833..705eb0c 100644 --- a/opts.def +++ b/opts.def @@ -32,6 +32,7 @@ GMQCC_DEFINE_FLAG(OMIT_NULL_BYTES) GMQCC_DEFINE_FLAG(ADJUST_VECTOR_FIELDS) GMQCC_DEFINE_FLAG(FTEPP) + GMQCC_DEFINE_FLAG(RELAXED_SWITCH) #endif /* warning flags */ diff --git a/parser.c b/parser.c index b45fe62..99b7eb7 100644 --- a/parser.c +++ b/parser.c @@ -1741,6 +1741,7 @@ static bool parse_break_continue(parser_t *parser, ast_block *block, ast_express static bool parse_switch(parser_t *parser, ast_block *block, ast_expression **out) { ast_expression *operand; + ast_value *opval; ast_switch *switchnode; ast_switch_case swcase; @@ -1762,6 +1763,15 @@ static bool parse_switch(parser_t *parser, ast_block *block, ast_expression **ou if (!operand) return false; + if (!OPTS_FLAG(RELAXED_SWITCH)) { + opval = (ast_value*)operand; + if (!ast_istype(operand, ast_value) || !opval->isconst) { + parseerror(parser, "case on non-constant values need to be explicitly enabled via -frelaxed-switch"); + ast_unref(operand); + return false; + } + } + switchnode = ast_switch_new(ctx, operand); /* closing paren */ @@ -1988,9 +1998,11 @@ static bool GMQCC_WARN parser_pop_local(parser_t *parser) varentry_t *ve; ve = &vec_last(parser->locals); - if (ast_istype(ve->var, ast_value) && !(((ast_value*)(ve->var))->uses)) { - if (parsewarning(parser, WARN_UNUSED_VARIABLE, "unused variable: `%s`", ve->name)) - rv = false; + if (!parser->errors) { + if (ast_istype(ve->var, ast_value) && !(((ast_value*)(ve->var))->uses)) { + if (parsewarning(parser, WARN_UNUSED_VARIABLE, "unused variable: `%s`", ve->name)) + rv = false; + } } mem_d(ve->name); vec_pop(parser->locals); -- 2.39.2