@@ -685,6 +685,23 @@ fn (mut g Gen) comptime_if_cond(cond ast.Expr, pkg_exist bool) (bool, bool) {
685685 g.write (' ${cond .op } ' )
686686 r , d2 := g.comptime_if_cond (cond.right, pkg_exist)
687687 return if cond.op == .eq { l == r } else { l != r }, d1 && d1 == d2
688+ }
689+ if cond.left is ast.SizeOf && cond.left.typ != 0
690+ && cond.right is ast.IntegerLiteral {
691+ // TODO: support struct.fieldname
692+ s , _ := g.table.type_size (g.unwrap_generic (cond.left.typ))
693+ right := cond.right as ast.IntegerLiteral
694+ is_true := match cond.op {
695+ .eq { s == right.val.i64 () }
696+ .ne { s != right.val.i64 () }
697+ else { false }
698+ }
699+ if is_true {
700+ g.write ('1' )
701+ } else {
702+ g.write ('0' )
703+ }
704+ return is_true, true
688705 } else {
689706 g.write ('1' )
690707 return true , true
@@ -748,6 +765,25 @@ fn (mut g Gen) comptime_if_cond(cond ast.Expr, pkg_exist bool) (bool, bool) {
748765 g.write ('0' )
749766 }
750767 return is_true, true
768+ }
769+ if cond.left is ast.SizeOf && cond.left.typ != 0
770+ && cond.right is ast.IntegerLiteral {
771+ // TODO: support struct.fieldname
772+ s , _ := g.table.type_size (g.unwrap_generic (cond.left.typ))
773+ right := cond.right as ast.IntegerLiteral
774+ is_true := match cond.op {
775+ .gt { s > right.val.i64 () }
776+ .lt { s < right.val.i64 () }
777+ .ge { s > = right.val.i64 () }
778+ .le { s < = right.val.i64 () }
779+ else { false }
780+ }
781+ if is_true {
782+ g.write ('1' )
783+ } else {
784+ g.write ('0' )
785+ }
786+ return is_true, true
751787 } else {
752788 return true , false
753789 }
0 commit comments