tcStmt ret (DowhileStatement l ann bodyS condE) = tcStmtBlock l "do while statement" $ tcLocal l "tcStmt dowhile" $ do
    ((ann',bodyS',t',condE'),rs,ws) <- withDecClassVars $ do
        ann' <- mapM tcLoopAnn ann
        (bodyS',t') <- tcLoopBodyStmt ret l bodyS
        condE' <- tcGuard condE
        return (ann',bodyS',t',condE')
    debugTc $ do
        ppl <- ppr l
        pprs <- pp rs
        ppws <- pp ws
        liftIO $ putStrLn $ "whileT " ++ ppl ++ ": " ++ show pprs ++ "  :  " ++ show ppws
    return (DowhileStatement (Typed l $ WhileT rs ws) ann' bodyS' condE',t')
tcStmt ret (DowhileStatement l ann bodyS condE) = tcStmtBlock l "do while statement" $ tcLocal l "tcStmt dowhile" $ do
    ((ann',bodyS',t',condE'),rs,ws) <- withDecClassVars $ do
        ann' <- mapM tcLoopAnn ann
        (bodyS',t') <- tcLoopBodyStmt ret l bodyS
        condE' <- tcGuard condE
        return (ann',bodyS',t',condE')
    debugTc $ do
        ppl <- ppr l
        pprs <- pp rs
        ppws <- pp ws
        liftIO $ putStrLn $ "whileT " ++ ppl ++ ": " ++ show pprs ++ "  :  " ++ show ppws
    return (DowhileStatement (Typed l $ WhileT rs ws) ann' bodyS' condE',t')
tcStmt ret (DowhileStatement l ann bodyS condE) = tcStmtBlock l "do while statement" $ tcLocal l "tcStmt dowhile" $ do
    ((ann',bodyS',t',condE'),rs,ws) <- withDecClassVars $ do
        ann' <- mapM tcLoopAnn ann
        (bodyS',t') <- tcLoopBodyStmt ret l bodyS
        condE' <- tcGuard condE
        return (ann',bodyS',t',condE')
    debugTc $ do
        ppl <- ppr l
        pprs <- pp rs
        ppws <- pp ws
        liftIO $ putStrLn $ "whileT " ++ ppl ++ ": " ++ show pprs ++ "  :  " ++ show ppws
    return (DowhileStatement (Typed l $ WhileT rs ws) ann' bodyS' condE',t')