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.
copyTo->vOrderForm = copyFrom->vOrderForm;
        // f
        // n
        copyTo->nTimeSmart = copyFrom->nTimeSmart;
        copyTo->fFromMe = copyFrom->fFromMe;
        // n
        // c
    }
}
/**
 * Outpoint is s if any non-conflicted transaction
 * spends it
 */
bool CWalletIsS(const COutPoint& outpoint) const
{
    stdpair<TxSpendsconst_iterator, TxSpendsconst_iterator> range;
    range = mapTxSpends.equal_range(outpoint);
    for (TxSpendsconst_iterator it = range.first; it != range.second; ++it) {
        const uint256& wtxid = it->second;
        const auto mit = mapWallet.find(wtxid);
        if (mit != mapWallet.end()) {
            int depth = GetTxDepthInMainChain(mit->second);
            if (depth > 0  || (depth == 0 && !mit->second.isAbandoned()))
                return true; // S
        }
    }
    return false;
}
void CWalletAddToSpends(const COutPoint& outpoint, const uint256& wtxid, WalletBatch* batch)
{