2020-02-10 22:05:59 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s
2009-06-27 13:59:59 +08:00
// Make sure we accept this
template < class X > struct A { typedef X Y ; } ;
2013-01-31 13:19:49 +08:00
template < class X > bool operator = = ( A < X > , typename A < X > : : Y ) ; // expected-note{{candidate template ignored: could not match 'A<type-parameter-0-0>' against 'B<int> *'}}
2011-10-13 04:35:48 +08:00
2009-06-27 13:59:59 +08:00
int a ( A < int > x ) { return operator = = ( x , 1 ) ; }
2009-06-28 05:05:07 +08:00
int a0 ( A < int > x ) { return x = = 1 ; }
2009-07-02 06:01:06 +08:00
// FIXME: the location information for the note isn't very good
2009-06-27 13:59:59 +08:00
template < class X > struct B { typedef X Y ; } ;
template < class X > bool operator = = ( B < X > * , typename B < X > : : Y ) ; / / \
2011-10-13 04:35:48 +08:00
/ / expected - error { { overloaded ' operator = = ' must have at least one parameter of class or enumeration type } } \
// expected-note{{candidate template ignored: substitution failure [with X = int]}}
2014-01-11 10:37:12 +08:00
int a ( B < int > x ) { return operator = = ( & x , 1 ) ; } / / expected - error { { no matching function for call to ' operator = = ' } } \
// expected-note{{in instantiation of function template specialization}}
2020-02-10 22:05:59 +08:00
// Ensure we take parameter list reversal into account in partial oredring.
namespace CompareOrdering {
template < typename T > struct A { } ;
template < typename T > int operator < = > ( A < T > , int ) = delete ;
template < typename T > int operator < = > ( int , A < T * > ) ;
// OK, selects the more-specialized reversed function.
bool b = A < int * > ( ) < 0 ;
}