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.
// I
            for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
                stdpair<TxSpendsconst_iterator, TxSpendsconst_iterator> range = mapTxSpends.equal_range(COutPoint(now, i));
                for (TxSpendsconst_iterator iter = range.first; iter != range.second; ++iter) {
                    if (!done.count(iter->second)) {
                        todo.insert(iter->second);
                    }
                }
            }
            // I
            // a
            MarkInputsDirty(wtx.tx);
        }
    }
}
void CWalletSyncTransaction(const CTransactionRef& ptx, const SyncTxState& state, bool update_tx, bool rescanning_old_block)
{
    if (!AddToWalletInvolvingMe(ptx, state, update_tx, rescanning_old_block))
        return; // N
    // I
    // a
    // r
    MarkInputsDirty(ptx);
}
void CWallettransactionAddedToMempool(const CTransactionRef& tx) {
    LOCK(cs_);
    SyncTransaction(tx, TxStateInMempool{});
    auto it = mapWallet.find(tx->GetHash());
    if (it != mapWallet.end()) {
        RefreshMempoolStatus(it->second, chain());