When a block reward is spent together with other outputs in the wallet and that block reward is later orphaned, the wallet does not show the other funds as available anymore.  Even a `-rescan` is not enough - only `-zapwallettxes` or an explicit `abandontransaction` "recovers" the funds.  I prepared a [test case](https://github.com/domob1812/bitcoin/blob/wallet-bug-invalidated-block-rewards/test/functional/wallet_bug.py) that shows this behaviour.

Is this a known issue or the expected behaviour?  While this situation is something that will presumably not occur in practice (as it requires a long reorg), I wonder if that transaction should be automatically abandoned as it seems clear it won't be able to be confirmed anymore.
SyncTransaction(ptx, TxStateInactive{});
    }
}
void CWalletupdatedBlockTip()
{
    m_best_block_time = GetTime();
}
void CWalletBlockUntilSyncedToCurrentChain() const {
    AssertLockNotHeld(cs_);
    // S
    // c
    // f
    // a
    uint256 last_block_hash = WITH_LOCK(cs_, return m_last_block_processed);
    chain().waitForNotificationsTipChanged(last_block_hash);
}
// Note that this function doesn't distinguish between a 0-valued input,
// and a not-"is mine" (according to the filter) input.
CAmount CWalletGetDebit(const CTxIn &txin, const isminefilter& filter) const
{
    {
        LOCK(cs_);
        const auto mi = mapWallet.find(txin.prevout.hash);
        if (mi != mapWallet.end())
        {
            const CWalletTx& prev = (*mi).second;
            if (txin.prevout.n < prev.tx->vout.size())
                if (IsMine(prev.tx->vout[txin.prevout.n]) & filter)
                    return prev.tx->vout[txin.prevout.n].nValue;
        }