handling TOKEN_CHARCONST - -Wmultibyte-character

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-11-25 22:11:21 +01:00
parent 2234090398
commit 797ceb9e04
4 changed files with 12 additions and 1 deletions

View file

@ -1290,6 +1290,14 @@ int lex_do(lex_file *lex)
{ {
lex->tok.ttype = TOKEN_VECTORCONST; lex->tok.ttype = TOKEN_VECTORCONST;
} }
else
{
if (!lex->flags.preprocessing && strlen(lex->tok.value) > 1) {
if (lexwarn(lex, WARN_MULTIBYTE_CHARACTER, "multibyte character: `%s`", lex->tok.value))
return (lex->tok.ttype = TOKEN_ERROR);
}
lex->tok.constval.i = lex->tok.value[0];
}
return lex->tok.ttype; return lex->tok.ttype;
} }

2
main.c
View file

@ -473,6 +473,8 @@ int main(int argc, char **argv) {
options_set(opts_warn, WARN_PREPROCESSOR, true); options_set(opts_warn, WARN_PREPROCESSOR, true);
options_set(opts_warn, WARN_MULTIFILE_IF, true); options_set(opts_warn, WARN_MULTIFILE_IF, true);
options_set(opts_warn, WARN_DOUBLE_DECLARATION, true); options_set(opts_warn, WARN_DOUBLE_DECLARATION, true);
options_set(opts_warn, WARN_CONST_VAR, true);
options_set(opts_warn, WARN_MULTIBYTE_CHARACTER, true);
options_set(opts_flags, ADJUST_VECTOR_FIELDS, true); options_set(opts_flags, ADJUST_VECTOR_FIELDS, true);
options_set(opts_flags, FTEPP, false); options_set(opts_flags, FTEPP, false);

View file

@ -62,6 +62,7 @@
GMQCC_DEFINE_FLAG(MULTIFILE_IF) GMQCC_DEFINE_FLAG(MULTIFILE_IF)
GMQCC_DEFINE_FLAG(DOUBLE_DECLARATION) GMQCC_DEFINE_FLAG(DOUBLE_DECLARATION)
GMQCC_DEFINE_FLAG(CONST_VAR) GMQCC_DEFINE_FLAG(CONST_VAR)
GMQCC_DEFINE_FLAG(MULTIBYTE_CHARACTER)
#endif #endif
/* some cleanup so we don't have to */ /* some cleanup so we don't have to */

View file

@ -1428,7 +1428,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
vec_push(sy.out, syexp(parser_ctx(parser), (ast_expression*)val)); vec_push(sy.out, syexp(parser_ctx(parser), (ast_expression*)val));
DEBUGSHUNTDO(con_out("push %g\n", parser_token(parser)->constval.f)); DEBUGSHUNTDO(con_out("push %g\n", parser_token(parser)->constval.f));
} }
else if (parser->tok == TOKEN_INTCONST) { else if (parser->tok == TOKEN_INTCONST || parser->tok == TOKEN_CHARCONST) {
ast_value *val; ast_value *val;
if (wantop) { if (wantop) {
parseerror(parser, "expected operator or end of statement, got constant"); parseerror(parser, "expected operator or end of statement, got constant");