https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126472

Patrick Palka <ppalka at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ppalka at gcc dot gnu.org
           Keywords|needs-bisection             |
   Last reconfirmed|                            |2026-07-29
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
          Component|libstdc++                   |c++
            Summary|[13/14/15/16 regression]    |Wrong initialization
                   |Wrong initialization        |(zero-initialization) in
                   |(zero-initialization) in    |initializer_list
                   |initializer_list            |

--- Comment #2 from Patrick Palka <ppalka at gcc dot gnu.org> ---
(In reply to Sam James from comment #1)
> It starts with GCC 11. Using preprocessed source from GCC 10 works, so
> library bug probably.
GCC 11.1 and 11.2 preprocessed soruces work for me, 11.3 doesn't. I thought
it's a library bug too but after some reducing it seems an std::optional
constexpr refactoring/enablement library patch is exposing a non-regression
front end bug.  Reduced:

namespace std {
template <class _E> struct initializer_list {
  typedef const _E *const_iterator;
  const _E *_M_array;
  unsigned long _M_len;
  const_iterator begin() const { return _M_array; }
  const_iterator end() const { return begin() + _M_len; }
};
struct _Optional_payload_base {
  struct _Storage {
    constexpr _Storage() : _M_empty() {}
    constexpr ~_Storage() {}
    int _M_empty;
  } _M_payload;
};
struct _Optional_payload : _Optional_payload_base {};
template <typename> struct optional {
  constexpr optional() {}
  template <typename _Up> optional(_Up) {}
  _Optional_payload _M_payload;
};
template <typename _T1, typename _T2> struct pair {
  _T1 first;
  _T2 second;
  constexpr pair(_T1 __x, _T2 __y) : first(__x), second(__y) { }
};
template <typename> struct vector {
  vector(int, int) {}
};
} // namespace std

using namespace std;
const initializer_list<pair<optional<vector<int>>, int>> data {
  pair<optional<vector<int>>, int>( optional<vector<int>>(vector<int>(1, 10)),
42), // non-constant
  pair<optional<vector<int>>, int>( optional<vector<int>>(), 100), // constant
};

int main() {
  if (data.begin()[0].second != 42 || data.begin()[1].second != 100)
    __builtin_abort();
}

Reply via email to