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_fn_arg bool // `a`, `b` in `a.f(b)`
|
||||||
inside_ct_attr bool // true inside [if expr]
|
inside_ct_attr bool // true inside [if expr]
|
||||||
skip_flags bool // should `#flag` and `#include` be skipped
|
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:
|
mut:
|
||||||
files []ast.File
|
files []ast.File
|
||||||
expr_level int // to avoid infinite recursion segfaults due to compiler bugs
|
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 {
|
for i, ident in node.defer_vars {
|
||||||
mut id := ident
|
mut id := ident
|
||||||
if id.info is ast.IdentVar {
|
if id.info is ast.IdentVar {
|
||||||
if id.comptime && (id.name in checker.valid_comp_if_compilers
|
if id.comptime && id.name in checker.valid_comp_not_user_defined {
|
||||||
|| id.name in checker.valid_comp_if_os
|
|
||||||
|| id.name in checker.valid_comp_if_other
|
|
||||||
|| id.name in checker.valid_comp_if_platforms) {
|
|
||||||
node.defer_vars[i] = ast.Ident{
|
node.defer_vars[i] = ast.Ident{
|
||||||
scope: 0
|
scope: 0
|
||||||
name: ''
|
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 {
|
} else if !is_comptime_type_is_expr {
|
||||||
found_branch = true // If a branch wasn't skipped, the rest must be
|
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 {
|
if !c.skip_flags {
|
||||||
c.stmts(branch.stmts)
|
c.stmts(branch.stmts)
|
||||||
} else if c.pref.output_cross_c {
|
} 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 {
|
ast.Ident {
|
||||||
cname := cond.name
|
cname := cond.name
|
||||||
if cname in checker.valid_comp_if_os {
|
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 {
|
} else if cname in checker.valid_comp_if_compilers {
|
||||||
return pref.cc_from_string(cname) != c.pref.ccompiler_type
|
return pref.cc_from_string(cname) != c.pref.ccompiler_type
|
||||||
} else if cname in checker.valid_comp_if_platforms {
|
} 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) {
|
fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
||||||
|
c.fn_level++
|
||||||
|
defer {
|
||||||
|
c.fn_level--
|
||||||
|
}
|
||||||
|
//
|
||||||
c.returns = false
|
c.returns = false
|
||||||
|
|
||||||
if node.generic_names.len > 0 && c.table.cur_concrete_types.len == 0 {
|
if node.generic_names.len > 0 && c.table.cur_concrete_types.len == 0 {
|
||||||
// Just remember the generic function for now.
|
// Just remember the generic function for now.
|
||||||
// It will be processed later in c.post_process_generic_fns,
|
// 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
|
custom_prelude string // Contents of custom V prelude that will be prepended before code in resulting .c files
|
||||||
lookup_path []string
|
lookup_path []string
|
||||||
bare_builtin_dir string // Path to implementation of malloc, memset, etc. Only used if is_bare is true
|
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
|
prealloc bool
|
||||||
vroot string
|
vroot string
|
||||||
out_name_c string // full os.real_path to the generated .tmp.c file; set by builder.
|
out_name_c string // full os.real_path to the generated .tmp.c file; set by builder.
|
||||||
|
|
Loading…
Reference in New Issue