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

    <tr>
        <th>Summary</th>
        <td>
            libc++ 18 iostream compatiblity
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          wang-bin
      </td>
    </tr>
</table>

<pre>
    Since libc++13, iostream classes(for example`basic_ifstream<char>`) explicitly instantiations exist in libc++ shared library. When building user code with libc++ <= 17, instantiations are in user code by default unless targeting `_LIBCPP_ABI_VERSION >= 2`, so we can build with libc++ 17 and run with libc++ <= 13(for example android ndk r23, ubuntu 20.04). [[In libc++ 18](https://github.com/llvm/llvm-project/blob/12563ea6403f6f5a467862732b92db3517626cd2/libcxx/include/fstream#L1765)](https://github.com/llvm/llvm-project/blob/12563ea6403f6f5a467862732b92db3517626cd2/libcxx/include/fstream#L1765), `_LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 ` is always 1 for linux, so instantiations are not in user code, and produced binary depends on new symbols in libc++ shared library. This can reduce user binary size, but breaks libc++ compatibility, users must redistribute libc++ with their apps or SDKs. But what if an app depends on multiple 3rdparty SDKs built with different libc++ versions? Let the SDK users  find out the highest version from these SDKs(how?) and delete others to avoid link error?

My suggestion is 

```cpp
#if defined(_LIBCPP_BUILDING_LIBRARY) || _LIBCPP_ABI_VERSION >= 2
# define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 1
#else
# define _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 0
#endif
```

just like what we do for `_LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVd2O4jgTfRpzUxqUOCQhF1wEaL4vGqZn1DCzO1eRHVeIp40d2U7T7NOvHOhpevZPK-1KKyEQtuucctWpY-acPGjEBUmXJF1P2OA7Yxcnpg_vuNQTbsR5sZO6QVCSN4QuCV3GCaErkMZ5i-wIjWLOoSN03hoL-MyOvUKSRZw52dSyvRwjyarpmCXJHckiQgvA517JRnp1BqmdZ9pL5qXRDvBZOg9S31CC65hFEVYss-cp_NShBj5IJaQ-wODQQmMEwkn67jaOJCuSrCHOx5Tf8jCLgeU1mJ9BYMsG5WHQCp0Dz-wBfaAgWVRvq-Xq06e6XFb1l7uHXfXxHsJ9kjXQ8VIrcAZOCA275vabdOIcmBZgB_2HmSZvCxnOWyMFaPEIlo6lH_ig_QA0mkYzQospjN1bVm8qFs9JuiZ03nnfO5KUhG4I3Ryk7wY-bcyR0I1STy8_73prvmHjCd1wZTihm5imWYIsm0VJm7Upm2X5PKN5QnlBBU_SOM9o1ggaACRvnp8J3UjdqEEgoZuXrtNkG-dZSmjxH8uGrt609EtZbctlta32X-v_l7u6XK-rffXxvtzW1cfd_uGu_FDf_fxpW62qfV3d7_bl_b4qw4ldHQckkA6YOrGzgxhC_5TUw_NVE78jPG38G_GFk0EavTViaFAAl5rZIMgetXBgNGg8gTsfuVHuL6Zj30k3qtBiALuwXAGd_GUk44MHbpE9ulukxhx75iWXSvrzqDWH1sFxcD6ASeet5IO_tYOLkn2H0gLrewfGwm793k1hOXg4dcyDbIHpsHl7neOgvAwKT6zomfXnMWocHH_BFLJt0aL2t2xPaF2oIkk2sEUfiEPgNVFopRZghst6Jw8dOv8SA601x7DhxpBgWZ05kWQT_CgUX6BCj2B8F7C8AfYURk9J_QhorbHhbLQmUXn5_nAGNxwO6EJfgwJuN4MljJ-m768rNJFtsBipURA6f1Hf8nO1XVf3_wv_H8qHryEdkq9IvoI_9ZwX0Csk_ENqjr8Do3L4b7FEryxayPaHmt0W8lsQn5KPeBHTCUGYccR-8ORlua43n-9XgaFeldtt_f7u6_cVkkUTsUhEkRRsgos4j7J0TtNZMekWrE2a2TxjbdoUgrfzvOUUs5ZiIdJZzOcTuaARnUVxEkV0RmkxpXlB83Re5FGR8zbKySzCI5NqGuxrauxhIp0bcJEXRZJMFOOo3PjIUvqqZUJpeHTtYvQ8PhwcmUVKOu9eYbz0ChdvfP3m6b1OaxjWyWDV4m_b65ilI3QzJvprAAAA__-VcYb3">