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

    <tr>
        <th>Summary</th>
        <td>
            [clang] is it possible to make *it and ++it consistently noexcept for standard container iterators?
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          wanghan02
      </td>
    </tr>
</table>

<pre>
    I think this is not specified in the standard. GCC and MSVC consistently make them `noexcept` for all standard containers. But clang make them `noexcept` for `std::vector`/`std::basic_string` but `noexcept(false)` for `std::list`/`std::set`/`std::map`/`std::unordered_set`/`std::unordered_map`. If they won't throw any exceptions, why not making them consistently `noexcept`?

Example code could be found below or on [godbolt](https://godbolt.org/z/z1Ex5x7Ee).

```
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <list>
#include <string>
#include <ranges>

template<typename Iterator>
concept nothrow_advancable = noexcept(++std::declval<Iterator&>());

template<typename Iterator>
concept nothrow_dereferencable = noexcept(*std::declval<Iterator&>());

static_assert(nothrow_advancable<std::ranges::iterator_t<std::vector<int>&>>);
static_assert(nothrow_advancable<std::ranges::iterator_t<std::basic_string<char>&>>);
static_assert(nothrow_advancable<std::ranges::iterator_t<std::list<int>&>>); // not noexcept with clang
static_assert(nothrow_advancable<std::ranges::iterator_t<std::set<int>&>>); // not noexcept with clang
static_assert(nothrow_advancable<std::ranges::iterator_t<std::map<int, int>&>>); // not noexcept with clang
static_assert(nothrow_advancable<std::ranges::iterator_t<std::unordered_set<int>&>>); // not noexcept with clang
static_assert(nothrow_advancable<std::ranges::iterator_t<std::unordered_map<int, int>&>>); // not noexcept with clang

static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::vector<int>&>>);
static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::basic_string<char>&>>);
static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::list<int>&>>); // not noexcept with clang
static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::set<int>&>>); // not noexcept with clang
static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::map<int, int>&>>); // not noexcept with clang
static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::unordered_set<int>&>>); // not noexcept with clang
static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::unordered_map<int, int>&>>); // not noexcept with clang
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMV0Fv6joT_TVmM7rI2CTAIgtIy6cuvtWT3hY5tpP41bEj24Hyfv2Tk8AthdvFpVxVCiGyPWeOz3isGea9qoyUGUo2KHmasC7U1mUHZqqaGUwmhRXH7AVCrcxrfHtQHowN4FvJVamkAGUg1BJ8YEYwJ6bwvzwHZgT8_6-_c-DWeOWDNEEfoWGvMi5uAKXYWPnGZRtQiqG0DpjWZ5BoFpgy0vkpbLoAXDNTfW6PUuyDQHSN6HovebAOpRiR7fvxgnnFdz44ZapoV3ThAoosS6a9RGR1C1UrH64xvbwx2LD2erAz1gnppNjdtPk5PVhP4aWMuz3CwRpEFgFC7ewBmDnCwFdZ4xHJ4VAf-6A07FWZalDoQvhLuRDdIrxGeP38xppWS-BWxFenBRQSStuZ-KHtAawDawAlm8qKwuqAkidElnUIrY-kyRaR7Tg1ta5CZPtv_M2e35K3xXMUcjq4im6HB68Rocpw3QkJiOZRC_p8NRw1uDF8qeGnC36BMJ6NGzN9fG-Mj-flxoxjppJ-nMHrIJtWsyARzcOxlYY1El6CdOzskFsTgxCjFWO5Y2LPDGeFjnBP8O4gIrJBZHM-HEJyvWca0fwMSNKIGVeu4kM3v0siylVKJ39FZP0bLHxgQfEd8166iHK94V7YEfekY_xWI_IuvF9xilquTB-jwW38GH1-tcOLq4LmvGbuj_gdDuHtbcKQcH2unyIEBxXq4X58AJs-yb4LmT6hezIkh2_C6cN99F2k-nAL3inaJwQv744_lNP3OL03r-_x_ZjcvofRQw7tPYQemeP38Hpwnn8NtS_J9VOhNhEZFSu6YhOZzRY0nZN5sqCTOiOJLAvOBcUJwaUoGE4JX4oZpmwplwWfqIxgkuAZXs0IXlE6XaWLRbFiC54mrCzJDM2xbJjSU633TawbJ8r7TmYzQkg6n2hWSO37noSQgRchsT1xWTT4UXSVR3Mcs8n_hAgq6L6RGSySp9iqqACt9V7FuibYoYFAZK1C36EMNZYKl8XyWZdY_193JHCKgkd0O-mczj6UwyrUXTHltkFkG9mNfz9aZ_-RPCCy7XfrEdmOG95n5L8AAAD__3vTXLQ">