authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-06 19:35:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-06 19:35:33-07:00
logc7dc56f737ad9eab83b604e132cc3b33bf35e7f0
treed8aa750b573bf236f4d0382de50d4a7918d0b8e4
parentc4f5a002535cfd1259d001dbda7923cd635dd0ba

add test for ?? return and add const expr eval for ? prefix op


2 files changed, 24 insertions(+), 2 deletions(-)

src/analyze.cpp+16-2
......@@ -2399,6 +2399,16 @@ static TypeTableEntry *resolve_expr_const_val_as_null(CodeGen *g, AstNode *node,
23992399 return type;
24002400}
24012401
2402static TypeTableEntry *resolve_expr_const_val_as_non_null(CodeGen *g, AstNode *node,
2403 TypeTableEntry *type, ConstExprValue *other_val)
2404{
2405 assert(other_val->ok);
2406 Expr *expr = get_resolved_expr(node);
2407 expr->const_val.ok = true;
2408 expr->const_val.data.x_maybe = other_val;
2409 return type;
2410}
2411
24022412static TypeTableEntry *resolve_expr_const_val_as_c_string_lit(CodeGen *g, AstNode *node, Buf *str) {
24032413 Expr *expr = get_resolved_expr(node);
24042414 expr->const_val.ok = true;
......@@ -4376,8 +4386,12 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo
43764386 add_node_error(g, expr_node, buf_sprintf("unable to wrap unreachable in maybe type"));
43774387 return g->builtin_types.entry_invalid;
43784388 } else {
4379 // TODO eval const expr
4380 return get_maybe_type(g, type_entry);
4389 ConstExprValue *target_const_val = &get_resolved_expr(expr_node)->const_val;
4390 TypeTableEntry *maybe_type = get_maybe_type(g, type_entry);
4391 if (!target_const_val->ok) {
4392 return maybe_type;
4393 }
4394 return resolve_expr_const_val_as_non_null(g, node, maybe_type, target_const_val);
43814395 }
43824396 }
43834397 case PrefixOpError:
test/self_hosted.zig+8
......@@ -188,3 +188,11 @@ fn do_err_return_in_assignment() -> %void {
188188fn make_a_non_err() -> %i32 {
189189 return 1;
190190}
191
192
193
194#attribute("test")
195fn rhs_maybe_unwrap_return() {
196 const x = ?true;
197 const y = x ?? return;
198}