aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-06 16:36:49 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-06 16:36:49 -0700
commit65a03c5859e57820d2c28ad2952dda3fd4ac7d9c (patch)
treecbf8162ed73547c27a535fe21ebea20888625639 /src/analyze.cpp
parent34a7e6fdb362cb7be1067b7d1fc110eb2f323c51 (diff)
downloadzig-65a03c5859e57820d2c28ad2952dda3fd4ac7d9c.tar.gz
zig-65a03c5859e57820d2c28ad2952dda3fd4ac7d9c.zip
implement %defer and ?defer
see #110
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp46
1 files changed, 9 insertions, 37 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 03e5ad1899..06bb1b612e 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -3693,11 +3693,13 @@ static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, B
// explicit cast from child type of maybe type to maybe type
if (wanted_type->id == TypeTableEntryIdMaybe) {
if (types_match_const_cast_only(wanted_type->data.maybe.child_type, actual_type)) {
+ get_resolved_expr(node)->return_knowledge = ReturnKnowledgeKnownNonNull;
return resolve_cast(g, context, node, expr_node, wanted_type, CastOpMaybeWrap, true);
} else if (actual_type->id == TypeTableEntryIdNumLitInt ||
actual_type->id == TypeTableEntryIdNumLitFloat)
{
if (num_lit_fits_in_other_type(g, expr_node, wanted_type->data.maybe.child_type)) {
+ get_resolved_expr(node)->return_knowledge = ReturnKnowledgeKnownNonNull;
return resolve_cast(g, context, node, expr_node, wanted_type, CastOpMaybeWrap, true);
} else {
return g->builtin_types.entry_invalid;
@@ -3708,11 +3710,13 @@ static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, B
// explicit cast from child type of error type to error type
if (wanted_type->id == TypeTableEntryIdErrorUnion) {
if (types_match_const_cast_only(wanted_type->data.error.child_type, actual_type)) {
+ get_resolved_expr(node)->return_knowledge = ReturnKnowledgeKnownNonError;
return resolve_cast(g, context, node, expr_node, wanted_type, CastOpErrorWrap, true);
} else if (actual_type->id == TypeTableEntryIdNumLitInt ||
actual_type->id == TypeTableEntryIdNumLitFloat)
{
if (num_lit_fits_in_other_type(g, expr_node, wanted_type->data.error.child_type)) {
+ get_resolved_expr(node)->return_knowledge = ReturnKnowledgeKnownNonError;
return resolve_cast(g, context, node, expr_node, wanted_type, CastOpErrorWrap, true);
} else {
return g->builtin_types.entry_invalid;
@@ -3724,6 +3728,7 @@ static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, B
if (wanted_type->id == TypeTableEntryIdErrorUnion &&
actual_type->id == TypeTableEntryIdPureError)
{
+ get_resolved_expr(node)->return_knowledge = ReturnKnowledgeKnownError;
return resolve_cast(g, context, node, expr_node, wanted_type, CastOpPureErrorWrap, false);
}
@@ -4602,44 +4607,11 @@ static TypeTableEntry *analyze_defer(CodeGen *g, ImportTableEntry *import, Block
node->data.defer.child_block = new_block_context(node, parent_context);
- switch (node->data.defer.kind) {
- case ReturnKindUnconditional:
- {
- TypeTableEntry *resolved_type = analyze_expression(g, import, parent_context, nullptr,
- node->data.defer.expr);
- validate_voided_expr(g, node->data.defer.expr, resolved_type);
+ TypeTableEntry *resolved_type = analyze_expression(g, import, parent_context, nullptr,
+ node->data.defer.expr);
+ validate_voided_expr(g, node->data.defer.expr, resolved_type);
- return g->builtin_types.entry_void;
- }
- case ReturnKindError:
- {
- TypeTableEntry *resolved_type = analyze_expression(g, import, parent_context, nullptr,
- node->data.defer.expr);
- if (resolved_type->id == TypeTableEntryIdInvalid) {
- // OK
- } else if (resolved_type->id == TypeTableEntryIdErrorUnion) {
- // OK
- } else {
- add_node_error(g, node->data.defer.expr,
- buf_sprintf("expected error type, got '%s'", buf_ptr(&resolved_type->name)));
- }
- return g->builtin_types.entry_void;
- }
- case ReturnKindMaybe:
- {
- TypeTableEntry *resolved_type = analyze_expression(g, import, parent_context, nullptr,
- node->data.defer.expr);
- if (resolved_type->id == TypeTableEntryIdInvalid) {
- // OK
- } else if (resolved_type->id == TypeTableEntryIdMaybe) {
- // OK
- } else {
- add_node_error(g, node->data.defer.expr,
- buf_sprintf("expected maybe type, got '%s'", buf_ptr(&resolved_type->name)));
- }
- return g->builtin_types.entry_void;
- }
- }
+ return g->builtin_types.entry_void;
}
static TypeTableEntry *analyze_string_literal_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,