https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113274
Bug ID: 113274 Summary: Memoization in template parameters is overly aggressive; false memoization for const pointers Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: janschultke at googlemail dot com Target Milestone: --- ## Minimal Reproducible Example (https://godbolt.org/z/Y7Kr9o546) template <auto> struct A { static constexpr bool value = false; }; template <auto p> requires __is_same(decltype(p), int*) struct A<p> { static constexpr bool value = false; }; int x = 0; //static_assert( A<&x>::value ); static_assert( A<const_cast<const int*>(&x)>::value == false ); ## Explanation Uncommenting the first static_assert causes compilation failure of the second static_assert. This should definitely not happen, as the following instantiations should be distinct: - A<(int*) &x> - A<(const int*) &x> GCC aggressively memoizes the first instantiation in A<&x>, which results in the subsequent A<(const int*)&x>::value being identical, even though it should not be.