https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96746
Bug ID: 96746 Summary: Type Casting in template function should not be type-dependent if the type of the conversion result is not type-dependent. Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: masamitsu.murase at gmail dot com Target Milestone: --- The following code compiles fine with GCC 11.0, but I think that it should not compile because of the mismatch of the argument type of "func_with_int_arg" at (*1) . #include <type_traits> void func_with_int_arg(int) {} template<typename T> std::enable_if_t<std::is_same<T, int*>::value> func(T arg) { func_with_int_arg(static_cast<int*>(arg)); // (*1) } template<typename T> std::enable_if_t<std::is_same<T, int>::value> func(T) {} int main(int, char **) { func(1); // Instantiate func<int> } According to C++17 specification, "static_cast<int*>(arg)" is NOT type-dependent. because "int*" is not dependent. "17.6.2.2 Type-dependent expressions" says as follows: Expressions of the following forms are type-dependent only if the type specified by the type-id, simple-type-specifier or new-type-id is dependent, even if any subexpression is type-dependent: ...(snip)... dynamic_cast <type-id> (expression) static_cast <type-id> (expression) const_cast <type-id> (expression) ...(snip)... Therefore, "func_with_int_arg(static_cast<int*>(arg));" at (*1) should cause a hard error instead of a substitution failure. By the way, the above code does not compile fine with Clang 12.0. The error message is: sample.cpp:9:9: error: no matching function for call to 'func_with_int_arg' func_with_int_arg(static_cast<int*>(arg)); // (*1) ^~~~~~~~~~~~~~~~~ sample.cpp:3:10: note: candidate function not viable: no known conversion from 'int *' to 'int' for 1st argument; dereference the argument with * void func_with_int_arg(int) {} ^ 1 error generated. Regards, Murase