From: Wolfgang (Blub) Bumiller Date: Mon, 19 Nov 2012 21:27:58 +0000 (+0100) Subject: -frelaxed-switch to enable switch on non-constant cases X-Git-Tag: 0.1.9~390 X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=commitdiff_plain;h=f4043faf0b4963550463a3b81dc38b12c6f5d91f;hp=5c52e817ea157341b5ed5d87609eec5acdfd7a3b -frelaxed-switch to enable switch on non-constant cases --- 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);