1fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorclass X { }; 3eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 4eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas GregorX operator+(X, X); 5eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 6eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorvoid f(X x) { 7eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor x = x + x; 8eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor} 9eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 10eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorstruct Y; 11eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorstruct Z; 12eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 13eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorstruct Y { 14eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor Y(const Z&); 15eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor}; 16eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 17eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorstruct Z { 18eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor Z(const Y&); 19eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor}; 20eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 21eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas GregorY operator+(Y, Y); 22eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorbool operator-(Y, Y); // expected-note{{candidate function}} 23eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorbool operator-(Z, Z); // expected-note{{candidate function}} 24eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 25eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregorvoid g(Y y, Z z) { 26eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor y = y + z; 27ae2cf767de457df939d07c44b162de5fe0b5e607Douglas Gregor bool b = y - z; // expected-error{{use of overloaded operator '-' is ambiguous}} 28eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor} 29eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 3096176b3575823ea996c6140380dd17d9240c9766Douglas Gregorstruct A { 313307475eb0dd6e5d88be9392ea8247d0b6b812dfDouglas Gregor bool operator==(Z&); // expected-note 2{{candidate function}} 3296176b3575823ea996c6140380dd17d9240c9766Douglas Gregor}; 3396176b3575823ea996c6140380dd17d9240c9766Douglas Gregor 3496176b3575823ea996c6140380dd17d9240c9766Douglas GregorA make_A(); 35eaebc75ef6ff21fbc9f25ab4175cba465e4e0e43Douglas Gregor 36439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregorbool operator==(A&, Z&); // expected-note 3{{candidate function}} 3796176b3575823ea996c6140380dd17d9240c9766Douglas Gregor 3896176b3575823ea996c6140380dd17d9240c9766Douglas Gregorvoid h(A a, const A ac, Z z) { 399b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth make_A() == z; // expected-warning{{equality comparison result unused}} 40ae2cf767de457df939d07c44b162de5fe0b5e607Douglas Gregor a == z; // expected-error{{use of overloaded operator '==' is ambiguous}} 410c42bb653dc40b1caae010618831e320af824b18Chris Lattner ac == z; // expected-error{{invalid operands to binary expression ('const A' and 'Z')}} 4296176b3575823ea996c6140380dd17d9240c9766Douglas Gregor} 4396176b3575823ea996c6140380dd17d9240c9766Douglas Gregor 4496176b3575823ea996c6140380dd17d9240c9766Douglas Gregorstruct B { 4596176b3575823ea996c6140380dd17d9240c9766Douglas Gregor bool operator==(const B&) const; 4696176b3575823ea996c6140380dd17d9240c9766Douglas Gregor 4796176b3575823ea996c6140380dd17d9240c9766Douglas Gregor void test(Z z) { 489b10683a3f222d8dc6e139073ca96b97b439747bChandler Carruth make_A() == z; // expected-warning{{equality comparison result unused}} 4996176b3575823ea996c6140380dd17d9240c9766Douglas Gregor } 5096176b3575823ea996c6140380dd17d9240c9766Douglas Gregor}; 51447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 52d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregor// we shouldn't see warnings about self-comparison, 53d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregor// this is a member function, we dunno what it'll do 54d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregorbool i(B b) 55d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregor{ 56d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregor return b == b; 57d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregor} 58d64fdd0c056f1e50488519254f852fa8050f0470Douglas Gregor 59447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorenum Enum1 { }; 60447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorenum Enum2 { }; 61447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 62447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorstruct E1 { 63447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor E1(Enum1) { } 64447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor}; 65447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 66447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregorstruct E2 { 67447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor E2(Enum2); 68447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor}; 69447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 70447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor// C++ [over.match.oper]p3 - enum restriction. 71439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregorfloat& operator==(E1, E2); // expected-note{{candidate function}} 72447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor 73543cb655b174087f6c2d22009934c9fed6c32114Chandler Carruthvoid enum_test(Enum1 enum1, Enum2 enum2, E1 e1, E2 e2, Enum1 next_enum1) { 74447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor float &f1 = (e1 == e2); 75447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor float &f2 = (enum1 == e2); 76447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor float &f3 = (e1 == enum2); 77543cb655b174087f6c2d22009934c9fed6c32114Chandler Carruth float &f4 = (enum1 == next_enum1); // expected-error{{non-const lvalue reference to type 'float' cannot bind to a temporary of type 'bool'}} 78447b69e55e1098d8df46dd99f171bfaace9ff8a0Douglas Gregor} 7974253736184c0717a0649922551bf9d8b6815651Douglas Gregor 80644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl// PR5244 - Argument-dependent lookup would include the two operators below, 81644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl// which would break later assumptions and lead to a crash. 82644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redlclass pr5244_foo 83644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl{ 84644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl pr5244_foo(int); 85644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl pr5244_foo(char); 86644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl}; 87644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl 88439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregorbool operator==(const pr5244_foo& s1, const pr5244_foo& s2); // expected-note{{candidate function}} 89439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregorbool operator==(char c, const pr5244_foo& s); // expected-note{{candidate function}} 90644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl 91644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redlenum pr5244_bar 92644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl{ 93644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl pr5244_BAR 94644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl}; 95644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl 96644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redlclass pr5244_baz 97644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl{ 987002f4c03c2d0544f4e8bea8d3a5636519081e35John McCallpublic: 99644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl pr5244_bar quux; 100644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl}; 101644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl 102644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redlvoid pr5244_barbaz() 103644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl{ 104644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl pr5244_baz quuux; 105644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl (void)(pr5244_BAR == quuux.quux); 106644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl} 107644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl 108644be853b87cae94fcabaf309a5e482a8c291fb9Sebastian Redl 10974253736184c0717a0649922551bf9d8b6815651Douglas Gregor 11074253736184c0717a0649922551bf9d8b6815651Douglas Gregorstruct PostInc { 11174253736184c0717a0649922551bf9d8b6815651Douglas Gregor PostInc operator++(int); 11274253736184c0717a0649922551bf9d8b6815651Douglas Gregor PostInc& operator++(); 11374253736184c0717a0649922551bf9d8b6815651Douglas Gregor}; 11474253736184c0717a0649922551bf9d8b6815651Douglas Gregor 11574253736184c0717a0649922551bf9d8b6815651Douglas Gregorstruct PostDec { 11674253736184c0717a0649922551bf9d8b6815651Douglas Gregor PostDec operator--(int); 11774253736184c0717a0649922551bf9d8b6815651Douglas Gregor PostDec& operator--(); 11874253736184c0717a0649922551bf9d8b6815651Douglas Gregor}; 11974253736184c0717a0649922551bf9d8b6815651Douglas Gregor 12074253736184c0717a0649922551bf9d8b6815651Douglas Gregorvoid incdec_test(PostInc pi, PostDec pd) { 12174253736184c0717a0649922551bf9d8b6815651Douglas Gregor const PostInc& pi1 = pi++; 12274253736184c0717a0649922551bf9d8b6815651Douglas Gregor const PostDec& pd1 = pd--; 12374253736184c0717a0649922551bf9d8b6815651Douglas Gregor PostInc &pi2 = ++pi; 12474253736184c0717a0649922551bf9d8b6815651Douglas Gregor PostDec &pd2 = --pd; 12574253736184c0717a0649922551bf9d8b6815651Douglas Gregor} 12674253736184c0717a0649922551bf9d8b6815651Douglas Gregor 12774253736184c0717a0649922551bf9d8b6815651Douglas Gregorstruct SmartPtr { 12874253736184c0717a0649922551bf9d8b6815651Douglas Gregor int& operator*(); 1291ca50c3f541dd637063b9d186a7ea193e3440a48Douglas Gregor long& operator*() const volatile; 13074253736184c0717a0649922551bf9d8b6815651Douglas Gregor}; 13174253736184c0717a0649922551bf9d8b6815651Douglas Gregor 1321ca50c3f541dd637063b9d186a7ea193e3440a48Douglas Gregorvoid test_smartptr(SmartPtr ptr, const SmartPtr cptr, 1331ca50c3f541dd637063b9d186a7ea193e3440a48Douglas Gregor const volatile SmartPtr cvptr) { 13474253736184c0717a0649922551bf9d8b6815651Douglas Gregor int &ir = *ptr; 1351ca50c3f541dd637063b9d186a7ea193e3440a48Douglas Gregor long &lr = *cptr; 1361ca50c3f541dd637063b9d186a7ea193e3440a48Douglas Gregor long &lr2 = *cvptr; 13774253736184c0717a0649922551bf9d8b6815651Douglas Gregor} 138337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 139337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 140337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregorstruct ArrayLike { 141337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor int& operator[](int); 142337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor}; 143337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 144337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregorvoid test_arraylike(ArrayLike a) { 145337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor int& ir = a[17]; 146337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor} 147337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 148337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregorstruct SmartRef { 149337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor int* operator&(); 150337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor}; 151337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 152337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregorvoid test_smartref(SmartRef r) { 153337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor int* ip = &r; 154337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor} 155337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 156337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregorbool& operator,(X, Y); 157337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor 158337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregorvoid test_comma(X x, Y y) { 159337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor bool& b1 = (x, y); 1601b2ad2fd9e2d5352144481aa1fd995d333d9adc9Argyrios Kyrtzidis X& xr = (x, x); // expected-warning {{expression result unused}} 161337c6b9f5d502dc1c5acea628bf7bf9e828efc0eDouglas Gregor} 162f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor 163f9eb905197e44ed5634205512074993f6f40470dDouglas Gregorstruct Callable { 164f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor int& operator()(int, double = 2.71828); // expected-note{{candidate function}} 165f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor float& operator()(int, double, long, ...); // expected-note{{candidate function}} 166518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor 167518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor double& operator()(float); // expected-note{{candidate function}} 168518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor}; 169518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor 170518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregorstruct Callable2 { 171518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor int& operator()(int i = 0); 172518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor double& operator()(...) const; 173f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor}; 174f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor 175593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregorstruct DerivesCallable : public Callable { 176593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregor}; 177593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregor 178593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregorvoid test_callable(Callable c, Callable2 c2, const Callable2& c2c, 179593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregor DerivesCallable dc) { 180f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor int &ir = c(1); 181f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor float &fr = c(1, 3.14159, 17, 42); 182f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor 1837c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall c(); // expected-error{{no matching function for call to object of type 'Callable'}} 184518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor 185518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor double &dr = c(1.0f); 186518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor 187518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor int &ir2 = c2(); 188518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor int &ir3 = c2(1); 189518fda1d121dcba3ad7276f5e9a94f733f6e5ecdDouglas Gregor double &fr2 = c2c(); 190593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregor 191593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregor int &ir4 = dc(17); 192593564ba94ff854b7a410a4ca17ad34a90c5b761Douglas Gregor double &fr3 = dc(3.14159f); 193f9eb905197e44ed5634205512074993f6f40470dDouglas Gregor} 194106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregor 195621b3933e570792810386b891264c78e3bd7b169Douglas Gregortypedef float FLOAT; 196621b3933e570792810386b891264c78e3bd7b169Douglas Gregortypedef int& INTREF; 197621b3933e570792810386b891264c78e3bd7b169Douglas Gregortypedef INTREF Func1(FLOAT, double); 198106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregortypedef float& Func2(int, double); 199106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregor 200106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregorstruct ConvertToFunc { 2019007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor operator Func1*(); // expected-note 2{{conversion candidate of type 'INTREF (*)(FLOAT, double)'}} 2029007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor operator Func2&(); // expected-note 2{{conversion candidate of type 'float &(&)(int, double)'}} 2039ebae31a97f862771dc5f6bd4923dd97131fed71Douglas Gregor void operator()(); 204106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregor}; 205106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregor 2069007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregorstruct ConvertToFuncDerived : ConvertToFunc { }; 2079007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor 2089007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregorvoid test_funcptr_call(ConvertToFunc ctf, ConvertToFuncDerived ctfd) { 209106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregor int &i1 = ctf(1.0f, 2.0); 2109007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor float &f1 = ctf((short int)1, 1.0f); 2117c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall ctf((long int)17, 2.0); // expected-error{{call to object of type 'ConvertToFunc' is ambiguous}} 2129ebae31a97f862771dc5f6bd4923dd97131fed71Douglas Gregor ctf(); 2139007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor 2149007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor int &i2 = ctfd(1.0f, 2.0); 2159007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor float &f2 = ctfd((short int)1, 1.0f); 2167c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall ctfd((long int)17, 2.0); // expected-error{{call to object of type 'ConvertToFuncDerived' is ambiguous}} 2179007328043c9c17029e07c99d89d0488fb3da3a7Douglas Gregor ctfd(); 218106c6eb3f1380bfe243a62d8f0f8bce6a7c8d5c6Douglas Gregor} 2198ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor 2208ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregorstruct HasMember { 2218ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor int m; 2228ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor}; 2238ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor 2248ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregorstruct Arrow1 { 2258ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor HasMember* operator->(); 2268ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor}; 2278ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor 2288ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregorstruct Arrow2 { 2298ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor Arrow1 operator->(); // expected-note{{candidate function}} 2308ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor}; 2318ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor 2328ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregorvoid test_arrow(Arrow1 a1, Arrow2 a2, const Arrow2 a3) { 2338ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor int &i1 = a1->m; 2348ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor int &i2 = a2->m; 2352fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu a3->m; // expected-error{{no viable overloaded 'operator->'}} 2368ba10745f525467e91bbaec21044bf4d9017a988Douglas Gregor} 237e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor 238e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregorstruct CopyConBase { 239e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor}; 240e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor 241e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregorstruct CopyCon : public CopyConBase { 242e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor CopyCon(const CopyConBase &Base); 243e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor 244e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor CopyCon(const CopyConBase *Base) { 245e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor *this = *Base; 246e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor } 247e63ef48b76b84e7ffb0a38fbf475ddea5c48adb4Douglas Gregor}; 248fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor 249fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregornamespace N { 250fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor struct X { }; 251fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor} 252fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor 253fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregornamespace M { 254fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor N::X operator+(N::X, N::X); 255fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor} 256fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor 257fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregornamespace M { 258fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor void test_X(N::X x) { 259f680a0fe2dcab32b59fe6fdf71145b5313c40950Douglas Gregor (void)(x + x); 260fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor } 261fa047648b2a5502d7eef117adb4777eb9a63baa6Douglas Gregor} 2628a5ae2401645788144c0ae769a2fb899866801f5Douglas Gregor 2638a5ae2401645788144c0ae769a2fb899866801f5Douglas Gregorstruct AA { bool operator!=(AA&); }; 2648a5ae2401645788144c0ae769a2fb899866801f5Douglas Gregorstruct BB : AA {}; 2658a5ae2401645788144c0ae769a2fb899866801f5Douglas Gregorbool x(BB y, BB z) { return y != z; } 2664a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian 2674a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian 2684a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanianstruct AX { 269d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson AX& operator ->(); // expected-note {{declared here}} 2704a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian int b; 2714a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian}; 2724a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian 2734a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanianvoid m() { 2744a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian AX a; 2754a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian a->b = 0; // expected-error {{circular pointer delegation detected}} 2764a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7Fariborz Jahanian} 277c4e8321deb2bd83f734a09749460050f40ec51d1John McCall 278c4e8321deb2bd83f734a09749460050f40ec51d1John McCallstruct CircA { 279d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson struct CircB& operator->(); // expected-note {{declared here}} 280c4e8321deb2bd83f734a09749460050f40ec51d1John McCall int val; 281c4e8321deb2bd83f734a09749460050f40ec51d1John McCall}; 282c4e8321deb2bd83f734a09749460050f40ec51d1John McCallstruct CircB { 283d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson struct CircC& operator->(); // expected-note {{declared here}} 284c4e8321deb2bd83f734a09749460050f40ec51d1John McCall}; 285c4e8321deb2bd83f734a09749460050f40ec51d1John McCallstruct CircC { 286d1aa800a19c956c72319025dd302ae78ed47f9eeAnders Carlsson struct CircA& operator->(); // expected-note {{declared here}} 287c4e8321deb2bd83f734a09749460050f40ec51d1John McCall}; 288c4e8321deb2bd83f734a09749460050f40ec51d1John McCall 289c4e8321deb2bd83f734a09749460050f40ec51d1John McCallvoid circ() { 290c4e8321deb2bd83f734a09749460050f40ec51d1John McCall CircA a; 291c4e8321deb2bd83f734a09749460050f40ec51d1John McCall a->val = 0; // expected-error {{circular pointer delegation detected}} 292c4e8321deb2bd83f734a09749460050f40ec51d1John McCall} 293a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl 294a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl// PR5360: Arrays should lead to built-in candidates for subscript. 295a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redltypedef enum { 2966d82ef45d624da4fc88a2fbf7dd1dc144aeb05b0Douglas Gregor LastReg = 23, 297a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl} Register; 298a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redlclass RegAlloc { 299a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl int getPriority(Register r) { 300a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl return usepri[r]; 301a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl } 302a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl int usepri[LastReg + 1]; 303a65b55142bd8e8c94f371bb056d8f58f11de220fSebastian Redl}; 304a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl 305a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl// PR5546: Don't generate incorrect and ambiguous overloads for multi-level 306a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl// arrays. 307a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redlnamespace pr5546 308a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl{ 309a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl enum { X }; 310a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl extern const char *const sMoveCommands[][2][2]; 311a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl const char* a() { return sMoveCommands[X][0][0]; } 312a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl const char* b() { return (*(sMoveCommands+X))[0][0]; } 313a9efadada0430493a4d68b34b2e76580d0fd8f10Sebastian Redl} 314275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl 315275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl// PR5512 and its discussion 316275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redlnamespace pr5512 { 317275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl struct Y { 318275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl operator short(); 319275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl operator float(); 320275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl }; 321275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl void g_test(Y y) { 322275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl short s = 0; 323275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl // DR507, this should be ambiguous, but we special-case assignment 324275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl s = y; 325275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl // Note: DR507, this is ambiguous as specified 326275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl //s += y; 327275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl } 328275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl 329275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl struct S {}; 330275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl void operator +=(int&, S); 331275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl void f(S s) { 332275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl int i = 0; 333275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl i += s; 334275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl } 335275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl 336275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl struct A {operator int();}; 337275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl int a; 338275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl void b(A x) { 339275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl a += x; 340275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl } 341275c2b47a1dc200d6b55dd867bdfeb7a91b8d876Sebastian Redl} 3421eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall 3431eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall// PR5900 3441eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCallnamespace pr5900 { 3451eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall struct NotAnArray {}; 3461eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall void test0() { 3471eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall NotAnArray x; 3481eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall x[0] = 0; // expected-error {{does not provide a subscript operator}} 3491eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall } 3501eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall 3511eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall struct NonConstArray { 3521eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall int operator[](unsigned); // expected-note {{candidate}} 3531eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall }; 3541eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall int test1() { 3559db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor const NonConstArray x = NonConstArray(); 3561eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall return x[0]; // expected-error {{no viable overloaded operator[] for type}} 3571eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall } 3581eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall 3591eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall // Not really part of this PR, but implemented at the same time. 3601eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall struct NotAFunction {}; 3611eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall void test2() { 3621eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall NotAFunction x; 3631eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall x(); // expected-error {{does not provide a call operator}} 3641eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall } 3651eb3e1003d5cda4d47f54321d81d678c26981e7aJohn McCall} 3666bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor 3676bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor// Operator lookup through using declarations. 3686bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregornamespace N { 3696bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor struct X2 { }; 3706bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor} 3716bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor 3726bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregornamespace N2 { 3736bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor namespace M { 3746bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor namespace Inner { 3756bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor template<typename T> 3766bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor N::X2 &operator<<(N::X2&, const T&); 3776bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor } 3786bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor using Inner::operator<<; 3796bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor } 3806bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor} 3816bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor 3826bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregorvoid test_lookup_through_using() { 3836bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor using namespace N2::M; 3846bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor N::X2 x; 3856bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor x << 17; 3866bf356fb8f769575d5e6e54a3bf81436ddec106aDouglas Gregor} 38760b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor 38860b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregornamespace rdar9136502 { 38960b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor struct X { 390c2fe81898b1b3b948791ca4ababd3d495601f22aDavid Blaikie int i(); // expected-note{{possible target for call}} 391c2fe81898b1b3b948791ca4ababd3d495601f22aDavid Blaikie int i(int); // expected-note{{possible target for call}} 39260b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor }; 39360b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor 39460b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor struct Y { 3955acb0c98b363400f6ade0ae7250f0102224e806bJohn McCall Y &operator<<(int); 39660b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor }; 39760b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor 39860b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor void f(X x, Y y) { 39916b0a310f5649d25849d84409841f401e7a9a0e5David Blaikie y << x 400c2fe81898b1b3b948791ca4ababd3d495601f22aDavid Blaikie .i; // expected-error{{reference to non-static member function must be called; did you mean to call it with no arguments?}} 40160b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor } 40260b3e38d421cab497de1c62c06be6a6a5f321edfDouglas Gregor} 403439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor 404439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregornamespace rdar9222009 { 405439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregorclass StringRef { 406439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor inline bool operator==(StringRef LHS, StringRef RHS) { // expected-error{{overloaded 'operator==' must be a binary operator (has 3 parameters)}} 407439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor return !(LHS == RHS); // expected-error{{invalid operands to binary expression ('rdar9222009::StringRef' and 'rdar9222009::StringRef')}} 408439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor } 409439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor}; 410439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor 411439d3c3d76f858df5f25239f2a70f04312eacb5bDouglas Gregor} 4128788491e10a24e70b7282f312c22d74ac478c899Eli Friedman 4138788491e10a24e70b7282f312c22d74ac478c899Eli Friedmannamespace PR11784 { 4148788491e10a24e70b7282f312c22d74ac478c899Eli Friedman struct A { A& operator=(void (*x)()); }; 4158788491e10a24e70b7282f312c22d74ac478c899Eli Friedman void f(); 4168788491e10a24e70b7282f312c22d74ac478c899Eli Friedman void f(int); 4178788491e10a24e70b7282f312c22d74ac478c899Eli Friedman void g() { A x; x = f; } 4188788491e10a24e70b7282f312c22d74ac478c899Eli Friedman} 4197a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall 4207a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCallnamespace test10 { 4217a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall struct A { 4227a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall void operator[](float (*fn)(int)); // expected-note 2 {{not viable: no overload of 'bar' matching 'float (*)(int)'}} 4237a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall }; 4247a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall 4257a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall float foo(int); 4267a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall float foo(float); 4277a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall 4287a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall template <class T> T bar(T); 4297a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall template <class T, class U> T bar(U); 4307a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall 4317a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall void test(A &a) { 4327a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall a[&foo]; 4337a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall a[foo]; 4347a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall 4357a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall a[&bar<int>]; // expected-error {{no viable overloaded operator[]}} 4367a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall a[bar<int>]; // expected-error {{no viable overloaded operator[]}} 4377a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall 4387a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall // If these fail, it's because we're not letting the overload 4397a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall // resolution for operator| resolve the overload of 'bar'. 4407a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall a[&bar<float>]; 4417a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall a[bar<float>]; 4427a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall } 4437a534b94138ef2ad1a75b26b3b5bf1aa948d4121John McCall} 444fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman 445fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedmanstruct InvalidOperatorEquals { 446fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman InvalidOperatorEquals operator=() = delete; // expected-error {{overloaded 'operator=' must be a binary operator}} 447fcb5a251e9c0c8c2d54323677d4f2ba5219301d0Eli Friedman}; 4483f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedman 4493f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedmannamespace PR7681 { 4503f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedman template <typename PT1, typename PT2> class PointerUnion; 4513f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedman void foo(PointerUnion<int*, float*> &Result) { 4523f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedman Result = 1; // expected-error {{no viable overloaded '='}} // expected-note {{type 'PointerUnion<int *, float *>' is incomplete}} 4533f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedman } 4543f93d4ce2ba550f1dac4ae544ffe1349e42f708aEli Friedman} 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR14995 { 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct B {}; 458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename ...T> void operator++(B, T...) {} 459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void f() { 461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B b; 462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines b++; // ok 463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ++b; // ok 464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename... T> 467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct C { 468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void operator-- (T...) {} 469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void g() { 472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C<int> postfix; 473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C<> prefix; 474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines postfix--; // ok 475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines --prefix; // ok 476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct D {}; 479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename T> void operator++(D, T) {} 480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void h() { 482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines D d; 483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines d++; // ok 484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ++d; // expected-error{{cannot increment value of type 'PR14995::D'}} 485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename...T> struct E { 488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void operator++(T...) {} // expected-error{{parameter of overloaded post-increment operator must have type 'int' (not 'char')}} 489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 491651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines E<char> e; // expected-note {{in instantiation of template class 'PR14995::E<char>' requested here}} 492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines struct F { 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines template<typename... T> 495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int operator++ (T...) {} 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int k1 = F().operator++(0, 0); 499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int k2 = F().operator++('0'); 500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-5 {{overloaded 'operator++' must be a unary or binary operator}} 501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-3 {{in instantiation of function template specialization 'PR14995::F::operator++<int, int>' requested here}} 502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-4 {{no matching member function for call to 'operator++'}} 503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-8 {{candidate template ignored: substitution failure}} 504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-9 {{parameter of overloaded post-increment operator must have type 'int' (not 'char')}} 505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-6 {{in instantiation of function template specialization 'PR14995::F::operator++<char>' requested here}} 506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-error@-7 {{no matching member function for call to 'operator++'}} 507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // expected-note@-12 {{candidate template ignored: substitution failure}} 508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // namespace PR14995 509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ConversionVersusTemplateOrdering { 5116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct A { 5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines operator short() = delete; 5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template <typename T> operator T(); 5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } a; 5156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct B { 5166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template <typename T> operator T(); 5176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines operator short() = delete; 5186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } b; 5196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int x = a; 5206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int y = b; 5216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace NoADLForMemberOnlyOperators { 524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename T> struct A { typename T::error e; }; // expected-error {{type 'char' cannot be used prior to '::'}} 525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<typename T> struct B { int n; }; 526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 527176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void f(B<A<void> > b1, B<A<int> > b2, B<A<char> > b3) { 528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines b1 = b1; // ok, does not instantiate A<void>. 529176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines (void)b1->n; // expected-error {{is not a pointer}} 530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines b2[3]; // expected-error {{does not provide a subscript}} 531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines b3 / 0; // expected-note {{in instantiation of}} expected-error {{invalid operands to}} 532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 534