qcint memberof;
} parser_t;
+#define CV_NONE 0
+#define CV_CONST 1
+#define CV_VAR -1
+
static void parser_enterblock(parser_t *parser);
static bool parser_leaveblock(parser_t *parser);
static void parser_addlocal(parser_t *parser, const char *name, ast_expression *e);
static bool parse_typedef(parser_t *parser);
-static bool parse_variable(parser_t *parser, ast_block *localblock, bool nofields, bool is_const, ast_value *cached_typedef);
+static bool parse_variable(parser_t *parser, ast_block *localblock, bool nofields, int is_const_var, ast_value *cached_typedef);
static ast_block* parse_block(parser_t *parser, bool warnreturn);
static bool parse_block_into(parser_t *parser, ast_block *block, bool warnreturn);
static ast_expression* parse_statement_or_block(parser_t *parser);
"current standard does not allow variable declarations in for-loop initializers"))
goto onerr;
}
-
- parseerror(parser, "TODO: assignment of new variables to be non-const");
- goto onerr;
- if (!parse_variable(parser, block, true, false, typevar))
+ if (!parse_variable(parser, block, CV_VAR, false, typevar))
goto onerr;
}
else if (parser->tok != ';')
if (parsewarning(parser, WARN_EXTENSIONS, "missing 'local' keyword when declaring a local variable"))
return false;
}
- if (!parse_variable(parser, block, false, false, typevar))
+ if (!parse_variable(parser, block, CV_NONE, false, typevar))
return false;
*out = NULL;
return true;
parseerror(parser, "expected variable declaration");
return false;
}
- if (!parse_variable(parser, block, true, false, NULL))
+ if (!parse_variable(parser, block, CV_VAR, false, NULL))
return false;
*out = NULL;
return true;
return true;
}
-static bool parse_variable(parser_t *parser, ast_block *localblock, bool nofields, bool is_const, ast_value *cached_typedef)
+static bool parse_variable(parser_t *parser, ast_block *localblock, bool nofields, int is_const_var, ast_value *cached_typedef)
{
ast_value *var;
ast_value *proto;
}
}
- if (is_const)
+ if (is_const_var > 0)
var->constant = true;
/* Part 1:
parseerror(parser, "cannot initialize a global constant variable with a non-constant expression");
else
{
- if (opts_standard != COMPILER_GMQCC && !OPTS_FLAG(INITIALIZED_NONCONSTANTS))
+ if (opts_standard != COMPILER_GMQCC && !OPTS_FLAG(INITIALIZED_NONCONSTANTS) &&
+ is_const_var >= 0)
+ {
var->constant = true;
+ }
var->hasvalue = true;
if (cval->expression.vtype == TYPE_STRING)
var->constval.vstring = parser_strdup(cval->constval.vstring);
if (istype || parser->tok == TOKEN_TYPENAME || parser->tok == '.')
{
- return parse_variable(parser, NULL, false, false, istype);
+ return parse_variable(parser, NULL, CV_NONE, false, istype);
}
else if (parser->tok == TOKEN_IDENT && !strcmp(parser_tokval(parser), "var"))
{
parseerror(parser, "expected variable declaration after 'var'");
return false;
}
- return parse_variable(parser, NULL, true, false, NULL);
+ return parse_variable(parser, NULL, CV_VAR, false, NULL);
}
}
else if (parser->tok == TOKEN_KEYWORD)
return false;
}
}
- return parse_variable(parser, NULL, true, true, NULL);
+ return parse_variable(parser, NULL, CV_CONST, true, NULL);
}
else if (!strcmp(parser_tokval(parser), "typedef")) {
if (!parser_next(parser)) {