authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-05-15 00:25:13-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-05-15 00:25:13-07:00
log7f90dbbb11456f13eab2588ceb075e55dab93958
tree4c47a6444f0d4ac1da44fd8611a11f12c92fc1ce
parent6ae6b5f5b546ab63311b6b08281f5962c9d24667

switch on compile var marks entire namespaces

as depending on compile vars. closes #154

4 files changed, 71 insertions(+), 38 deletions(-)

src/analyze.cpp+55-38
...@@ -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 *
30static TypeTableEntry *analyze_block_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,30static TypeTableEntry *analyze_block_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,
31 TypeTableEntry *expected_type, AstNode *node);31 TypeTableEntry *expected_type, AstNode *node);
32static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node);32static TypeTableEntry *resolve_expr_const_val_as_void(CodeGen *g, AstNode *node);
33static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn);33static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn,
34static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type);34 bool depends_on_compile_var);
35static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type,
36 bool depends_on_compile_var);
35static TypeTableEntry *resolve_expr_const_val_as_unsigned_num_lit(CodeGen *g, AstNode *node,37static 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);
37static AstNode *find_decl(BlockContext *context, Buf *name);39static AstNode *find_decl(BlockContext *context, Buf *name);
38static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNode *decl_node,40static 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);
40static TopLevelDecl *get_as_top_level_decl(AstNode *node);42static TopLevelDecl *get_as_top_level_decl(AstNode *node);
41static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTableEntry *import,43static 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
25872589
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 case2656 } 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}
27722775
2773static TypeTableEntry *resolve_expr_const_val_as_type(CodeGen *g, AstNode *node, TypeTableEntry *type) {2776static 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}
27792785
2780static TypeTableEntry *resolve_expr_const_val_as_other_expr(CodeGen *g, AstNode *node, AstNode *other) {2786static 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}
27862796
2787static TypeTableEntry *resolve_expr_const_val_as_fn(CodeGen *g, AstNode *node, FnTableEntry *fn) {2797static 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}
27932806
2794static TypeTableEntry *resolve_expr_const_val_as_generic_fn(CodeGen *g, AstNode *node,2807static 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}
28022816
...@@ -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}
29232937
2924static TypeTableEntry *analyze_var_ref(CodeGen *g, AstNode *source_node, VariableTableEntry *var,2938static 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}
29392954
2940static TypeTableEntry *analyze_decl_ref(CodeGen *g, AstNode *source_node, AstNode *decl_node,2955static 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
29482963
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 }
29833000
2984 Buf *variable_name = &node->data.symbol_expr.symbol;3001 Buf *variable_name = &node->data.symbol_expr.symbol;
29853002
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 }
29903007
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 }
29963013
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 }
30013018
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}
38373854
...@@ -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 }
38463863
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}
38493866
3850static TypeTableEntry *analyze_while_expr(CodeGen *g, ImportTableEntry *import, BlockContext *context,3867static 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);
test/a.zig created+1
...@@ -0,0 +1 @@
1pub const a_bool = true;
test/b.zig created+1
...@@ -0,0 +1 @@
1pub const a_bool = false;
test/self_hosted.zig+14
...@@ -1656,3 +1656,17 @@ fn use_generic_param_in_generic_param() {...@@ -1656,3 +1656,17 @@ fn use_generic_param_in_generic_param() {
1656fn a_generic_fn(T: type, a: T)(b: T) -> T {1656fn a_generic_fn(T: type, a: T)(b: T) -> T {
1657 return a + b;1657 return a + b;
1658}1658}
1659
1660
1661#attribute("test")
1662fn namespace_depends_on_compile_var() {
1663 if (some_namespace.a_bool) {
1664 assert(some_namespace.a_bool);
1665 } else {
1666 assert(!some_namespace.a_bool);
1667 }
1668}
1669const some_namespace = switch(@compile_var("os")) {
1670 linux => @import("a.zig"),
1671 else => @import("b.zig"),
1672};