Skip to content

Commit c1df71a

Browse files
authored
checker, cgen: fix if define comptime checking (fix #22906) (#22946)
1 parent 1345eac commit c1df71a

File tree

7 files changed

+47
-6
lines changed

7 files changed

+47
-6
lines changed

vlib/v/checker/comptime.v

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,15 @@ fn (mut c Checker) comptime_if_cond(mut cond ast.Expr, pos token.Pos) ComptimeBr
742742
should_record_ident = true
743743
is_user_ident = true
744744
ident_name = cond.expr.name
745-
return if cond.expr.name in c.pref.compile_defines_all { .eval } else { .skip }
745+
return if cond.expr.name in c.pref.compile_defines {
746+
.eval
747+
} else {
748+
if cond.expr.name in c.pref.compile_defines_all {
749+
ComptimeBranchSkipState.unknown
750+
} else {
751+
ComptimeBranchSkipState.skip
752+
}
753+
}
746754
} else {
747755
c.error('invalid `\$if` condition', cond.pos)
748756
}

vlib/v/gen/c/comptime.v

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,12 +511,17 @@ fn (mut g Gen) comptime_if_cond(cond ast.Expr, pkg_exist bool) (bool, bool) {
511511
return is_cond_true, false
512512
}
513513
ast.PostfixExpr {
514-
ifdef := g.comptime_if_to_ifdef((cond.expr as ast.Ident).name, true) or {
514+
dname := (cond.expr as ast.Ident).name
515+
ifdef := g.comptime_if_to_ifdef(dname, true) or {
515516
verror(err.str())
516517
return false, true
517518
}
518519
g.write('defined(${ifdef})')
519-
return true, false
520+
if dname in g.pref.compile_defines_all && dname !in g.pref.compile_defines {
521+
return false, true
522+
} else {
523+
return true, false
524+
}
520525
}
521526
ast.InfixExpr {
522527
match cond.op {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
some_define was not passed
2+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module main
2+
3+
// vtest vflags: -d some_define=
4+
5+
fn main() {
6+
$if some_define ? {
7+
println('some_define was passed')
8+
} $else {
9+
println('some_define was not passed')
10+
}
11+
println($d('some_define', 'unknown'))
12+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
some_define was passed
2+
true
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module main
2+
3+
// vtest vflags: -d some_define
4+
5+
fn main() {
6+
$if some_define ? {
7+
println('some_define was passed')
8+
} $else {
9+
println('some_define was not passed')
10+
}
11+
println($d('some_define', 'unknown'))
12+
}

vlib/v/pref/pref.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin
438438
'-nofloat' {
439439
res.nofloat = true
440440
res.compile_defines_all << 'nofloat' // so that `$if nofloat? {` works
441+
res.compile_defines << 'nofloat'
441442
}
442443
'-fast-math' {
443444
res.fast_math = true
@@ -1228,11 +1229,10 @@ fn (mut prefs Preferences) parse_define(define string) {
12281229
prefs.compile_values[dname] = dvalue
12291230
prefs.compile_defines_all << dname
12301231
match dvalue {
1231-
'0' {}
1232-
'1' {
1232+
'' {}
1233+
else {
12331234
prefs.compile_defines << dname
12341235
}
1235-
else {}
12361236
}
12371237
}
12381238

0 commit comments

Comments
 (0)