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

--- Comment #7 from Omer Ozarslan <omerfaruko at gmail dot com> ---
Hi. I could isolate this to around __parse_integer (__from_chars_alnum?) based
on above snippets.

Please also take a look at Bug 121254 Comment 4 which is likely related.

Removing the template from parse_integer makes it work.

==> format.hpp <==
#include <charconv>

#ifdef TEMPLATES
template <typename = void>
#else
inline
#endif
bool parse_integer(const char *first, const char *last) {
  const char *__start = first;
  short val = 0;
  if (std::__detail::__from_chars_alnum<true, short>(first, last, val, 10) &&
      first != __start)
    return true;
  return false;
}

inline bool works() {
  const char fmt[] = "5";
  return parse_integer(fmt, fmt + 1);
}

==> test.sh <==
#!/bin/bash

set -ex
rm -rf gcm.cache

CXX=/opt/gcc-16-20250720/bin/g++
CXXFLAGS="-g -fmodules -std=c++20 -w -Wfatal-errors -Werror=template-body"

cat <<eof >mod.hpp
#include "format.hpp"
eof

cat <<eof >test.cpp
#include "format.hpp"
#ifdef MODULES
import "mod.hpp";
#endif
int main() {
  return works() ? 0 : 1;
}
eof

# no modules still works
$CXX $CXXFLAGS test.cpp -o a.out
./a.out

# modules fails with template
$CXX $CXXFLAGS -DMODULES -DTEMPLATES mod.hpp test.cpp -o b.out
! ./b.out || exit 1

# modules without template still works
$CXX $CXXFLAGS -DMODULES mod.hpp test.cpp -o c.out
./c.out

Reply via email to