checker: do not skip any of the top level `$if OS {` branches in `-os cross` mode
parent
f5776eb259
commit
c797e1460d
|
@ -77,6 +77,7 @@ pub mut:
|
|||
inside_fn_arg bool // `a`, `b` in `a.f(b)`
|
||||
inside_ct_attr bool // true inside [if expr]
|
||||
skip_flags bool // should `#flag` and `#include` be skipped
|
||||
fn_level int // 0 for the top level, 1 for `fn abc() {}`, 2 for a nested fn, etc
|
||||
mut:
|
||||
files []ast.File
|
||||
expr_level int // to avoid infinite recursion segfaults due to compiler bugs
|
||||
|
@ -4467,10 +4468,7 @@ fn (mut c Checker) stmt(node ast.Stmt) {
|
|||
for i, ident in node.defer_vars {
|
||||
mut id := ident
|
||||
if id.info is ast.IdentVar {
|
||||
if id.comptime && (id.name in checker.valid_comp_if_compilers
|
||||
|| id.name in checker.valid_comp_if_os
|
||||
|| id.name in checker.valid_comp_if_other
|
||||
|| id.name in checker.valid_comp_if_platforms) {
|
||||
if id.comptime && id.name in checker.valid_comp_not_user_defined {
|
||||
node.defer_vars[i] = ast.Ident{
|
||||
scope: 0
|
||||
name: ''
|
||||
|
@ -6548,6 +6546,12 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
|
|||
} else if !is_comptime_type_is_expr {
|
||||
found_branch = true // If a branch wasn't skipped, the rest must be
|
||||
}
|
||||
if c.fn_level == 0 && c.pref.output_cross_c {
|
||||
// do not skip any of the branches for top level `$if OS {`
|
||||
// statements, in `-os cross` mode
|
||||
found_branch = false
|
||||
c.skip_flags = false
|
||||
}
|
||||
if !c.skip_flags {
|
||||
c.stmts(branch.stmts)
|
||||
} else if c.pref.output_cross_c {
|
||||
|
@ -6764,7 +6768,12 @@ fn (mut c Checker) comp_if_branch(cond ast.Expr, pos token.Position) bool {
|
|||
ast.Ident {
|
||||
cname := cond.name
|
||||
if cname in checker.valid_comp_if_os {
|
||||
return cname != c.pref.os.str().to_lower()
|
||||
mut is_os_target_different := false
|
||||
if !c.pref.output_cross_c {
|
||||
target_os := c.pref.os.str().to_lower()
|
||||
is_os_target_different = cname != target_os
|
||||
}
|
||||
return is_os_target_different
|
||||
} else if cname in checker.valid_comp_if_compilers {
|
||||
return pref.cc_from_string(cname) != c.pref.ccompiler_type
|
||||
} else if cname in checker.valid_comp_if_platforms {
|
||||
|
@ -7763,7 +7772,13 @@ fn (mut c Checker) evaluate_once_comptime_if_attribute(mut a ast.Attr) bool {
|
|||
}
|
||||
|
||||
fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
||||
c.fn_level++
|
||||
defer {
|
||||
c.fn_level--
|
||||
}
|
||||
//
|
||||
c.returns = false
|
||||
|
||||
if node.generic_names.len > 0 && c.table.cur_concrete_types.len == 0 {
|
||||
// Just remember the generic function for now.
|
||||
// It will be processed later in c.post_process_generic_fns,
|
||||
|
|
|
@ -154,7 +154,7 @@ pub mut:
|
|||
custom_prelude string // Contents of custom V prelude that will be prepended before code in resulting .c files
|
||||
lookup_path []string
|
||||
bare_builtin_dir string // Path to implementation of malloc, memset, etc. Only used if is_bare is true
|
||||
output_cross_c bool
|
||||
output_cross_c bool // true, when the user passed `-os cross`
|
||||
prealloc bool
|
||||
vroot string
|
||||
out_name_c string // full os.real_path to the generated .tmp.c file; set by builder.
|
||||
|
|
Loading…
Reference in New Issue