Skip to content
Snippets Groups Projects
  • Jakub Jelinek's avatar
    4a0e89b1
    system.h: Include <initializer_list> in system.h unconditionally · 4a0e89b1
    Jakub Jelinek authored
    On Sun, May 01, 2022 at 07:06:53PM +0100, Jonathan Wakely wrote:
    > > >> the reason is that "gcc/analyzer/region-model.cc” uses initializer_lists, and it seems that <initializer_list>
    > > >> is not transitively included by any used headers for _LIBCPP_VERSION < 4000.  I fixed that locally by
    > > >> adding initializer_list into system.h (and adding INCLUDE_INITIALIZER_LIST to the top of gcc/analyzer/region-model.cc)
    > > >> - with that change those versions do bootstrap and test OK***
    > > >
    > > > From what I can see, with libstdc++ it works because <utility> which is
    > > > included by system.h includes <initializer_list>.
    > > > If I rename initializer_list in analyzer/region-model.ii to initializer_listx, I
    > > > also get:
    > > > ../../gcc/analyzer/region-model.cc: In function ‘void ana::selftest::test_binop_svalue_folding()’:
    > > > ../../gcc/analyzer/region-model.cc:4966:48: error: deducing from brace-enclosed initializer list requires ‘#include <initializer_list>’
    > > > 4508 |
    > > >  +++ |+#include <initializer_list>
    > > > 4509 | static void
    > > > ......
    > > > 4966 |     for (auto op : {BIT_IOR_EXPR, TRUTH_OR_EXPR})
    > > >      |                                                ^
    > > > ../../gcc/analyzer/region-model.cc:4978:49: error: deducing from brace-enclosed initializer list requires ‘#include <initializer_list>’
    > > > 4978 |     for (auto op : {BIT_AND_EXPR, TRUTH_AND_EXPR})
    > > >      |                                                 ^
    > > >
    > > > I think we have 2 options, one is do what you wrote above,
    > > > INCLUDE_INITIALIZER_LIST defined before system.h to get #include <initializer_list>.
    > > > The other option is just to include that unconditionally, it is a very small
    > > > header.  For libstdc++ it will make no difference as it is included anyway
    > > > and the header is really small there, libc++ includes <cstddef> which isn't
    > > > normally included and system.h includes <stddef.h> instead.
    > >
    > > I’d say unconditionally would be OK. I suppose the chance that any host
    > > C++ is good enough to build GCC as-is but fails to provide
    > > <initializer_list> is zero?
    > >
    >
    > Yes, definitely.
    >
    > > I’d be OK to do this change without a new RC even.
    
    2022-05-02  Jakub Jelinek  <jakub@redhat.com>
    
    	* system.h: Include initializer_list.
    4a0e89b1
    History
    system.h: Include <initializer_list> in system.h unconditionally
    Jakub Jelinek authored
    On Sun, May 01, 2022 at 07:06:53PM +0100, Jonathan Wakely wrote:
    > > >> the reason is that "gcc/analyzer/region-model.cc” uses initializer_lists, and it seems that <initializer_list>
    > > >> is not transitively included by any used headers for _LIBCPP_VERSION < 4000.  I fixed that locally by
    > > >> adding initializer_list into system.h (and adding INCLUDE_INITIALIZER_LIST to the top of gcc/analyzer/region-model.cc)
    > > >> - with that change those versions do bootstrap and test OK***
    > > >
    > > > From what I can see, with libstdc++ it works because <utility> which is
    > > > included by system.h includes <initializer_list>.
    > > > If I rename initializer_list in analyzer/region-model.ii to initializer_listx, I
    > > > also get:
    > > > ../../gcc/analyzer/region-model.cc: In function ‘void ana::selftest::test_binop_svalue_folding()’:
    > > > ../../gcc/analyzer/region-model.cc:4966:48: error: deducing from brace-enclosed initializer list requires ‘#include <initializer_list>’
    > > > 4508 |
    > > >  +++ |+#include <initializer_list>
    > > > 4509 | static void
    > > > ......
    > > > 4966 |     for (auto op : {BIT_IOR_EXPR, TRUTH_OR_EXPR})
    > > >      |                                                ^
    > > > ../../gcc/analyzer/region-model.cc:4978:49: error: deducing from brace-enclosed initializer list requires ‘#include <initializer_list>’
    > > > 4978 |     for (auto op : {BIT_AND_EXPR, TRUTH_AND_EXPR})
    > > >      |                                                 ^
    > > >
    > > > I think we have 2 options, one is do what you wrote above,
    > > > INCLUDE_INITIALIZER_LIST defined before system.h to get #include <initializer_list>.
    > > > The other option is just to include that unconditionally, it is a very small
    > > > header.  For libstdc++ it will make no difference as it is included anyway
    > > > and the header is really small there, libc++ includes <cstddef> which isn't
    > > > normally included and system.h includes <stddef.h> instead.
    > >
    > > I’d say unconditionally would be OK. I suppose the chance that any host
    > > C++ is good enough to build GCC as-is but fails to provide
    > > <initializer_list> is zero?
    > >
    >
    > Yes, definitely.
    >
    > > I’d be OK to do this change without a new RC even.
    
    2022-05-02  Jakub Jelinek  <jakub@redhat.com>
    
    	* system.h: Include initializer_list.