Home | History | Annotate | Download | only in over.match.oper
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      2 
      3 namespace bullet2 {
      4 
      5 // For non-member candidates, if no operand has a class type, only those
      6 // non-member functions that have a matching enumeration parameter are
      7 // candidates.
      8 
      9 struct B { template<typename T> B(T); };
     10 int operator~(B);
     11 template<typename T> int operator%(B, T);
     12 enum class E { e };
     13 
     14 template<typename T> int f(T t) { return ~t; } // expected-error {{invalid argument type}}
     15 template<typename T, typename U> int f(T t, U u) { return t % u; } // expected-error {{invalid operands to}}
     16 
     17 int b1 = ~E::e; // expected-error {{invalid argument type}}
     18 int b2 = f(E::e); // expected-note {{in instantiation of}}
     19 int b3 = f(0, E::e);
     20 int b4 = f(E::e, 0); // expected-note {{in instantiation of}}
     21 
     22 }
     23 
     24 namespace bullet3 {
     25 
     26 // This is specifically testing the bullet:
     27 // "do not have the same parameter-type-list as any non-template
     28 // non-member candidate."
     29 // The rest is sort of hard to test separately.
     30 
     31 enum E1 { one };
     32 enum E2 { two };
     33 
     34 struct A;
     35 
     36 A operator >= (E1, E1);
     37 A operator >= (E1, const E2);
     38 
     39 E1 a;
     40 E2 b;
     41 
     42 extern A test1;
     43 extern decltype(a >= a) test1;
     44 extern decltype(a >= b) test1;
     45 
     46 template <typename T> A operator <= (E1, T);
     47 extern bool test2;
     48 extern decltype(a <= a) test2;
     49 
     50 extern A test3;
     51 extern decltype(a <= b) test3;
     52 
     53 }
     54