https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118632
Bug ID: 118632 Summary: 0 vs nullptr mixup in template Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: pobrn at protonmail dot com Target Milestone: --- Consider the following piece of code: #include <type_traits> template <typename T, std::enable_if_t<std::is_arithmetic_v<T>> * = nullptr> class Matrix {}; template <typename T> void operator*(Matrix<T>, int rgb) { Matrix<int>{} * rgb; } -- https://gcc.godbolt.org/z/GTqMf69K4 It fails on gcc 15 with the following error: <source>: In function 'void operator*(Matrix<T>, int)': <source>:7:17: error: no match for 'operator*' (operand types are 'Matrix<int>' and 'int') [-Wtemplate-body] 7 | Matrix<int>{} * rgb; | ~~~~~~~~~~~~~~^~~~~ <source>:7:17: note: there is 1 candidate <source>:6:28: note: candidate 1: 'template<class T> void operator*(Matrix<T>, int)' 6 | template <typename T> void operator*(Matrix<T>, int rgb) { | ^~~~~~~~ <source>:6:28: note: template argument deduction/substitution failed: <source>:7:19: note: template argument '0' does not match 'nullptr' 7 | Matrix<int>{} * rgb; | ^~~ This does not happen with clang, msvc, or earlier gcc versions.