| ... | ... | @@ -30,13 +30,15 @@ static TypeTableEntry *analyze_error_literal_expr(CodeGen *g, ImportTableEntry * |
| 30 | 30 | static TypeTableEntry *analyze_block_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, |
| 31 | 31 | TypeTableEntry *expected_type, AstNode *node); |
| 32 | 32 | static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node); |
| 33 | | static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn); |
| 34 | | static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type); |
| 33 | static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn, |
| 34 | bool depends_on_compile_var); |
| 35 | static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type, |
| 36 | bool depends_on_compile_var); |
| 35 | 37 | static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, AstNode *node, |
| 36 | 38 | TypeTableEntry *expected_type, uint64_t x); |
| 37 | 39 | static AstNode *find_decl(BlockContext *context, Buf *name); |
| 38 | 40 | static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNode *decl_node, |
| 39 | | bool pointer_only, BlockContext *block_context); |
| 41 | bool pointer_only, BlockContext *block_context, bool depends_on_compile_var); |
| 40 | 42 | static TopLevelDecl *get_as_top_level_decl(AstNode *node); |
| 41 | 43 | static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTableEntry *import, |
| 42 | 44 | BlockContext *context, AstNode *source_node, |
| ... | ... | @@ -2587,7 +2589,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2587 | 2589 | |
| 2588 | 2590 | node->data.field_access_expr.is_member_fn = true; |
| 2589 | 2591 | FnTableEntry *fn_entry = fn_decl_node->data.fn_proto.fn_table_entry; |
| 2590 | | return resolve_expr_const_val_as_fn(g, node, fn_entry); |
| 2592 | return resolve_expr_const_val_as_fn(g, node, fn_entry, false); |
| 2591 | 2593 | } else { |
| 2592 | 2594 | add_node_error(g, node, buf_sprintf("no function named '%s' in '%s'", |
| 2593 | 2595 | buf_ptr(field_name), buf_ptr(&bare_struct_type->name))); |
| ... | ... | @@ -2642,7 +2644,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2642 | 2644 | AstNode *decl_node = entry ? entry->value : nullptr; |
| 2643 | 2645 | if (decl_node) { |
| 2644 | 2646 | bool pointer_only = false; |
| 2645 | | return analyze_decl_ref(g, node, decl_node, pointer_only, context); |
| 2647 | return analyze_decl_ref(g, node, decl_node, pointer_only, context, false); |
| 2646 | 2648 | } else { |
| 2647 | 2649 | add_node_error(g, node, |
| 2648 | 2650 | buf_sprintf("container '%s' has no member called '%s'", |
| ... | ... | @@ -2652,7 +2654,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2652 | 2654 | } else if (child_type->id == TypeTableEntryIdPureError) { |
| 2653 | 2655 | return analyze_error_literal_expr(g, import, context, node, field_name); |
| 2654 | 2656 | } else if (wrapped_in_fn_call) { // this branch should go last, before the error in the else case |
| 2655 | | return resolve_expr_const_val_as_type(g, node, child_type); |
| 2657 | return resolve_expr_const_val_as_type(g, node, child_type, false); |
| 2656 | 2658 | } else { |
| 2657 | 2659 | add_node_error(g, node, |
| 2658 | 2660 | buf_sprintf("type '%s' does not support field access", buf_ptr(&struct_type->name))); |
| ... | ... | @@ -2671,7 +2673,8 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2671 | 2673 | add_error_note(g, msg, decl_node, buf_sprintf("declared here")); |
| 2672 | 2674 | } |
| 2673 | 2675 | bool pointer_only = false; |
| 2674 | | return analyze_decl_ref(g, node, decl_node, pointer_only, context); |
| 2676 | return analyze_decl_ref(g, node, decl_node, pointer_only, context, |
| 2677 | const_val->depends_on_compile_var); |
| 2675 | 2678 | } else { |
| 2676 | 2679 | const char *import_name = namespace_import->path ? buf_ptr(namespace_import->path) : "(C import)"; |
| 2677 | 2680 | add_node_error(g, node, |
| ... | ... | @@ -2770,33 +2773,44 @@ static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node) |
| 2770 | 2773 | return g->builtin_types.entry_void; |
| 2771 | 2774 | } |
| 2772 | 2775 | |
| 2773 | | static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type) { |
| 2776 | static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type, |
| 2777 | bool depends_on_compile_var) |
| 2778 | { |
| 2774 | 2779 | Expr *expr = get_resolved_expr(node); |
| 2775 | 2780 | expr->const_val.ok = true; |
| 2776 | 2781 | expr->const_val.data.x_type = type; |
| 2782 | expr->const_val.depends_on_compile_var = depends_on_compile_var; |
| 2777 | 2783 | return g->builtin_types.entry_type; |
| 2778 | 2784 | } |
| 2779 | 2785 | |
| 2780 | | static TypeTableEntry *resolve_expr_const_val_as_other_expr(CodeGen *g, AstNode *node, AstNode *other) { |
| 2786 | static TypeTableEntry *resolve_expr_const_val_as_other_expr(CodeGen *g, AstNode *node, AstNode *other, |
| 2787 | bool depends_on_compile_var) |
| 2788 | { |
| 2781 | 2789 | Expr *expr = get_resolved_expr(node); |
| 2782 | 2790 | Expr *other_expr = get_resolved_expr(other); |
| 2783 | 2791 | expr->const_val = other_expr->const_val; |
| 2792 | expr->const_val.depends_on_compile_var = expr->const_val.depends_on_compile_var || |
| 2793 | depends_on_compile_var; |
| 2784 | 2794 | return other_expr->type_entry; |
| 2785 | 2795 | } |
| 2786 | 2796 | |
| 2787 | | static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn) { |
| 2797 | static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn, |
| 2798 | bool depends_on_compile_var) |
| 2799 | { |
| 2788 | 2800 | Expr *expr = get_resolved_expr(node); |
| 2789 | 2801 | expr->const_val.ok = true; |
| 2790 | 2802 | expr->const_val.data.x_fn = fn; |
| 2803 | expr->const_val.depends_on_compile_var = depends_on_compile_var; |
| 2791 | 2804 | return fn->type_entry; |
| 2792 | 2805 | } |
| 2793 | 2806 | |
| 2794 | 2807 | static TypeTableEntry *resolve_expr_const_val_as_generic_fn(CodeGen *g, AstNode *node, |
| 2795 | | TypeTableEntry *type_entry) |
| 2808 | TypeTableEntry *type_entry, bool depends_on_compile_var) |
| 2796 | 2809 | { |
| 2797 | 2810 | Expr *expr = get_resolved_expr(node); |
| 2798 | 2811 | expr->const_val.ok = true; |
| 2799 | 2812 | expr->const_val.data.x_type = type_entry; |
| 2813 | expr->const_val.depends_on_compile_var = depends_on_compile_var; |
| 2800 | 2814 | return type_entry; |
| 2801 | 2815 | } |
| 2802 | 2816 | |
| ... | ... | @@ -2922,7 +2936,7 @@ static bool var_is_pure(VariableTableEntry *var, BlockContext *context) { |
| 2922 | 2936 | } |
| 2923 | 2937 | |
| 2924 | 2938 | static TypeTableEntry *analyze_var_ref(CodeGen *g, AstNode *source_node, VariableTableEntry *var, |
| 2925 | | BlockContext *context) |
| 2939 | BlockContext *context, bool depends_on_compile_var) |
| 2926 | 2940 | { |
| 2927 | 2941 | get_resolved_expr(source_node)->variable = var; |
| 2928 | 2942 | if (!var_is_pure(var, context)) { |
| ... | ... | @@ -2931,14 +2945,15 @@ static TypeTableEntry *analyze_var_ref(CodeGen *g, AstNode *source_node, Variabl |
| 2931 | 2945 | if (var->is_const && var->val_node) { |
| 2932 | 2946 | ConstExprValue *other_const_val = &get_resolved_expr(var->val_node)->const_val; |
| 2933 | 2947 | if (other_const_val->ok) { |
| 2934 | | return resolve_expr_const_val_as_other_expr(g, source_node, var->val_node); |
| 2948 | return resolve_expr_const_val_as_other_expr(g, source_node, var->val_node, |
| 2949 | depends_on_compile_var); |
| 2935 | 2950 | } |
| 2936 | 2951 | } |
| 2937 | 2952 | return var->type; |
| 2938 | 2953 | } |
| 2939 | 2954 | |
| 2940 | 2955 | static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNode *decl_node, |
| 2941 | | bool pointer_only, BlockContext *block_context) |
| 2956 | bool pointer_only, BlockContext *block_context, bool depends_on_compile_var) |
| 2942 | 2957 | { |
| 2943 | 2958 | resolve_top_level_decl(g, decl_node, pointer_only); |
| 2944 | 2959 | TopLevelDecl *tld = get_as_top_level_decl(decl_node); |
| ... | ... | @@ -2948,27 +2963,29 @@ static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNod |
| 2948 | 2963 | |
| 2949 | 2964 | if (decl_node->type == NodeTypeVariableDeclaration) { |
| 2950 | 2965 | VariableTableEntry *var = decl_node->data.variable_declaration.variable; |
| 2951 | | return analyze_var_ref(g, source_node, var, block_context); |
| 2966 | return analyze_var_ref(g, source_node, var, block_context, depends_on_compile_var); |
| 2952 | 2967 | } else if (decl_node->type == NodeTypeFnProto) { |
| 2953 | 2968 | if (decl_node->data.fn_proto.generic_params.length > 0) { |
| 2954 | 2969 | TypeTableEntry *type_entry = decl_node->data.fn_proto.generic_fn_type; |
| 2955 | 2970 | assert(type_entry); |
| 2956 | | return resolve_expr_const_val_as_generic_fn(g, source_node, type_entry); |
| 2971 | return resolve_expr_const_val_as_generic_fn(g, source_node, type_entry, depends_on_compile_var); |
| 2957 | 2972 | } else { |
| 2958 | 2973 | FnTableEntry *fn_entry = decl_node->data.fn_proto.fn_table_entry; |
| 2959 | 2974 | assert(fn_entry->type_entry); |
| 2960 | | return resolve_expr_const_val_as_fn(g, source_node, fn_entry); |
| 2975 | return resolve_expr_const_val_as_fn(g, source_node, fn_entry, depends_on_compile_var); |
| 2961 | 2976 | } |
| 2962 | 2977 | } else if (decl_node->type == NodeTypeStructDecl) { |
| 2963 | 2978 | if (decl_node->data.struct_decl.generic_params.length > 0) { |
| 2964 | 2979 | TypeTableEntry *type_entry = decl_node->data.struct_decl.generic_fn_type; |
| 2965 | 2980 | assert(type_entry); |
| 2966 | | return resolve_expr_const_val_as_generic_fn(g, source_node, type_entry); |
| 2981 | return resolve_expr_const_val_as_generic_fn(g, source_node, type_entry, depends_on_compile_var); |
| 2967 | 2982 | } else { |
| 2968 | | return resolve_expr_const_val_as_type(g, source_node, decl_node->data.struct_decl.type_entry); |
| 2983 | return resolve_expr_const_val_as_type(g, source_node, decl_node->data.struct_decl.type_entry, |
| 2984 | depends_on_compile_var); |
| 2969 | 2985 | } |
| 2970 | 2986 | } else if (decl_node->type == NodeTypeTypeDecl) { |
| 2971 | | return resolve_expr_const_val_as_type(g, source_node, decl_node->data.type_decl.child_type_entry); |
| 2987 | return resolve_expr_const_val_as_type(g, source_node, decl_node->data.type_decl.child_type_entry, |
| 2988 | depends_on_compile_var); |
| 2972 | 2989 | } else { |
| 2973 | 2990 | zig_unreachable(); |
| 2974 | 2991 | } |
| ... | ... | @@ -2978,25 +2995,25 @@ static TypeTableEntry *analyze_symbol_expr(CodeGen *g, ImportTableEntry *import, |
| 2978 | 2995 | TypeTableEntry *expected_type, AstNode *node, bool pointer_only) |
| 2979 | 2996 | { |
| 2980 | 2997 | if (node->data.symbol_expr.override_type_entry) { |
| 2981 | | return resolve_expr_const_val_as_type(g, node, node->data.symbol_expr.override_type_entry); |
| 2998 | return resolve_expr_const_val_as_type(g, node, node->data.symbol_expr.override_type_entry, false); |
| 2982 | 2999 | } |
| 2983 | 3000 | |
| 2984 | 3001 | Buf *variable_name = &node->data.symbol_expr.symbol; |
| 2985 | 3002 | |
| 2986 | 3003 | auto primitive_table_entry = g->primitive_type_table.maybe_get(variable_name); |
| 2987 | 3004 | if (primitive_table_entry) { |
| 2988 | | return resolve_expr_const_val_as_type(g, node, primitive_table_entry->value); |
| 3005 | return resolve_expr_const_val_as_type(g, node, primitive_table_entry->value, false); |
| 2989 | 3006 | } |
| 2990 | 3007 | |
| 2991 | 3008 | VariableTableEntry *var = find_variable(g, context, variable_name); |
| 2992 | 3009 | if (var) { |
| 2993 | | TypeTableEntry *var_type = analyze_var_ref(g, node, var, context); |
| 3010 | TypeTableEntry *var_type = analyze_var_ref(g, node, var, context, false); |
| 2994 | 3011 | return var_type; |
| 2995 | 3012 | } |
| 2996 | 3013 | |
| 2997 | 3014 | AstNode *decl_node = find_decl(context, variable_name); |
| 2998 | 3015 | if (decl_node) { |
| 2999 | | return analyze_decl_ref(g, node, decl_node, pointer_only, context); |
| 3016 | return analyze_decl_ref(g, node, decl_node, pointer_only, context, false); |
| 3000 | 3017 | } |
| 3001 | 3018 | |
| 3002 | 3019 | if (import->any_imports_failed) { |
| ... | ... | @@ -3819,11 +3836,11 @@ static TypeTableEntry *analyze_array_type(CodeGen *g, ImportTableEntry *import, |
| 3819 | 3836 | return g->builtin_types.entry_invalid; |
| 3820 | 3837 | } else { |
| 3821 | 3838 | return resolve_expr_const_val_as_type(g, node, |
| 3822 | | get_array_type(g, child_type, const_val->data.x_bignum.data.x_uint)); |
| 3839 | get_array_type(g, child_type, const_val->data.x_bignum.data.x_uint), false); |
| 3823 | 3840 | } |
| 3824 | 3841 | } else if (context->fn_entry) { |
| 3825 | 3842 | return resolve_expr_const_val_as_type(g, node, |
| 3826 | | get_slice_type(g, child_type, node->data.array_type.is_const)); |
| 3843 | get_slice_type(g, child_type, node->data.array_type.is_const), false); |
| 3827 | 3844 | } else { |
| 3828 | 3845 | add_node_error(g, first_executing_node(size_node), |
| 3829 | 3846 | buf_sprintf("unable to evaluate constant expression")); |
| ... | ... | @@ -3831,7 +3848,7 @@ static TypeTableEntry *analyze_array_type(CodeGen *g, ImportTableEntry *import, |
| 3831 | 3848 | } |
| 3832 | 3849 | } else { |
| 3833 | 3850 | return resolve_expr_const_val_as_type(g, node, |
| 3834 | | get_slice_type(g, child_type, node->data.array_type.is_const)); |
| 3851 | get_slice_type(g, child_type, node->data.array_type.is_const), false); |
| 3835 | 3852 | } |
| 3836 | 3853 | } |
| 3837 | 3854 | |
| ... | ... | @@ -3844,7 +3861,7 @@ static TypeTableEntry *analyze_fn_proto_expr(CodeGen *g, ImportTableEntry *impor |
| 3844 | 3861 | return type_entry; |
| 3845 | 3862 | } |
| 3846 | 3863 | |
| 3847 | | return resolve_expr_const_val_as_type(g, node, type_entry); |
| 3864 | return resolve_expr_const_val_as_type(g, node, type_entry, false); |
| 3848 | 3865 | } |
| 3849 | 3866 | |
| 3850 | 3867 | static TypeTableEntry *analyze_while_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, |
| ... | ... | @@ -4973,7 +4990,7 @@ static TypeTableEntry *analyze_builtin_fn_call_expr(CodeGen *g, ImportTableEntry |
| 4973 | 4990 | case TypeTableEntryIdUnion: |
| 4974 | 4991 | case TypeTableEntryIdFn: |
| 4975 | 4992 | case TypeTableEntryIdTypeDecl: |
| 4976 | | return resolve_expr_const_val_as_type(g, node, type_entry); |
| 4993 | return resolve_expr_const_val_as_type(g, node, type_entry, false); |
| 4977 | 4994 | } |
| 4978 | 4995 | } |
| 4979 | 4996 | case BuiltinFnIdCInclude: |
| ... | ... | @@ -5307,10 +5324,10 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp |
| 5307 | 5324 | AstNode *impl_decl_node = entry->value; |
| 5308 | 5325 | if (impl_decl_node->type == NodeTypeFnProto) { |
| 5309 | 5326 | FnTableEntry *fn_table_entry = impl_decl_node->data.fn_proto.fn_table_entry; |
| 5310 | | return resolve_expr_const_val_as_fn(g, node, fn_table_entry); |
| 5327 | return resolve_expr_const_val_as_fn(g, node, fn_table_entry, false); |
| 5311 | 5328 | } else if (impl_decl_node->type == NodeTypeStructDecl) { |
| 5312 | 5329 | TypeTableEntry *type_entry = impl_decl_node->data.struct_decl.type_entry; |
| 5313 | | return resolve_expr_const_val_as_type(g, node, type_entry); |
| 5330 | return resolve_expr_const_val_as_type(g, node, type_entry, false); |
| 5314 | 5331 | } else { |
| 5315 | 5332 | zig_unreachable(); |
| 5316 | 5333 | } |
| ... | ... | @@ -5324,14 +5341,14 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp |
| 5324 | 5341 | preview_fn_proto_instance(g, import, impl_decl_node, child_context); |
| 5325 | 5342 | g->generic_table.put(generic_fn_type_id, impl_decl_node); |
| 5326 | 5343 | FnTableEntry *fn_table_entry = impl_decl_node->data.fn_proto.fn_table_entry; |
| 5327 | | return resolve_expr_const_val_as_fn(g, node, fn_table_entry); |
| 5344 | return resolve_expr_const_val_as_fn(g, node, fn_table_entry, false); |
| 5328 | 5345 | } else if (decl_node->type == NodeTypeStructDecl) { |
| 5329 | 5346 | AstNode *impl_decl_node = ast_clone_subtree(decl_node, &g->next_node_index); |
| 5330 | 5347 | g->generic_table.put(generic_fn_type_id, impl_decl_node); |
| 5331 | 5348 | scan_struct_decl(g, import, child_context, impl_decl_node); |
| 5332 | 5349 | TypeTableEntry *type_entry = impl_decl_node->data.struct_decl.type_entry; |
| 5333 | 5350 | resolve_struct_type(g, import, type_entry); |
| 5334 | | return resolve_expr_const_val_as_type(g, node, type_entry); |
| 5351 | return resolve_expr_const_val_as_type(g, node, type_entry, false); |
| 5335 | 5352 | } else { |
| 5336 | 5353 | zig_unreachable(); |
| 5337 | 5354 | } |
| ... | ... | @@ -5480,7 +5497,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo |
| 5480 | 5497 | return g->builtin_types.entry_invalid; |
| 5481 | 5498 | } else { |
| 5482 | 5499 | return resolve_expr_const_val_as_type(g, node, |
| 5483 | | get_pointer_to_type(g, meta_type, is_const)); |
| 5500 | get_pointer_to_type(g, meta_type, is_const), false); |
| 5484 | 5501 | } |
| 5485 | 5502 | } else if (child_type->id == TypeTableEntryIdNumLitInt || |
| 5486 | 5503 | child_type->id == TypeTableEntryIdNumLitFloat) |
| ... | ... | @@ -5520,7 +5537,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo |
| 5520 | 5537 | add_node_error(g, node, buf_create_from_str("unable to wrap unreachable in maybe type")); |
| 5521 | 5538 | return g->builtin_types.entry_invalid; |
| 5522 | 5539 | } else { |
| 5523 | | return resolve_expr_const_val_as_type(g, node, get_maybe_type(g, meta_type)); |
| 5540 | return resolve_expr_const_val_as_type(g, node, get_maybe_type(g, meta_type), false); |
| 5524 | 5541 | } |
| 5525 | 5542 | } else if (type_entry->id == TypeTableEntryIdUnreachable) { |
| 5526 | 5543 | add_node_error(g, *expr_node, buf_sprintf("unable to wrap unreachable in maybe type")); |
| ... | ... | @@ -5548,7 +5565,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo |
| 5548 | 5565 | add_node_error(g, node, buf_create_from_str("unable to wrap unreachable in error type")); |
| 5549 | 5566 | return g->builtin_types.entry_invalid; |
| 5550 | 5567 | } else { |
| 5551 | | return resolve_expr_const_val_as_type(g, node, get_error_type(g, meta_type)); |
| 5568 | return resolve_expr_const_val_as_type(g, node, get_error_type(g, meta_type), false); |
| 5552 | 5569 | } |
| 5553 | 5570 | } else if (type_entry->id == TypeTableEntryIdUnreachable) { |
| 5554 | 5571 | add_node_error(g, *expr_node, buf_sprintf("unable to wrap unreachable in error type")); |
| ... | ... | @@ -6159,10 +6176,10 @@ static TypeTableEntry *analyze_expression_pointer_only(CodeGen *g, ImportTableEn |
| 6159 | 6176 | return_type = analyze_fn_proto_expr(g, import, context, expected_type, node); |
| 6160 | 6177 | break; |
| 6161 | 6178 | case NodeTypeErrorType: |
| 6162 | | return_type = resolve_expr_const_val_as_type(g, node, g->builtin_types.entry_pure_error); |
| 6179 | return_type = resolve_expr_const_val_as_type(g, node, g->builtin_types.entry_pure_error, false); |
| 6163 | 6180 | break; |
| 6164 | 6181 | case NodeTypeTypeLiteral: |
| 6165 | | return_type = resolve_expr_const_val_as_type(g, node, g->builtin_types.entry_type); |
| 6182 | return_type = resolve_expr_const_val_as_type(g, node, g->builtin_types.entry_type, false); |
| 6166 | 6183 | break; |
| 6167 | 6184 | case NodeTypeSwitchExpr: |
| 6168 | 6185 | return_type = analyze_switch_expr(g, import, context, expected_type, node); |