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.
bool result = false;
    for (const auto& spk_man  GetActiveScriptPubKeyMans()) {
        if (!spk_man->IsHDEnabled()) return false;
        result = true;
    }
    return result;
}
bool CWalletCanGetAddresses(bool internal) const
{
    LOCK(cs_);
    if (m_spk_managers.empty()) return false;
    for (OutputType t  OUTPUT_TYPES) {
        auto spk_man = GetScriptPubKeyMan(t, internal);
        if (spk_man && spk_man->CanGetAddresses(internal)) {
            return true;
        }
    }
    return false;
}
void CWalletSetWalletFlag(uint64_t flags)
{
    LOCK(cs_);
    m__flags |= flags;
    if (!WalletBatch(GetDatabase()).WriteWalletFlags(m__flags))
        throw stdruntime_error(stdstring(__func__) + " writing  flags failed");
}
void CWalletUnsetWalletFlag(uint64_t flag)
{
    WalletBatch batch(GetDatabase());
    UnsetWalletFlagWithDB(batch, flag);