<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55684>55684</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            libc++: std::any_cast fails to cast T* when non-executed code is linked into binary (cause unknown)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          luke-jr
      </td>
    </tr>
</table>

<pre>
    I have failed to find a way to reproduce this in a small test case, so all I can do is provide the code that breaks, a workaround for the issue, and description of what appears to be happening.

Broken git branch: https://github.com/luke-jr/bitcoin/tree/20220524-libc++bug-reproduce%5E
Workaround: https://github.com/luke-jr/bitcoin/commit/e73777b38c64e7309582c078f51ddb0c52a948ae

If `sweepprivkeys` is linked in (not even executed) that assigns `wallet_req.context` (a `std::any`) to a `WalletLoader*`, *all* attempts to any_cast `.context` in `EnsureWalletContext` (`src/wallet/rpc/util.cpp`) return nullptr due to a different `type_info` object being used, *even* for the "normal" codepath through `registerRpcs` that works fine if `sweepprivkeys` is excluded from the project (simply deleting the one assignment of `.context` is sufficient; again, note that `sweepprivkeys` is never actually executed in this scenario - it simply exists in the program).

Note that the workaround does *not* resolve the issue unless `assignContextHACK` also replaces the assignment in `registerRpcs` - using it in `sweepprivkeys` alone is insufficient.

To reproduce:

`./autogen.sh && ./configure '--enable-external-signer' '--enable-suppress-external-warnings' '--enable-zmq' 'CPPFLAGS=-DARENA_DEBUG -DDEBUG_LOCKORDER' 'CXXFLAGS=-g'  'CC=clang' 'CXX=clang++ -stdlib=libc++' '--disable-shared' '--with-pic' '--enable-benchmark=no' --without-bdb && make -j16 && test/functional/wallet_create_tx.py --descriptors`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVUtv2zgQ_jXyhZChyPHr4INjJ92iRbvIdtHeDIoayaxlUiWpON5fv99QfqVF97CAYJMznJlv3oUtj4v3YitfSFRSN1SKYEWlTSmkOMgj3xy1zpadIhG22gttwPJ72TQikA9CSU9JvhLeCqa9B8GI0go8hdyLLlmOhLLxIIMoHMmdZxGYsG4nne1gr7IuPtTed1GhBLEkr5xug7ZG2EocWF62LUnnGVpBgI6r0aYeJtk6yZb974OzOzKi1mxOGrVNRkuxDaH1OCT5Ez7wtl0xVHaPS9PtKP3ucCp0UFYbnIIj4HjKszzPxvl92uhCJfkDvqKr00tUknw8fuytfr148z_MgbPXAQeajqbTaTGaqck9ztl8PMtVNp1V47uyLDI1zuX8fibp1t_3lUgmmT8Qta3TLzs6etw5B402O2QVWUvymbFB0AsCQ6-kukBlks_7pEjvdW08azkgjRQ2jn4ArQn0GlgVpGW0Edg5fNIccY0KkHlmfY2CH60sCa4tI3cFwSXo-BUyBNq3IWYO0htUTmC5WzOMc5I9Gt856vWt3mBgBA5peOpR4uBavnZBN0PVtidIjkLnjDBd07TBibKjHmWpq4ocmWg3HFvaaFNZ1m2L76RQLYRSEp3n0ETsHC4Gfy7PJM-NdSh_HGJRtzJswUHa6y1rdVRrH8g9tyrmIIaX69xzX6G-f5sqelVNVyJZlbP7aAwlFlHBca_3bXNEQ8BrhshsC3V94vbskq1-iaYXvqsqrTT4yehByFpysa0EKuHUjr8BY-C4E1KFDoE-XgqGExTHgFdkpNNWpAJNdkJHr3Dd928i-tpJ1Pv8TW9-upjmRzcToLTkOeTAxhF35G3zQtehIDrTkI812nt9Ko0_lqsPjFo2Pk6rRiooYrGb4PSF9XNyUqSao6nPD34JhWw4ynHuXUP5xp8vNyOSW-OGxelAccou2JrM0KNA8gk-MYwNbypdo85BnKYpwlk0lMIfckY2KSPnPpq-YfsO6BCE67uDdDz-_M8v_9n_OJFWf_759HH57q9ktE7Xy-fHT8vN-vHh73ciXcf_zcfPqw-fn9ePz2eBb98uAjXTInGFq2qkqa-vrhQeiyLFcMCUBPU6Ky-wSu17D7bScXedyAfMxbTV6mf4BWFq76XbQZuxzO3f2i6kRVmcA7mXOxLp97vJmcA7CcGtOqN4a3CfnmbFRmHxBNqE12F7hLbzbrGOEz0oF6NyPprLQdChocWNB5jlt1Ovn1u8LeMki7cvXLCHLSarsSa9NEtcerdDmHeWRt8cuaWVxJxBUe-MPaAp54PONYv_2hrNy_kvPU0GXGNrIPtP4_Fkdj_YLoq8oFwWVTHKJnR_d1eU42mVjWfzMs8yKseDRhbU-EUyfuBhRofzys2T8XqgF-eFF3_z4VQiLtOiIIXgzNUsuc9oD-eHjGNoXT1wiwgJW9GD2fAIuDL7FiSK5qAfvbC1kOg34CCaXkTo_wJfrskV">