tcStmt ret (ReturnStatement l (Just e)) = tcStmtBlock l "return statement" $ do
    e' <- withExprC ReadWriteExpr $ tcExpr Nothing e
    let et' = typed $ loc e'
    ppe <- pp e
    x <- tcCoerces l True Nothing (fmap typed e') ret
    let t = StmtType (Set.singleton $ StmtReturn)
    let ex = fmap (Typed l) x
    let ret = ReturnStatement (Typed l t) (Just ex)
    return (ret,t)
tcStmt ret (ReturnStatement l (Just e)) = tcStmtBlock l "return statement" $ do
    e' <- withExprC ReadWriteExpr $ tcExpr Nothing e
    let et' = typed $ loc e'
    ppe <- pp e
    x <- tcCoerces l True Nothing (fmap typed e') ret
    let t = StmtType (Set.singleton $ StmtReturn)
    let ex = fmap (Typed l) x
    let ret = ReturnStatement (Typed l t) (Just ex)
    return (ret,t)
tcStmt ret (ReturnStatement l (Just e)) = tcStmtBlock l "return statement" $ do
    e' <- withExprC ReadWriteExpr $ tcExpr Nothing e
    let et' = typed $ loc e'
    ppe <- pp e
    x <- tcCoerces l True Nothing (fmap typed e') ret
    let t = StmtType (Set.singleton $ StmtReturn)
    let ex = fmap (Typed l) x
    let ret = ReturnStatement (Typed l t) (Just ex)
    return (ret,t)