https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100135
Nicolas Werner <nicolas.werner at hotmail dot de> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |nicolas.werner at hotmail dot de --- Comment #1 from Nicolas Werner <nicolas.werner at hotmail dot de> --- A more minimal example of the issue here, I think: export module internalname; constexpr int radix_16 = 16; export { int foo(int in = radix_16) { return in; } } I *think* this is legal module code and MSVC as well as clang do accept it. However it is a weird edge case. This also isn't exclusive to default function arguments, you can trigger the same issue with templates: export module internalname; constexpr int radix_16 = 16; template <class T, auto Param> inline auto do_from_chars() -> T { if (Param > 4) { return 5; } else { return 4; } } export { template <class T> struct parse_number { auto operator()() -> T { return do_from_chars<T, radix_16>(); } }; } Specifically gcc seems to be overly strict here in how it handles internal linkage entities, that are required on the call site for default parameters or template instantiations.