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

            Bug ID: 118891
           Summary: gcc 14 fails to build from source on aarch64_be:
                    "error: ‘dynamic_cast’ not permitted with ‘-fno-rtti’"
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: bootstrap
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marcus at mc dot pp.se
  Target Milestone: ---

When building gcc 14 (I tried 14.2 and 14.3; 13.3 is not affected) natively on
aarch64_be-linux-gnu, the compilation fails during stage2 when compiling
stacktrace.cc from libstdc++-v3/src/c++23.  The compilation error is
"error: ‘dynamic_cast’ not permitted with ‘-fno-rtti’", which makes no sense
since no-rtti is neither on the command line nor in gcc/specs.  And in
fact, if I _do_ add -fno-rtti to the command line, then the compilation
succeeds...

I have minimized the reproducation this far:

---8<---
momoka_be /var/tmp/portage/sys-devel/gcc-14.3.9999/work/build # cat gotcha.cc
#include <format>

[[gnu::optimize("no-optimize-sibling-calls")]]
void fnord()
{
}

momoka_be /var/tmp/portage/sys-devel/gcc-14.3.9999/work/build # ./gcc/xgcc
-B./gcc -nostdinc++ -I../gcc-14.3.9999/libstdc++-v3/../libgcc
-Iaarch64_be-unknown-linux-gnu/libstdc++-v3/include/aarch64_be-unknown-linux-gnu
-Iaarch64_be-unknown-linux-gnu/libstdc++-v3/include
-I../gcc-14.3.9999/libstdc++-v3/libsupc++ -std=gnu++23 -c gotcha.cc -o gotcha.o
In file included from
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.h:888,
                 from
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/locale:41,
                 from
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:47,
                 from gotcha.cc:1:
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.tcc: In
instantiation of ‘const _Facet* std::__try_use_facet(const locale&) [with
_Facet = __cxx11::numpunct<wchar_t>]’:
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.tcc:205:59:
  required from ‘const _Facet& std::use_facet(const locale&) [with _Facet =
__cxx11::numpunct<wchar_t>]’
  205 |       if (const _Facet* __f = std::__try_use_facet<_Facet>(__loc))
      |                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:1170:53:   required
from ‘typename std::basic_format_context<_Out, _CharT>::iterator
std::__format::__formatter_int<_CharT>::format(bool,
std::basic_format_context<_Out, _CharT>&) const [with _Out =
std::__format::_Sink_iter<wchar_t>; _CharT = wchar_t; typename
std::basic_format_context<_Out, _CharT>::iterator =
std::basic_format_context<std::__format::_Sink_iter<wchar_t>,
wchar_t>::iterator]’
 1170 |               auto& __np =
std::use_facet<numpunct<_CharT>>(__fc.locale());
      |                           
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:2148:22:   required
from ‘typename std::basic_format_context<_Out, _CharT>::iterator
std::formatter<_Tp, _CharT>::format(_Tp, std::basic_format_context<_Out,
_CharT>&) const [with _Out = std::__format::_Sink_iter<wchar_t>; _Tp = bool;
_CharT = wchar_t; typename std::basic_format_context<_Out, _CharT>::iterator =
std::basic_format_context<std::__format::_Sink_iter<wchar_t>,
wchar_t>::iterator]’
 2148 |         { return _M_f.format(__u, __fc); }
      |                  ~~~~~~~~~~~^~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:4055:41:   required
from ‘std::__format::_Formatting_scanner<std::__format::_Sink_iter<wchar_t>,
wchar_t>::_M_format_arg(std::size_t)::<lambda(auto:36&)> [with auto:36 = bool]’
 4055 |               this->_M_fc.advance_to(__f.format(__arg, this->_M_fc));
      |                                      ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:3510:44:   required
from ‘decltype(auto) std::basic_format_arg<_Context>::_M_visit(_Visitor&&,
std::__format::_Arg_t) [with _Visitor =
std::__format::_Formatting_scanner<std::__format::_Sink_iter<wchar_t>,
wchar_t>::_M_format_arg(std::size_t)::<lambda(auto:36&)>; _Context =
std::basic_format_context<std::__format::_Sink_iter<wchar_t>, wchar_t>]’
 3510 |               return std::forward<_Visitor>(__vis)(_M_val._M_bool);
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:3570:28:   required
from ‘decltype(auto) std::visit_format_arg(_Visitor&&,
basic_format_arg<_Context>)[with _Visitor =
__format::_Formatting_scanner<__format::_Sink_iter<wchar_t>,
wchar_t>::_M_format_arg(std::size_t)::<lambda(auto:36&)>; _Context =
basic_format_context<__format::_Sink_iter<wchar_t>, wchar_t>]’
 3570 |       return __arg._M_visit(std::forward<_Visitor>(__vis),
__arg._M_type);
      |             
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:4044:23:   required
from ‘constexpr void std::__format::_Formatting_scanner<_Out,
_CharT>::_M_format_arg(std::size_t) [with _Out =
std::__format::_Sink_iter<wchar_t>; _CharT = wchar_t; std::size_t = long
unsigned int]’
 4044 |         std::visit_format_arg([this](auto& __arg) {
      |         ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
 4045 |           using _Type = remove_reference_t<decltype(__arg)>;
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4046 |           using _Formatter = typename _Context::template
formatter_type<_Type>;
      |          
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4047 |           if constexpr (is_same_v<_Type, monostate>)
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4048 |             __format::__invalid_arg_id_in_format_string();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4049 |           else if constexpr (is_same_v<_Type, handle>)
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4050 |             __arg.format(this->_M_pc, this->_M_fc);
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4051 |           else if constexpr (is_default_constructible_v<_Formatter>)
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4052 |             {
      |             ~                 
 4053 |               _Formatter __f;
      |               ~~~~~~~~~~~~~~~ 
 4054 |               this->_M_pc.advance_to(__f.parse(this->_M_pc));
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4055 |               this->_M_fc.advance_to(__f.format(__arg, this->_M_fc));
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4056 |             }
      |             ~                 
 4057 |           else
      |           ~~~~                
 4058 |             static_assert(__format::__formattable_with<_Type,
_Context>);
      |            
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4059 |         }, _M_fc.arg(__id));
      |         ~~~~~~~~~~~~~~~~~~~   
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:4039:7:   required
from here
 4039 |       _M_format_arg(size_t __id) override
      |       ^~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.tcc:145:14:
error: ‘dynamic_cast’ not permitted with ‘-fno-rtti’
  145 |       return dynamic_cast<const _Facet*>(__facets[__i]);
      |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.tcc: In
instantiation of ‘const _Facet* std::__try_use_facet(const locale&) [with
_Facet = __cxx11::numpunct<char>]’:
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.tcc:205:59:
  required from ‘const _Facet& std::use_facet(const locale&) [with _Facet =
__cxx11::numpunct<char>]’
  205 |       if (const _Facet* __f = std::__try_use_facet<_Facet>(__loc))
      |                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:1170:53:   required
from ‘typename std::basic_format_context<_Out, _CharT>::iterator
std::__format::__formatter_int<_CharT>::format(bool,
std::basic_format_context<_Out, _CharT>&) const [with _Out =
std::__format::_Sink_iter<char>; _CharT = char; typename
std::basic_format_context<_Out, _CharT>::iterator =
std::basic_format_context<std::__format::_Sink_iter<char>, char>::iterator]’
 1170 |               auto& __np =
std::use_facet<numpunct<_CharT>>(__fc.locale());
      |                           
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:2148:22:   required
from ‘typename std::basic_format_context<_Out, _CharT>::iterator
std::formatter<_Tp, _CharT>::format(_Tp, std::basic_format_context<_Out,
_CharT>&) const [with _Out = std::__format::_Sink_iter<char>; _Tp = bool;
_CharT = char; typename std::basic_format_context<_Out, _CharT>::iterator =
std::basic_format_context<std::__format::_Sink_iter<char>, char>::iterator]’
 2148 |         { return _M_f.format(__u, __fc); }
      |                  ~~~~~~~~~~~^~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:4055:41:   required
from ‘std::__format::_Formatting_scanner<std::__format::_Sink_iter<char>,
char>::_M_format_arg(std::size_t)::<lambda(auto:36&)> [with auto:36 = bool]’
 4055 |               this->_M_fc.advance_to(__f.format(__arg, this->_M_fc));
      |                                      ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:3510:44:   required
from ‘decltype(auto) std::basic_format_arg<_Context>::_M_visit(_Visitor&&,
std::__format::_Arg_t) [with _Visitor =
std::__format::_Formatting_scanner<std::__format::_Sink_iter<char>,
char>::_M_format_arg(std::size_t)::<lambda(auto:36&)>; _Context =
std::basic_format_context<std::__format::_Sink_iter<char>, char>]’
 3510 |               return std::forward<_Visitor>(__vis)(_M_val._M_bool);
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:3570:28:   required
from ‘decltype(auto) std::visit_format_arg(_Visitor&&,
basic_format_arg<_Context>)[with _Visitor =
__format::_Formatting_scanner<__format::_Sink_iter<char>,
char>::_M_format_arg(std::size_t)::<lambda(auto:36&)>; _Context =
basic_format_context<__format::_Sink_iter<char>, char>]’
 3570 |       return __arg._M_visit(std::forward<_Visitor>(__vis),
__arg._M_type);
      |             
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:4044:23:   required
from ‘constexpr void std::__format::_Formatting_scanner<_Out,
_CharT>::_M_format_arg(std::size_t) [with _Out =
std::__format::_Sink_iter<char>; _CharT = char; std::size_t = long unsigned
int]’
 4044 |         std::visit_format_arg([this](auto& __arg) {
      |         ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
 4045 |           using _Type = remove_reference_t<decltype(__arg)>;
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4046 |           using _Formatter = typename _Context::template
formatter_type<_Type>;
      |          
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4047 |           if constexpr (is_same_v<_Type, monostate>)
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4048 |             __format::__invalid_arg_id_in_format_string();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4049 |           else if constexpr (is_same_v<_Type, handle>)
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4050 |             __arg.format(this->_M_pc, this->_M_fc);
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4051 |           else if constexpr (is_default_constructible_v<_Formatter>)
      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4052 |             {
      |             ~                 
 4053 |               _Formatter __f;
      |               ~~~~~~~~~~~~~~~ 
 4054 |               this->_M_pc.advance_to(__f.parse(this->_M_pc));
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4055 |               this->_M_fc.advance_to(__f.format(__arg, this->_M_fc));
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4056 |             }
      |             ~                 
 4057 |           else
      |           ~~~~                
 4058 |             static_assert(__format::__formattable_with<_Type,
_Context>);
      |            
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4059 |         }, _M_fc.arg(__id));
      |         ~~~~~~~~~~~~~~~~~~~   
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/format:4039:7:   required
from here
 4039 |       _M_format_arg(size_t __id) override
      |       ^~~~~~~~~~~~~
aarch64_be-unknown-linux-gnu/libstdc++-v3/include/bits/locale_classes.tcc:145:14:
error: ‘dynamic_cast’ not permitted with ‘-fno-rtti’
  145 |       return dynamic_cast<const _Facet*>(__facets[__i]);
      |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
momoka_be /var/tmp/portage/sys-devel/gcc-14.3.9999/work/build #
---8<---

The error message is exactly the same as when compiling stacktrace.cc.
(I can provide complete build logs if desired.)  Of note is that if I comment
out the gnu::optimize attribute, then the compilation succeeds:

---8<---
momoka_be /var/tmp/portage/sys-devel/gcc-14.3.9999/work/build # cat gotcha2.cc 
#include <format>

// [[gnu::optimize("no-optimize-sibling-calls")]]
void fnord()
{
}

momoka_be /var/tmp/portage/sys-devel/gcc-14.3.9999/work/build # ./gcc/xgcc
-B./gcc -nostdinc++ -I../gcc-14.3.9999/libstdc++-v3/../libgcc
-Iaarch64_be-unknown-linux-gnu/libstdc++-v3/include/aarch64_be-unknown-linux-gnu
-Iaarch64_be-unknown-linux-gnu/libstdc++-v3/include
-I../gcc-14.3.9999/libstdc++-v3/libsupc++ -std=gnu++23 -c gotcha2.cc -o
gotcha2.o
momoka_be /var/tmp/portage/sys-devel/gcc-14.3.9999/work/build #
---8<---

Could the attribute cause some corruption of internal compiler state perhaps?

Reply via email to