]> git.ipfire.org Git - thirdparty/gcc.git/commit
OpenMP: Fix implicit 'declare target' for <ostream>
authorTobias Burnus <tburnus@baylibre.com>
Tue, 17 Jun 2025 09:33:09 +0000 (11:33 +0200)
committerTobias Burnus <tburnus@baylibre.com>
Tue, 17 Jun 2025 09:33:09 +0000 (11:33 +0200)
commitea43b99537591b1103da3961c61f1cbfae968859
treee4efc43fe0e6db791c42b4b8a38dbb729147d30e
parente2bff264e8b92426b13aacec3087cb97971ec9b9
OpenMP: Fix implicit 'declare target' for <ostream>

libstdc++-v3/include/std/ostream contains:

  namespace std _GLIBCXX_VISIBILITY(default)
  {
    ...
    template<typename _CharT, typename _Traits>
      inline basic_ostream<_CharT, _Traits>&
      endl(basic_ostream<_CharT, _Traits>& __os)
      { return flush(__os.put(__os.widen('\n'))); }
  ...
  #include <bits/ostream.tcc>

and the latter, libstdc++-v3/include/bits/ostream.tcc, has:
    // Inhibit implicit instantiations for required instantiations,
    // which are defined via explicit instantiations elsewhere.
  #if _GLIBCXX_EXTERN_TEMPLATE
    extern template class basic_ostream<char>;
    extern template ostream& endl(ostream&);

Before this commit, omp_discover_declare_target_tgt_fn_r marked 'endl'
as (implicitly) declare target - but not the calls in it due to the
'extern' (DECL_EXTERNAL).

Thanks to inlining and as 'endl' is (therefore) not used and, hence,
discarded by the linker; hencet, it works with -O0 and -O1. However,
as the (unused) function still exits, IPA CP (enabled by -O2) will try
to do constant-value propagation and fails as the definition of 'widen'
is not available.

Solution is to still walk 'endl' despite being an 'extern(al)' decl;
this has been restricted for now to DECL_DECLARED_INLINE_P.

gcc/ChangeLog:

* omp-offload.cc (omp_discover_declare_target_tgt_fn_r): Also
walk external functions that are declare inline (and have a
DECL_SAVED_TREE).

libgomp/ChangeLog:

* testsuite/libgomp.c++/declare_target-2.C: New test.
gcc/omp-offload.cc
libgomp/testsuite/libgomp.c++/declare_target-2.C [new file with mode: 0644]