// dg-do run // Copyright (C) 2005 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 16 Sep 2005 <nathan@codesourcery.com> // PR 23519 template specialization ordering (DR214) // Origin: Maxim Yegorushkin <maxim.yegorushkin@gmail.com> struct A { template<class T> int operator+(T&) { return 1;} }; template<class T> struct B { int operator-(A&) {return 2;} template<typename R> int operator*(R&) {return 3;} }; template <typename T, typename R> int operator-(B<T>, R&) {return 4;} template<class T> int operator+(A&, B<T>&) { return 5;} template <typename T> int operator*(T &, A&){return 6;} int main() { A a; B<A> b; if ((a + b) != 5) return 1; if ((b - a) != 2) return 2; if ((b * a) != 6) return 3; }