| ... | @@ -30,13 +30,15 @@ static TypeTableEntry *analyze_error_literal_expr(CodeGen *g, ImportTableEntry * | ... | @@ -30,13 +30,15 @@ static TypeTableEntry *analyze_error_literal_expr(CodeGen *g, ImportTableEntry * |
| 30 | static TypeTableEntry *analyze_block_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, | 30 | static TypeTableEntry *analyze_block_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, |
| 31 | TypeTableEntry *expected_type, AstNode *node); | 31 | TypeTableEntry *expected_type, AstNode *node); |
| 32 | static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node); | 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); | 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); | 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 | static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, AstNode *node, | 37 | static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, AstNode *node, |
| 36 | TypeTableEntry *expected_type, uint64_t x); | 38 | TypeTableEntry *expected_type, uint64_t x); |
| 37 | static AstNode *find_decl(BlockContext *context, Buf *name); | 39 | static AstNode *find_decl(BlockContext *context, Buf *name); |
| 38 | static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNode *decl_node, | 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 | static TopLevelDecl *get_as_top_level_decl(AstNode *node); | 42 | static TopLevelDecl *get_as_top_level_decl(AstNode *node); |
| 41 | static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTableEntry *import, | 43 | static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTableEntry *import, |
| 42 | BlockContext *context, AstNode *source_node, | 44 | BlockContext *context, AstNode *source_node, |
| ... | @@ -2587,7 +2589,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i | ... | @@ -2587,7 +2589,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2587 | | 2589 | |
| 2588 | node->data.field_access_expr.is_member_fn = true; | 2590 | node->data.field_access_expr.is_member_fn = true; |
| 2589 | FnTableEntry *fn_entry = fn_decl_node->data.fn_proto.fn_table_entry; | 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 | } else { | 2593 | } else { |
| 2592 | add_node_error(g, node, buf_sprintf("no function named '%s' in '%s'", | 2594 | add_node_error(g, node, buf_sprintf("no function named '%s' in '%s'", |
| 2593 | buf_ptr(field_name), buf_ptr(&bare_struct_type->name))); | 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,7 +2644,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2642 | AstNode *decl_node = entry ? entry->value : nullptr; | 2644 | AstNode *decl_node = entry ? entry->value : nullptr; |
| 2643 | if (decl_node) { | 2645 | if (decl_node) { |
| 2644 | bool pointer_only = false; | 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 | } else { | 2648 | } else { |
| 2647 | add_node_error(g, node, | 2649 | add_node_error(g, node, |
| 2648 | buf_sprintf("container '%s' has no member called '%s'", | 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,7 +2654,7 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2652 | } else if (child_type->id == TypeTableEntryIdPureError) { | 2654 | } else if (child_type->id == TypeTableEntryIdPureError) { |
| 2653 | return analyze_error_literal_expr(g, import, context, node, field_name); | 2655 | return analyze_error_literal_expr(g, import, context, node, field_name); |
| 2654 | } else if (wrapped_in_fn_call) { // this branch should go last, before the error in the else case | 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 | } else { | 2658 | } else { |
| 2657 | add_node_error(g, node, | 2659 | add_node_error(g, node, |
| 2658 | buf_sprintf("type '%s' does not support field access", buf_ptr(&struct_type->name))); | 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,7 +2673,8 @@ static TypeTableEntry *analyze_field_access_expr(CodeGen *g, ImportTableEntry *i |
| 2671 | add_error_note(g, msg, decl_node, buf_sprintf("declared here")); | 2673 | add_error_note(g, msg, decl_node, buf_sprintf("declared here")); |
| 2672 | } | 2674 | } |
| 2673 | bool pointer_only = false; | 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 | } else { | 2678 | } else { |
| 2676 | const char *import_name = namespace_import->path ? buf_ptr(namespace_import->path) : "(C import)"; | 2679 | const char *import_name = namespace_import->path ? buf_ptr(namespace_import->path) : "(C import)"; |
| 2677 | add_node_error(g, node, | 2680 | add_node_error(g, node, |
| ... | @@ -2770,33 +2773,44 @@ static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node) | ... | @@ -2770,33 +2773,44 @@ static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node) |
| 2770 | return g->builtin_types.entry_void; | 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 | Expr *expr = get_resolved_expr(node); | 2779 | Expr *expr = get_resolved_expr(node); |
| 2775 | expr->const_val.ok = true; | 2780 | expr->const_val.ok = true; |
| 2776 | expr->const_val.data.x_type = type; | 2781 | expr->const_val.data.x_type = type; |
| | 2782 | expr->const_val.depends_on_compile_var = depends_on_compile_var; |
| 2777 | return g->builtin_types.entry_type; | 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 | Expr *expr = get_resolved_expr(node); | 2789 | Expr *expr = get_resolved_expr(node); |
| 2782 | Expr *other_expr = get_resolved_expr(other); | 2790 | Expr *other_expr = get_resolved_expr(other); |
| 2783 | expr->const_val = other_expr->const_val; | 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 | return other_expr->type_entry; | 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 | Expr *expr = get_resolved_expr(node); | 2800 | Expr *expr = get_resolved_expr(node); |
| 2789 | expr->const_val.ok = true; | 2801 | expr->const_val.ok = true; |
| 2790 | expr->const_val.data.x_fn = fn; | 2802 | expr->const_val.data.x_fn = fn; |
| | 2803 | expr->const_val.depends_on_compile_var = depends_on_compile_var; |
| 2791 | return fn->type_entry; | 2804 | return fn->type_entry; |
| 2792 | } | 2805 | } |
| 2793 | | 2806 | |
| 2794 | static TypeTableEntry *resolve_expr_const_val_as_generic_fn(CodeGen *g, AstNode *node, | 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 | Expr *expr = get_resolved_expr(node); | 2810 | Expr *expr = get_resolved_expr(node); |
| 2798 | expr->const_val.ok = true; | 2811 | expr->const_val.ok = true; |
| 2799 | expr->const_val.data.x_type = type_entry; | 2812 | expr->const_val.data.x_type = type_entry; |
| | 2813 | expr->const_val.depends_on_compile_var = depends_on_compile_var; |
| 2800 | return type_entry; | 2814 | return type_entry; |
| 2801 | } | 2815 | } |
| 2802 | | 2816 | |
| ... | @@ -2922,7 +2936,7 @@ static bool var_is_pure(VariableTableEntry *var, BlockContext *context) { | ... | @@ -2922,7 +2936,7 @@ static bool var_is_pure(VariableTableEntry *var, BlockContext *context) { |
| 2922 | } | 2936 | } |
| 2923 | | 2937 | |
| 2924 | static TypeTableEntry *analyze_var_ref(CodeGen *g, AstNode *source_node, VariableTableEntry *var, | 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 | get_resolved_expr(source_node)->variable = var; | 2941 | get_resolved_expr(source_node)->variable = var; |
| 2928 | if (!var_is_pure(var, context)) { | 2942 | if (!var_is_pure(var, context)) { |
| ... | @@ -2931,14 +2945,15 @@ static TypeTableEntry *analyze_var_ref(CodeGen *g, AstNode *source_node, Variabl | ... | @@ -2931,14 +2945,15 @@ static TypeTableEntry *analyze_var_ref(CodeGen *g, AstNode *source_node, Variabl |
| 2931 | if (var->is_const && var->val_node) { | 2945 | if (var->is_const && var->val_node) { |
| 2932 | ConstExprValue *other_const_val = &get_resolved_expr(var->val_node)->const_val; | 2946 | ConstExprValue *other_const_val = &get_resolved_expr(var->val_node)->const_val; |
| 2933 | if (other_const_val->ok) { | 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 | return var->type; | 2952 | return var->type; |
| 2938 | } | 2953 | } |
| 2939 | | 2954 | |
| 2940 | static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNode *decl_node, | 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 | resolve_top_level_decl(g, decl_node, pointer_only); | 2958 | resolve_top_level_decl(g, decl_node, pointer_only); |
| 2944 | TopLevelDecl *tld = get_as_top_level_decl(decl_node); | 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,27 +2963,29 @@ static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNod |
| 2948 | | 2963 | |
| 2949 | if (decl_node->type == NodeTypeVariableDeclaration) { | 2964 | if (decl_node->type == NodeTypeVariableDeclaration) { |
| 2950 | VariableTableEntry *var = decl_node->data.variable_declaration.variable; | 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 | } else if (decl_node->type == NodeTypeFnProto) { | 2967 | } else if (decl_node->type == NodeTypeFnProto) { |
| 2953 | if (decl_node->data.fn_proto.generic_params.length > 0) { | 2968 | if (decl_node->data.fn_proto.generic_params.length > 0) { |
| 2954 | TypeTableEntry *type_entry = decl_node->data.fn_proto.generic_fn_type; | 2969 | TypeTableEntry *type_entry = decl_node->data.fn_proto.generic_fn_type; |
| 2955 | assert(type_entry); | 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 | } else { | 2972 | } else { |
| 2958 | FnTableEntry *fn_entry = decl_node->data.fn_proto.fn_table_entry; | 2973 | FnTableEntry *fn_entry = decl_node->data.fn_proto.fn_table_entry; |
| 2959 | assert(fn_entry->type_entry); | 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 | } else if (decl_node->type == NodeTypeStructDecl) { | 2977 | } else if (decl_node->type == NodeTypeStructDecl) { |
| 2963 | if (decl_node->data.struct_decl.generic_params.length > 0) { | 2978 | if (decl_node->data.struct_decl.generic_params.length > 0) { |
| 2964 | TypeTableEntry *type_entry = decl_node->data.struct_decl.generic_fn_type; | 2979 | TypeTableEntry *type_entry = decl_node->data.struct_decl.generic_fn_type; |
| 2965 | assert(type_entry); | 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 | } else { | 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 | } else if (decl_node->type == NodeTypeTypeDecl) { | 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 | } else { | 2989 | } else { |
| 2973 | zig_unreachable(); | 2990 | zig_unreachable(); |
| 2974 | } | 2991 | } |
| ... | @@ -2978,25 +2995,25 @@ static TypeTableEntry *analyze_symbol_expr(CodeGen *g, ImportTableEntry *import, | ... | @@ -2978,25 +2995,25 @@ static TypeTableEntry *analyze_symbol_expr(CodeGen *g, ImportTableEntry *import, |
| 2978 | TypeTableEntry *expected_type, AstNode *node, bool pointer_only) | 2995 | TypeTableEntry *expected_type, AstNode *node, bool pointer_only) |
| 2979 | { | 2996 | { |
| 2980 | if (node->data.symbol_expr.override_type_entry) { | 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 | Buf *variable_name = &node->data.symbol_expr.symbol; | 3001 | Buf *variable_name = &node->data.symbol_expr.symbol; |
| 2985 | | 3002 | |
| 2986 | auto primitive_table_entry = g->primitive_type_table.maybe_get(variable_name); | 3003 | auto primitive_table_entry = g->primitive_type_table.maybe_get(variable_name); |
| 2987 | if (primitive_table_entry) { | 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 | VariableTableEntry *var = find_variable(g, context, variable_name); | 3008 | VariableTableEntry *var = find_variable(g, context, variable_name); |
| 2992 | if (var) { | 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 | return var_type; | 3011 | return var_type; |
| 2995 | } | 3012 | } |
| 2996 | | 3013 | |
| 2997 | AstNode *decl_node = find_decl(context, variable_name); | 3014 | AstNode *decl_node = find_decl(context, variable_name); |
| 2998 | if (decl_node) { | 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 | if (import->any_imports_failed) { | 3019 | if (import->any_imports_failed) { |
| ... | @@ -3819,11 +3836,11 @@ static TypeTableEntry *analyze_array_type(CodeGen *g, ImportTableEntry *import, | ... | @@ -3819,11 +3836,11 @@ static TypeTableEntry *analyze_array_type(CodeGen *g, ImportTableEntry *import, |
| 3819 | return g->builtin_types.entry_invalid; | 3836 | return g->builtin_types.entry_invalid; |
| 3820 | } else { | 3837 | } else { |
| 3821 | return resolve_expr_const_val_as_type(g, node, | 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 | } else if (context->fn_entry) { | 3841 | } else if (context->fn_entry) { |
| 3825 | return resolve_expr_const_val_as_type(g, node, | 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 | } else { | 3844 | } else { |
| 3828 | add_node_error(g, first_executing_node(size_node), | 3845 | add_node_error(g, first_executing_node(size_node), |
| 3829 | buf_sprintf("unable to evaluate constant expression")); | 3846 | buf_sprintf("unable to evaluate constant expression")); |
| ... | @@ -3831,7 +3848,7 @@ static TypeTableEntry *analyze_array_type(CodeGen *g, ImportTableEntry *import, | ... | @@ -3831,7 +3848,7 @@ static TypeTableEntry *analyze_array_type(CodeGen *g, ImportTableEntry *import, |
| 3831 | } | 3848 | } |
| 3832 | } else { | 3849 | } else { |
| 3833 | return resolve_expr_const_val_as_type(g, node, | 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,7 +3861,7 @@ static TypeTableEntry *analyze_fn_proto_expr(CodeGen *g, ImportTableEntry *impor |
| 3844 | return type_entry; | 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 | static TypeTableEntry *analyze_while_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context, | 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,7 +4990,7 @@ static TypeTableEntry *analyze_builtin_fn_call_expr(CodeGen *g, ImportTableEntry |
| 4973 | case TypeTableEntryIdUnion: | 4990 | case TypeTableEntryIdUnion: |
| 4974 | case TypeTableEntryIdFn: | 4991 | case TypeTableEntryIdFn: |
| 4975 | case TypeTableEntryIdTypeDecl: | 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 | case BuiltinFnIdCInclude: | 4996 | case BuiltinFnIdCInclude: |
| ... | @@ -5307,10 +5324,10 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp | ... | @@ -5307,10 +5324,10 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp |
| 5307 | AstNode *impl_decl_node = entry->value; | 5324 | AstNode *impl_decl_node = entry->value; |
| 5308 | if (impl_decl_node->type == NodeTypeFnProto) { | 5325 | if (impl_decl_node->type == NodeTypeFnProto) { |
| 5309 | FnTableEntry *fn_table_entry = impl_decl_node->data.fn_proto.fn_table_entry; | 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 | } else if (impl_decl_node->type == NodeTypeStructDecl) { | 5328 | } else if (impl_decl_node->type == NodeTypeStructDecl) { |
| 5312 | TypeTableEntry *type_entry = impl_decl_node->data.struct_decl.type_entry; | 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 | } else { | 5331 | } else { |
| 5315 | zig_unreachable(); | 5332 | zig_unreachable(); |
| 5316 | } | 5333 | } |
| ... | @@ -5324,14 +5341,14 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp | ... | @@ -5324,14 +5341,14 @@ static TypeTableEntry *analyze_generic_fn_call(CodeGen *g, ImportTableEntry *imp |
| 5324 | preview_fn_proto_instance(g, import, impl_decl_node, child_context); | 5341 | preview_fn_proto_instance(g, import, impl_decl_node, child_context); |
| 5325 | g->generic_table.put(generic_fn_type_id, impl_decl_node); | 5342 | g->generic_table.put(generic_fn_type_id, impl_decl_node); |
| 5326 | FnTableEntry *fn_table_entry = impl_decl_node->data.fn_proto.fn_table_entry; | 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 | } else if (decl_node->type == NodeTypeStructDecl) { | 5345 | } else if (decl_node->type == NodeTypeStructDecl) { |
| 5329 | AstNode *impl_decl_node = ast_clone_subtree(decl_node, &g->next_node_index); | 5346 | AstNode *impl_decl_node = ast_clone_subtree(decl_node, &g->next_node_index); |
| 5330 | g->generic_table.put(generic_fn_type_id, impl_decl_node); | 5347 | g->generic_table.put(generic_fn_type_id, impl_decl_node); |
| 5331 | scan_struct_decl(g, import, child_context, impl_decl_node); | 5348 | scan_struct_decl(g, import, child_context, impl_decl_node); |
| 5332 | TypeTableEntry *type_entry = impl_decl_node->data.struct_decl.type_entry; | 5349 | TypeTableEntry *type_entry = impl_decl_node->data.struct_decl.type_entry; |
| 5333 | resolve_struct_type(g, import, type_entry); | 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 | } else { | 5352 | } else { |
| 5336 | zig_unreachable(); | 5353 | zig_unreachable(); |
| 5337 | } | 5354 | } |
| ... | @@ -5480,7 +5497,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo | ... | @@ -5480,7 +5497,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo |
| 5480 | return g->builtin_types.entry_invalid; | 5497 | return g->builtin_types.entry_invalid; |
| 5481 | } else { | 5498 | } else { |
| 5482 | return resolve_expr_const_val_as_type(g, node, | 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 | } else if (child_type->id == TypeTableEntryIdNumLitInt || | 5502 | } else if (child_type->id == TypeTableEntryIdNumLitInt || |
| 5486 | child_type->id == TypeTableEntryIdNumLitFloat) | 5503 | child_type->id == TypeTableEntryIdNumLitFloat) |
| ... | @@ -5520,7 +5537,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo | ... | @@ -5520,7 +5537,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo |
| 5520 | add_node_error(g, node, buf_create_from_str("unable to wrap unreachable in maybe type")); | 5537 | add_node_error(g, node, buf_create_from_str("unable to wrap unreachable in maybe type")); |
| 5521 | return g->builtin_types.entry_invalid; | 5538 | return g->builtin_types.entry_invalid; |
| 5522 | } else { | 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 | } else if (type_entry->id == TypeTableEntryIdUnreachable) { | 5542 | } else if (type_entry->id == TypeTableEntryIdUnreachable) { |
| 5526 | add_node_error(g, *expr_node, buf_sprintf("unable to wrap unreachable in maybe type")); | 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,7 +5565,7 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo |
| 5548 | add_node_error(g, node, buf_create_from_str("unable to wrap unreachable in error type")); | 5565 | add_node_error(g, node, buf_create_from_str("unable to wrap unreachable in error type")); |
| 5549 | return g->builtin_types.entry_invalid; | 5566 | return g->builtin_types.entry_invalid; |
| 5550 | } else { | 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 | } else if (type_entry->id == TypeTableEntryIdUnreachable) { | 5570 | } else if (type_entry->id == TypeTableEntryIdUnreachable) { |
| 5554 | add_node_error(g, *expr_node, buf_sprintf("unable to wrap unreachable in error type")); | 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,10 +6176,10 @@ static TypeTableEntry *analyze_expression_pointer_only(CodeGen *g, ImportTableEn |
| 6159 | return_type = analyze_fn_proto_expr(g, import, context, expected_type, node); | 6176 | return_type = analyze_fn_proto_expr(g, import, context, expected_type, node); |
| 6160 | break; | 6177 | break; |
| 6161 | case NodeTypeErrorType: | 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 | break; | 6180 | break; |
| 6164 | case NodeTypeTypeLiteral: | 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 | break; | 6183 | break; |
| 6167 | case NodeTypeSwitchExpr: | 6184 | case NodeTypeSwitchExpr: |
| 6168 | return_type = analyze_switch_expr(g, import, context, expected_type, node); | 6185 | return_type = analyze_switch_expr(g, import, context, expected_type, node); |