症状
top-level の not(...) 式を _boolean 結果型で評価すると常に false を返す(P4-typed インタプリタ)。if(...) 文脈内の not(...) は正常。
not(false) -> false (正解 true) [p4-typed]
not(true) -> false (正解 false) ※偶然一致
not(not(true)) -> false (正解 true) [p4-typed]
not(1>2) -> false (正解 true) [p4-typed]
if(not(false)){1}else{0} -> 1 (正常)
if(not(true)){1}else{0} -> 0 (正常)
if(not(not(true))){1}else{0} -> 1 (正常)
javacode バックエンドでは not(false) = true(正しい)。インタプリタのみ誤り。
推定原因
evalNotExpr (!toBoolean(eval(value))) と toBoolean 自体は正しい。standalone not(...) を root として評価する際、findBestMappedToken/preferred-root 選択が外側 NotExpr を選ばず内側オペランドを評価していると推定(not(not(true)) が内側 not(true)=false に化けるのと整合)。top-level Expression の型ディスパッチ(#23)と関連の可能性。
再現テスト
KnownP4BugsTest.standaloneNotReturnsFalse(@ignore)に収録。GrammarCoverageInterpreterTest は if(not(...)) 形式でカバレッジ維持。
症状
top-level の
not(...)式を_boolean結果型で評価すると常に false を返す(P4-typed インタプリタ)。if(...)文脈内のnot(...)は正常。javacode バックエンドでは
not(false)= true(正しい)。インタプリタのみ誤り。推定原因
evalNotExpr(!toBoolean(eval(value))) とtoBoolean自体は正しい。standalonenot(...)を root として評価する際、findBestMappedToken/preferred-root 選択が外側 NotExpr を選ばず内側オペランドを評価していると推定(not(not(true)) が内側 not(true)=false に化けるのと整合)。top-level Expression の型ディスパッチ(#23)と関連の可能性。再現テスト
KnownP4BugsTest.standaloneNotReturnsFalse(@ignore)に収録。GrammarCoverageInterpreterTestはif(not(...))形式でカバレッジ維持。