https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116572
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Reduced testcase:
long v;
template <class> struct A;
template <typename C, typename = A<C>, typename = C>
class B;
template <>
struct A<char>
{
static int foo(char *s, const char *t, long n) { return __builtin_memcmp(s,
t, n); }
};
template <typename C, typename, typename>
struct B {
long b;
B(const C *);
C *bar() const;
constexpr unsigned long baz(const C *, unsigned long, unsigned long) const
noexcept;
void baz() { C c; baz(&c, 0, v); }
};
template <typename C, typename D, typename E>
constexpr unsigned long
B<C, D, E>::baz(const C *s, unsigned long, unsigned long n) const noexcept
{
C *x = bar(); if (!x) return b; D::foo(x, s, n); return 0;
}
namespace {
struct F { virtual ~F() {} };
struct F2 { virtual void foo(B<char>) const; };
struct F3 : F, F2 { void foo(B<char> s) const { s.baz(); } } f;
}
int
main()
{
F *p;
dynamic_cast<F2 *>(p)->foo("");
}
Started with r14-2152-g7198573f44fb579843bff8deda695107858d8cff