summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2015-12-09 16:03:51 +0800
committerTing-Wei Lan <lantw44@gmail.com>2015-12-09 16:03:51 +0800
commit707323558cff91c63d1506109bc2ae2912046f77 (patch)
tree06e3dd7b5492f8dc57b68745c610090ce4f12658
parent90645217ca3335821f5067d5c18a4f5db010a596 (diff)
downloadcompiler2015-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.c9
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);
}