54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
|
|
|
namespace bullet2 {
|
|
|
|
// For non-member candidates, if no operand has a class type, only those
|
|
// non-member functions that have a matching enumeration parameter are
|
|
// candidates.
|
|
|
|
struct B { template<typename T> B(T); };
|
|
int operator~(B);
|
|
template<typename T> int operator%(B, T);
|
|
enum class E { e };
|
|
|
|
template<typename T> int f(T t) { return ~t; } // expected-error {{invalid argument type}}
|
|
template<typename T, typename U> int f(T t, U u) { return t % u; } // expected-error {{invalid operands to}}
|
|
|
|
int b1 = ~E::e; // expected-error {{invalid argument type}}
|
|
int b2 = f(E::e); // expected-note {{in instantiation of}}
|
|
int b3 = f(0, E::e);
|
|
int b4 = f(E::e, 0); // expected-note {{in instantiation of}}
|
|
|
|
}
|
|
|
|
namespace bullet3 {
|
|
|
|
// This is specifically testing the bullet:
|
|
// "do not have the same parameter-type-list as any non-template
|
|
// non-member candidate."
|
|
// The rest is sort of hard to test separately.
|
|
|
|
enum E1 { one };
|
|
enum E2 { two };
|
|
|
|
struct A;
|
|
|
|
A operator >= (E1, E1);
|
|
A operator >= (E1, const E2);
|
|
|
|
E1 a;
|
|
E2 b;
|
|
|
|
extern A test1;
|
|
extern decltype(a >= a) test1;
|
|
extern decltype(a >= b) test1;
|
|
|
|
template <typename T> A operator <= (E1, T);
|
|
extern bool test2;
|
|
extern decltype(a <= a) test2;
|
|
|
|
extern A test3;
|
|
extern decltype(a <= b) test3;
|
|
|
|
}
|