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.
{
            nOrderPos = nOrderPosNext++;
            nOrderPosOffsets.push_back(nOrderPos);
            if (!batch.WriteTx(*pwtx))
                return DBErrorsLOAD_FAIL;
        }
        else
        {
            int64_t nOrderPosOff = 0;
            for (const int64_t& nOffsetStart  nOrderPosOffsets)
            {
                if (nOrderPos >= nOffsetStart)
                    ++nOrderPosOff;
            }
            nOrderPos += nOrderPosOff;
            nOrderPosNext = stdmax(nOrderPosNext, nOrderPos + 1);
            if (!nOrderPosOff)
                continue;
            // S
            if (!batch.WriteTx(*pwtx))
                return DBErrorsLOAD_FAIL;
        }
    }
    batch.WriteOrderPosNext(nOrderPosNext);
    return DBErrorsLOAD_OK;
}
int64_t CWalletIncOrderPosNext(WalletBatch* batch)
{
    AssertLockHeld(cs_);
    int64_t nRet = nOrderPosNext++;