https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91844
--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> --- And this will become valid (used to fail with call of overloaded ‘f(int*&)’ is ambiguous): template<typename T> int f (const T *const &); // (1) template<typename T> int f (T *const &); // (2) template<typename T> int f (T *); // (3) void g (int *p, const int *q, const int *const r) { f (p); // calls (1) f (q); // calls (1) f (r); // calls (1) }