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