-frelaxed-switch to enable switch on non-constant cases

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-11-19 22:27:58 +01:00
parent 5c52e817ea
commit f4043faf0b
2 changed files with 16 additions and 3 deletions

View file

@ -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 */

View file

@ -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);