On Sat, 2 Apr 2022, 10:32 Jakub Jelinek via Libstdc++, < libstd...@gcc.gnu.org> wrote:
> Hi! > > Apparently clang trunk implemented __builtin_source_location(), but the > using __builtin_ret_type = decltype(__builtin_source_location()); > which has been added for it isn't enough, they also need the > std::source_location::__impl class to be defined (but incomplete seems > to be good enough) before the builtin is used. > > The following has been tested on godbolt with clang trunk (old version > fails with > error: 'std::source_location::__impl' was not found; it must be defined > before '__builtin_source_location' is called > and some follow-up errors), getting back to just void * instead of > __builtin_ret_type and commenting out using doesn't work either and > just struct __impl; before using __builtin_ret_type doesn't work too. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > OK, thanks. > 2022-04-02 Jakub Jelinek <ja...@redhat.com> > > PR libstdc++/105128 > * include/std/source_location (std::source_location::__impl): Move > definition before using __builtin_ret_type. > > --- libstdc++-v3/include/std/source_location 2022-02-25 > 10:46:53.275178858 +0100 > +++ libstdc++-v3/include/std/source_location 2022-04-01 > 19:36:02.056236397 +0200 > @@ -43,6 +43,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > { > private: > using uint_least32_t = __UINT_LEAST32_TYPE__; > + struct __impl > + { > + const char* _M_file_name; > + const char* _M_function_name; > + unsigned _M_line; > + unsigned _M_column; > + }; > using __builtin_ret_type = decltype(__builtin_source_location()); > > public: > @@ -76,14 +83,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > { return _M_impl ? _M_impl->_M_function_name : ""; } > > private: > - struct __impl > - { > - const char* _M_file_name; > - const char* _M_function_name; > - unsigned _M_line; > - unsigned _M_column; > - }; > - > const __impl* _M_impl = nullptr; > }; > > > Jakub > >