From 26ea20d88fb1b201546e29058ac4aa5d4760a577 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 7 Feb 2016 15:11:20 -0700 Subject: implement @const_eval closes #73 --- src/analyze.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/analyze.cpp') diff --git a/src/analyze.cpp b/src/analyze.cpp index d6485d0312..2b8119ed48 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -4127,8 +4127,26 @@ static TypeTableEntry *analyze_builtin_fn_call_expr(CodeGen *g, ImportTableEntry buf_sprintf("unrecognized compile variable: '%s'", buf_ptr(&var_name))); return g->builtin_types.entry_invalid; } + } + case BuiltinFnIdConstEval: + { + AstNode **expr_node = node->data.fn_call_expr.params.at(0)->parent_field; + TypeTableEntry *resolved_type = analyze_expression(g, import, context, expected_type, *expr_node); + if (resolved_type->id == TypeTableEntryIdInvalid) { + return resolved_type; + } - break; + ConstExprValue *const_expr_val = &get_resolved_expr(*expr_node)->const_val; + + if (!const_expr_val->ok) { + add_node_error(g, *expr_node, buf_sprintf("unable to evaluate constant expression")); + return resolved_type; + } + + ConstExprValue *const_val = &get_resolved_expr(node)->const_val; + *const_val = *const_expr_val; + + return resolved_type; } } -- cgit v1.2.3