1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -std=c++11 -verify %s
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef int (*fp)(int);
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint surrogate(int);
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct Incomplete;  // expected-note{{forward declaration of 'Incomplete'}} \
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                    // expected-note {{forward declaration of 'Incomplete'}}
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct X {
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X() = default;  // expected-note{{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X(const X&) = default;  // expected-note{{candidate constructor not viable: no known conversion from 'bool' to 'const X' for 1st argument}}
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X(bool b) __attribute__((enable_if(b, "chosen when 'b' is true")));  // expected-note{{candidate disabled: chosen when 'b' is true}}
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void f(int n) __attribute__((enable_if(n == 0, "chosen when 'n' is zero")));
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void f(int n) __attribute__((enable_if(n == 1, "chosen when 'n' is one")));  // expected-note{{member declaration nearly matches}} expected-note 2{{candidate disabled: chosen when 'n' is one}}
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void g(int n) __attribute__((enable_if(n == 0, "chosen when 'n' is zero")));  // expected-note{{candidate disabled: chosen when 'n' is zero}}
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void h(int n, int m = 0) __attribute__((enable_if(m == 0, "chosen when 'm' is zero")));  // expected-note{{candidate disabled: chosen when 'm' is zero}}
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static void s(int n) __attribute__((enable_if(n == 0, "chosen when 'n' is zero")));  // expected-note2{{candidate disabled: chosen when 'n' is zero}}
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void conflict(int n) __attribute__((enable_if(n+n == 10, "chosen when 'n' is five")));  // expected-note{{candidate function}}
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void conflict(int n) __attribute__((enable_if(n*2 == 10, "chosen when 'n' is five")));  // expected-note{{candidate function}}
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void hidden_by_argument_conversion(Incomplete n, int m = 0) __attribute__((enable_if(m == 10, "chosen when 'm' is ten")));
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Incomplete hidden_by_incomplete_return_value(int n = 0) __attribute__((enable_if(n == 10, "chosen when 'n' is ten"))); // expected-note{{'hidden_by_incomplete_return_value' declared here}}
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  operator long() __attribute__((enable_if(true, "chosen on your platform")));
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  operator int() __attribute__((enable_if(false, "chosen on other platform")));
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  operator fp() __attribute__((enable_if(false, "never enabled"))) { return surrogate; }  // expected-note{{conversion candidate of type 'int (*)(int)'}}  // FIXME: the message is not displayed
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid X::f(int n) __attribute__((enable_if(n == 0, "chosen when 'n' is zero")))  // expected-note{{member declaration nearly matches}} expected-note 2{{candidate disabled: chosen when 'n' is zero}}
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines{
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid X::f(int n) __attribute__((enable_if(n == 2, "chosen when 'n' is two")))  // expected-error{{out-of-line definition of 'f' does not match any declaration in 'X'}}
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines{
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
42651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesX x1(true);
43651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesX x2(false); // expected-error{{no matching constructor for initialization of 'X'}}
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__attribute__((deprecated)) constexpr int old() { return 0; }  // expected-note2{{'old' has been explicitly marked deprecated here}}
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid deprec1(int i) __attribute__((enable_if(old() == 0, "chosen when old() is zero")));  // expected-warning{{'old' is deprecated}}
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid deprec2(int i) __attribute__((enable_if(old() == 0, "chosen when old() is zero")));  // expected-warning{{'old' is deprecated}}
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid overloaded(int);
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid overloaded(long);
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct Int {
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  constexpr Int(int i) : i(i) { }
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  constexpr operator int() const { return i; }
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int i;
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid default_argument(int n, int m = 0) __attribute__((enable_if(m == 0, "chosen when 'm' is zero")));  // expected-note{{candidate disabled: chosen when 'm' is zero}}
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid default_argument_promotion(int n, int m = Int(0)) __attribute__((enable_if(m == 0, "chosen when 'm' is zero")));  // expected-note{{candidate disabled: chosen when 'm' is zero}}
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Nothing { };
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename T> void typedep(T t) __attribute__((enable_if(t, "")));  // expected-note{{candidate disabled:}}  expected-error{{value of type 'Nothing' is not contextually convertible to 'bool'}}
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<int N> void valuedep() __attribute__((enable_if(N == 1, "")));
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: we skip potential constant expression evaluation on value dependent
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// enable-if expressions
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint not_constexpr();
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<int N> void valuedep() __attribute__((enable_if(N == not_constexpr(), "")));
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> void instantiationdep() __attribute__((enable_if(sizeof(sizeof(T)) != 0, "")));
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test() {
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X x;
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x.f(0);
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x.f(1);
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.f(2);  // expected-error{{no matching member function for call to 'f'}}
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x.f(3);  // expected-error{{no matching member function for call to 'f'}}
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.g(0);
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.g(1);  // expected-error{{no matching member function for call to 'g'}}
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.h(0);
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.h(1, 2);  // expected-error{{no matching member function for call to 'h'}}
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x.s(0);
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x.s(1);  // expected-error{{no matching member function for call to 's'}}
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X::s(0);
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  X::s(1);  // expected-error{{no matching member function for call to 's'}}
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  x.conflict(5);  // expected-error{{call to member function 'conflict' is ambiguous}}
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.hidden_by_argument_conversion(10);  // expected-error{{argument type 'Incomplete' is incomplete}}
9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x.hidden_by_incomplete_return_value(10);  // expected-error{{calling 'hidden_by_incomplete_return_value' with incomplete return type 'Incomplete'}}
9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  deprec2(0);
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  overloaded(x);
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  default_argument(0);
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  default_argument(1, 2);  // expected-error{{no matching function for call to 'default_argument'}}
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  default_argument_promotion(0);
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  default_argument_promotion(1, 2);  // expected-error{{no matching function for call to 'default_argument_promotion'}}
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int i = x(1);  // expected-error{{no matching function for call to object of type 'X'}}
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Nothing n;
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedep(0);  // expected-error{{no matching function for call to 'typedep'}}
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedep(1);
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedep(n);  // expected-note{{in instantiation of function template specialization 'typedep<Nothing>' requested here}}
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1140e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename T> class C {
1150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  void f() __attribute__((enable_if(T::expr == 0, ""))) {}
1160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  void g() { f(); }
1170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint fn3(bool b) __attribute__((enable_if(b, ""))); // FIXME: This test should net 0 error messages.
1200e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <class T> void test3() {
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  fn3(sizeof(T) == 1); // expected-error{{no matching function for call to 'fn3'}} expected-note@-2{{candidate disabled}}
1220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
1230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename T>
12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct Y {
12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T h(int n, int m = 0) __attribute__((enable_if(m == 0, "chosen when 'm' is zero")));  // expected-note{{candidate disabled: chosen when 'm' is zero}}
12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid test4() {
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Y<int> y;
13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int t0 = y.h(0);
13387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int t1 = y.h(1, 2);  // expected-error{{no matching member function for call to 'h'}}
13487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
13587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// FIXME: issue an error (without instantiation) because ::h(T()) is not
1370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// convertible to bool, because return types aren't overloadable.
1380e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid h(int);
1390e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename T> void outer() {
1400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  void local_function() __attribute__((enable_if(::h(T()), "")));
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  local_function(); // expected-error{{no matching function for call to 'local_function'}} expected-note@-1{{candidate disabled}}
1420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
1430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1440e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace PR20988 {
1450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  struct Integer {
1460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    Integer(int);
1470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  };
1480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int fn1(const Integer &) __attribute__((enable_if(true, "")));
1500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template <class T> void test1() {
1510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    int &expr = T::expr();
1520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    fn1(expr);
1530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
1540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  int fn2(const Integer &) __attribute__((enable_if(false, "")));  // expected-note{{candidate disabled}}
1560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template <class T> void test2() {
1570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    int &expr = T::expr();
1580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    fn2(expr);  // expected-error{{no matching function for call to 'fn2'}}
1590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
1600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int fn3(bool b) __attribute__((enable_if(b, ""))); // FIXME: This test should net 0 error messages.
1620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  template <class T> void test3() {
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    fn3(sizeof(T) == 1); // expected-error{{no matching function for call to 'fn3'}} expected-note@-2{{candidate disabled}}
1640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
16687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
16787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace FnPtrs {
16887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlFoo(int m) __attribute__((enable_if(m > 0, "")));
16987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlFoo(int m);
17087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
17187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test() {
17287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Assignment gives us a different code path than declarations, and `&foo`
17387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // gives us a different code path than `foo`
17487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = ovlFoo;
17587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &ovlFoo;
17687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
17787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = ovlFoo;
17887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &ovlFoo;
17987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
18087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
18187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlBar(int) __attribute__((enable_if(true, "")));
18287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlBar(int m) __attribute__((enable_if(false, "")));
18387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test2() {
18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = ovlBar;
18587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &ovlBar;
18687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = ovlBar;
18887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &ovlBar;
18987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
19087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlConflict(int m) __attribute__((enable_if(true, "")));
19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlConflict(int m) __attribute__((enable_if(1, "")));
19387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test3() {
19487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = ovlConflict; // expected-error{{address of overloaded function 'ovlConflict' is ambiguous}} expected-note@191{{candidate function}} expected-note@192{{candidate function}}
19587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &ovlConflict; // expected-error{{address of overloaded function 'ovlConflict' is ambiguous}} expected-note@191{{candidate function}} expected-note@192{{candidate function}}
19687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
19787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = ovlConflict; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@191{{candidate function}} expected-note@192{{candidate function}}
19887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &ovlConflict; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@191{{candidate function}} expected-note@192{{candidate function}}
19987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
20087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
20187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template <typename T>
20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T templated(T m) __attribute__((enable_if(true, ""))) { return T(); }
20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template <typename T>
20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T templated(T m) __attribute__((enable_if(false, ""))) { return T(); }
20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test4() {
20687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = templated<int>;
20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &templated<int>;
20887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
20987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = templated<int>;
21087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &templated<int>;
21187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
21287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
21387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template <typename T>
21487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T templatedBar(T m) __attribute__((enable_if(m > 0, ""))) { return T(); }
21587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test5() {
21687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = templatedBar<int>; // expected-error{{address of overloaded function 'templatedBar' does not match required type 'int (int)'}} expected-note@214{{candidate function made ineligible by enable_if}}
21787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &templatedBar<int>; // expected-error{{address of overloaded function 'templatedBar' does not match required type 'int (int)'}} expected-note@214{{candidate function made ineligible by enable_if}}
21887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
21987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = templatedBar<int>; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@214{{candidate function made ineligible by enable_if}}
22087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &templatedBar<int>; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@214{{candidate function made ineligible by enable_if}}
22187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
22287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
22387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template <typename T>
22487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T templatedConflict(T m) __attribute__((enable_if(false, ""))) { return T(); }
22587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template <typename T>
22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T templatedConflict(T m) __attribute__((enable_if(true, ""))) { return T(); }
22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template <typename T>
22887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T templatedConflict(T m) __attribute__((enable_if(1, ""))) { return T(); }
22987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test6() {
23087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = templatedConflict<int>; // expected-error{{address of overloaded function 'templatedConflict' is ambiguous}} expected-note@224{{candidate function made ineligible by enable_if}} expected-note@226{{candidate function}} expected-note@228{{candidate function}}
23187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p0)(int) = &templatedConflict<int>; // expected-error{{address of overloaded function 'templatedConflict' is ambiguous}} expected-note@224{{candidate function made ineligible by enable_if}} expected-note@226{{candidate function}} expected-note@228{{candidate function}}
23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = templatedConflict<int>; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@226{{candidate function}} expected-note@228{{candidate function}}
23487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &templatedConflict<int>; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@226{{candidate function}} expected-note@228{{candidate function}}
23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
23687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
23787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlNoCandidate(int m) __attribute__((enable_if(false, "")));
23887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int ovlNoCandidate(int m) __attribute__((enable_if(0, "")));
23987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test7() {
24087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = ovlNoCandidate; // expected-error{{address of overloaded function 'ovlNoCandidate' does not match required type}} expected-note@237{{made ineligible by enable_if}} expected-note@238{{made ineligible by enable_if}}
24187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &ovlNoCandidate; // expected-error{{address of overloaded function 'ovlNoCandidate' does not match required type}} expected-note@237{{made ineligible by enable_if}} expected-note@238{{made ineligible by enable_if}}
24287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
24387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = ovlNoCandidate; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@237{{made ineligible by enable_if}} expected-note@238{{made ineligible by enable_if}}
24487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &ovlNoCandidate; // expected-error{{assigning to 'int (*)(int)' from incompatible type '<overloaded function type>'}} expected-note@237{{made ineligible by enable_if}} expected-note@238{{made ineligible by enable_if}}
24587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
24687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
24787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int noOvlNoCandidate(int m) __attribute__((enable_if(false, "")));
24887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void test8() {
24987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p)(int) = noOvlNoCandidate; // expected-error{{cannot take address of function 'noOvlNoCandidate' becuase it has one or more non-tautological enable_if conditions}}
25087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*p2)(int) = &noOvlNoCandidate; // expected-error{{cannot take address of function 'noOvlNoCandidate' becuase it has one or more non-tautological enable_if conditions}}
25187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    int (*a)(int);
25287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = noOvlNoCandidate; // expected-error{{cannot take address of function 'noOvlNoCandidate' becuase it has one or more non-tautological enable_if conditions}}
25387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    a = &noOvlNoCandidate; // expected-error{{cannot take address of function 'noOvlNoCandidate' becuase it has one or more non-tautological enable_if conditions}}
25487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
25587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace casting {
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarusing VoidFnTy = void (*)();
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(void *c) __attribute__((enable_if(0, "")));
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(int *c) __attribute__((enable_if(c, "")));
2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(char *c) __attribute__((enable_if(1, "")));
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid testIt() {
2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto A = reinterpret_cast<VoidFnTy>(foo);
2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto AAmp = reinterpret_cast<VoidFnTy>(&foo);
2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using VoidFooTy = void (*)(void *);
2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto B = reinterpret_cast<VoidFooTy>(foo);
2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto BAmp = reinterpret_cast<VoidFooTy>(&foo);
2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using IntFooTy = void (*)(int *);
2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto C = reinterpret_cast<IntFooTy>(foo);
2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto CAmp = reinterpret_cast<IntFooTy>(&foo);
2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using CharFooTy = void (*)(void *);
2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto D = reinterpret_cast<CharFooTy>(foo);
2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto DAmp = reinterpret_cast<CharFooTy>(&foo);
2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid testItCStyle() {
2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto A = (VoidFnTy)foo;
2834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto AAmp = (VoidFnTy)&foo;
2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using VoidFooTy = void (*)(void *);
2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto B = (VoidFooTy)foo;
2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto BAmp = (VoidFooTy)&foo;
2884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using IntFooTy = void (*)(int *);
2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto C = (IntFooTy)foo;
2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto CAmp = (IntFooTy)&foo;
2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using CharFooTy = void (*)(void *);
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto D = (CharFooTy)foo;
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto DAmp = (CharFooTy)&foo;
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace casting_templates {
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T> void foo(T) {} // expected-note 4 {{candidate function}}
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(int *c) __attribute__((enable_if(c, ""))); //expected-note 4 {{candidate function}}
3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(char *c) __attribute__((enable_if(c, ""))); //expected-note 4 {{candidate function}}
3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid testIt() {
3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using IntFooTy = void (*)(int *);
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto A = reinterpret_cast<IntFooTy>(foo); // expected-error{{reinterpret_cast cannot resolve overloaded function 'foo' to type}}
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto ARef = reinterpret_cast<IntFooTy>(&foo); // expected-error{{reinterpret_cast cannot resolve overloaded function 'foo' to type}}
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto AExplicit = reinterpret_cast<IntFooTy>(foo<int*>);
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using CharFooTy = void (*)(char *);
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto B = reinterpret_cast<CharFooTy>(foo); // expected-error{{reinterpret_cast cannot resolve overloaded function 'foo' to type}}
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto BRef = reinterpret_cast<CharFooTy>(&foo); // expected-error{{reinterpret_cast cannot resolve overloaded function 'foo' to type}}
3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto BExplicit = reinterpret_cast<CharFooTy>(foo<char*>);
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid testItCStyle() {
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // constexpr is usable here because all of these should become static_casts.
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using IntFooTy = void (*)(int *);
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr auto A = (IntFooTy)foo;
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr auto ARef = (IntFooTy)&foo;
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr auto AExplicit = (IntFooTy)foo<int*>;
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  using CharFooTy = void (*)(char *);
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr auto B = (CharFooTy)foo;
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr auto BRef = (CharFooTy)&foo;
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr auto BExplicit = (CharFooTy)foo<char*>;
3284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static_assert(A == ARef && ARef == AExplicit, "");
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static_assert(B == BRef && BRef == BExplicit, "");
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace multiple_matches {
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarusing NoMatchTy = void (*)();
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(float *c); //expected-note 4 {{candidate function}}
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(int *c) __attribute__((enable_if(1, ""))); //expected-note 4 {{candidate function}}
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(char *c) __attribute__((enable_if(1, ""))); //expected-note 4 {{candidate function}}
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid testIt() {
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto A = reinterpret_cast<NoMatchTy>(foo); // expected-error{{reinterpret_cast cannot resolve overloaded function 'foo' to type}}
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto ARef = reinterpret_cast<NoMatchTy>(&foo); // expected-error{{reinterpret_cast cannot resolve overloaded function 'foo' to type}}
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto C = (NoMatchTy)foo; // expected-error{{address of overloaded function 'foo' does not match required type 'void ()'}}
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto CRef = (NoMatchTy)&foo; // expected-error{{address of overloaded function 'foo' does not match required type 'void ()'}}
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace PR27122 {
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// (slightly reduced) code that motivated the bug...
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace ns {
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Function(int num)
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __attribute__((enable_if(num != 0, "")));
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Function(int num, int a0)
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __attribute__((enable_if(num != 1, "")));
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}  // namespace ns
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarusing ns::Function; // expected-note 3{{declared here}}
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid Run() {
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Functioon(0); // expected-error{{use of undeclared identifier}} expected-error{{too few arguments}}
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Functioon(0, 1); // expected-error{{use of undeclared identifier}}
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Functioon(0, 1, 2); // expected-error{{use of undeclared identifier}}
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Extra tests
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid regularEnableIf(int a) __attribute__((enable_if(a, ""))); // expected-note 3{{declared here}} expected-note 3{{candidate function not viable}}
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid runRegularEnableIf() {
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  regularEnableIf(0, 2); // expected-error{{no matching function}}
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  regularEnableIf(1, 2); // expected-error{{no matching function}}
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  regularEnableIf(); // expected-error{{no matching function}}
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Test without getting overload resolution involved
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ::PR27122::regularEnableIf(0, 2); // expected-error{{too many arguments}}
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ::PR27122::regularEnableIf(1, 2); // expected-error{{too many arguments}}
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ::PR27122::regularEnableIf(); // expected-error{{too few arguments}}
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct Foo {
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void bar(int i) __attribute__((enable_if(i, ""))); // expected-note 2{{declared here}}
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid runFoo() {
3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Foo f;
3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  f.bar(); // expected-error{{too few arguments}}
3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  f.bar(1, 2); // expected-error{{too many arguments}}
3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ideally, we should be able to handle value-dependent expressions sanely.
3914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Sadly, that isn't the case at the moment.
3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace dependent {
3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint error(int N) __attribute__((enable_if(N, ""))); // expected-note{{candidate disabled}}
3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint error(int N) __attribute__((enable_if(!N, ""))); // expected-note{{candidate disabled}}
3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <int N> int callUnavailable() {
3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return error(N); // expected-error{{no matching function for call to 'error'}}
3974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr int noError(int N) __attribute__((enable_if(N, ""))) { return -1; }
4004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr int noError(int N) __attribute__((enable_if(!N, ""))) { return -1; }
4014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr int noError(int N) { return 0; }
4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <int N>
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr int callNoError() { return noError(N); }
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic_assert(callNoError<0>() == 0, "");
4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic_assert(callNoError<1>() == 0, "");
4074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <int N> constexpr int templated() __attribute__((enable_if(N, ""))) {
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return 1;
4104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr int A = templated<0>(); // expected-error{{no matching function for call to 'templated'}} expected-note@-4{{candidate disabled}}
4134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic_assert(templated<1>() == 1, "");
4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <int N> constexpr int callTemplated() { return templated<N>(); }
4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr int B = callTemplated<0>(); // expected-error{{initialized by a constant expression}} expected-error@-2{{no matching function for call to 'templated'}} expected-note{{in instantiation of function template}} expected-note@-9{{candidate disabled}}
4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic_assert(callTemplated<1>() == 1, "");
4194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
420