tcStmt ret (ExpressionStatement l e) = tcStmtBlock l "expression statement" $ do
    e' <- withExprC ReadWriteExpr $ tcExpr Nothing e
    let te = typed $ loc e'
    --case e of
    --    BinaryAssign {} -> return ()
    --    otherwise -> topTcCstrM_ l $ Unifies te (ComplexT Void)
    let t = StmtType (Set.singleton $ StmtFallthru te)
    return (ExpressionStatement (Typed l t) e',t)
tcStmt ret (ExpressionStatement l e) = tcStmtBlock l "expression statement" $ do
    e' <- withExprC ReadWriteExpr $ tcExpr Nothing e
    let te = typed $ loc e'
    --case e of
    --    BinaryAssign {} -> return ()
    --    otherwise -> topTcCstrM_ l $ Unifies te (ComplexT Void)
    let t = StmtType (Set.singleton $ StmtFallthru te)
    return (ExpressionStatement (Typed l t) e',t)
tcStmt ret (ExpressionStatement l e) = tcStmtBlock l "expression statement" $ do
    e' <- withExprC ReadWriteExpr $ tcExpr Nothing e
    let te = typed $ loc e'
    --case e of
    --    BinaryAssign {} -> return ()
    --    otherwise -> topTcCstrM_ l $ Unifies te (ComplexT Void)
    let t = StmtType (Set.singleton $ StmtFallthru te)
    return (ExpressionStatement (Typed l t) e',t)