diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2015-12-09 16:03:51 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2015-12-09 16:03:51 +0800 |
commit | 707323558cff91c63d1506109bc2ae2912046f77 (patch) | |
tree | 06e3dd7b5492f8dc57b68745c610090ce4f12658 | |
parent | 90645217ca3335821f5067d5c18a4f5db010a596 (diff) | |
download | compiler2015-707323558cff91c63d1506109bc2ae2912046f77.tar compiler2015-707323558cff91c63d1506109bc2ae2912046f77.tar.gz compiler2015-707323558cff91c63d1506109bc2ae2912046f77.tar.bz2 compiler2015-707323558cff91c63d1506109bc2ae2912046f77.tar.lz compiler2015-707323558cff91c63d1506109bc2ae2912046f77.tar.xz compiler2015-707323558cff91c63d1506109bc2ae2912046f77.tar.zst compiler2015-707323558cff91c63d1506109bc2ae2912046f77.zip |
Fix crash when constant expressions include string literals
-rw-r--r-- | src/semantic-analysis.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/semantic-analysis.c b/src/semantic-analysis.c index dfb4ab0..ad9d254 100644 --- a/src/semantic-analysis.c +++ b/src/semantic-analysis.c @@ -15,8 +15,14 @@ static CcmmcValueConst eval_const_expr(CcmmcAst *expr) { - if (expr->type_node == CCMMC_AST_NODE_CONST_VALUE) + if (expr->type_node == CCMMC_AST_NODE_CONST_VALUE) { + if (expr->value_const.kind == CCMMC_KIND_CONST_STRING) { + fprintf(stderr, ERROR("Strings are not allowed in expressions."), + expr->line_number); + return (CcmmcValueConst){ .kind = CCMMC_KIND_CONST_ERROR }; + } return expr->value_const; + } if (expr->type_node != CCMMC_AST_NODE_EXPR) { fprintf(stderr, ERROR("Not a constant expression."), expr->line_number); return (CcmmcValueConst){ .kind = CCMMC_KIND_CONST_ERROR }; @@ -446,6 +452,7 @@ static bool process_variable( any_error = true; continue; case CCMMC_KIND_CONST_STRING: + // string is already handled in eval_const_expr default: assert(false); } |