17002f4c03c2d0544f4e8bea8d3a5636519081e35John McCall// RUN: %clang_cc1 -fsyntax-only -verify %s 27bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 37bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// C++'0x [class.friend] p1: 47bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// A friend of a class is a function or class that is given permission to use 57bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// the private and protected member names from the class. A class specifies 67bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// its friends, if any, by way of friend declarations. Such declarations give 77bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// special access rights to the friends, but they do not make the nominated 87bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// friends members of the befriending class. 97bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 10b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrainstruct S { static void f(); }; // expected-note 2 {{'S' declared here}} 11b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn UhrainS* g() { return 0; } // expected-note 2 {{'g' declared here}} 127bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 137bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruthstruct X { 147bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth friend struct S; 157bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth friend S* g(); 167bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth}; 177bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 187bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruthvoid test1() { 197bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth S s; 207bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth g()->f(); 217bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth S::f(); 22b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain X::g(); // expected-error{{no member named 'g' in 'X'; did you mean simply 'g'?}} 23b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain X::S x_s; // expected-error{{no type named 'S' in 'X'; did you mean simply 'S'?}} 247bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth X x; 257c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall x.g(); // expected-error{{no member named 'g' in 'X'}} 267bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth} 277bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 287bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// Test that we recurse through namespaces to find already declared names, but 297bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth// new names are declared within the enclosing namespace. 307bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruthnamespace N { 317bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth struct X { 327bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth friend struct S; 337bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth friend S* g(); 347bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 357bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth friend struct S2; 367bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth friend struct S2* g2(); 377bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth }; 387bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 39b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain struct S2 { static void f2(); }; // expected-note 2 {{'S2' declared here}} 40b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain S2* g2() { return 0; } // expected-note 2 {{'g2' declared here}} 417bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 427bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth void test() { 437bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth g()->f(); 447bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth S s; 457bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth S::f(); 46b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain X::g(); // expected-error{{no member named 'g' in 'N::X'; did you mean simply 'g'?}} 47b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain X::S x_s; // expected-error{{no type named 'S' in 'N::X'; did you mean simply 'S'?}} 487bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth X x; 497c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall x.g(); // expected-error{{no member named 'g' in 'N::X'}} 507bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth 517bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth g2(); 527bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth S2 s2; 53b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain ::g2(); // expected-error{{no member named 'g2' in the global namespace; did you mean simply 'g2'?}} 54b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain ::S2 g_s2; // expected-error{{no type named 'S2' in the global namespace; did you mean simply 'S2'?}} 55b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain X::g2(); // expected-error{{no member named 'g2' in 'N::X'; did you mean simply 'g2'?}} 56b5c7768a74936d4e2c7a484570a638cb74702d8bKaelyn Uhrain X::S2 x_s2; // expected-error{{no type named 'S2' in 'N::X'; did you mean simply 'S2'?}} 577c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall x.g2(); // expected-error{{no member named 'g2' in 'N::X'}} 587bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth } 597bf3600f56342dc434dad994d0c71068e5d3b5c7Chandler Carruth} 60d60e22e601852ae1345f01514318a0951dc09f89John McCall 61d60e22e601852ae1345f01514318a0951dc09f89John McCallnamespace test0 { 62d60e22e601852ae1345f01514318a0951dc09f89John McCall class ClassFriend { 63d60e22e601852ae1345f01514318a0951dc09f89John McCall void test(); 64d60e22e601852ae1345f01514318a0951dc09f89John McCall }; 65d60e22e601852ae1345f01514318a0951dc09f89John McCall 66d60e22e601852ae1345f01514318a0951dc09f89John McCall class MemberFriend { 671f2e1a96bec2ba6418ae7f2d2b525a3575203b6aJohn McCall public: 68d60e22e601852ae1345f01514318a0951dc09f89John McCall void test(); 69d60e22e601852ae1345f01514318a0951dc09f89John McCall }; 70d60e22e601852ae1345f01514318a0951dc09f89John McCall 71d60e22e601852ae1345f01514318a0951dc09f89John McCall void declared_test(); 72d60e22e601852ae1345f01514318a0951dc09f89John McCall 73d60e22e601852ae1345f01514318a0951dc09f89John McCall class Class { 74ceef4ce492c6725180438da69e6621fa0833f523John McCall static void member(); // expected-note 2 {{declared private here}} 75d60e22e601852ae1345f01514318a0951dc09f89John McCall 76d60e22e601852ae1345f01514318a0951dc09f89John McCall friend class ClassFriend; 77d60e22e601852ae1345f01514318a0951dc09f89John McCall friend class UndeclaredClassFriend; 78d60e22e601852ae1345f01514318a0951dc09f89John McCall 79d60e22e601852ae1345f01514318a0951dc09f89John McCall friend void undeclared_test(); 80d60e22e601852ae1345f01514318a0951dc09f89John McCall friend void declared_test(); 81d60e22e601852ae1345f01514318a0951dc09f89John McCall friend void MemberFriend::test(); 82d60e22e601852ae1345f01514318a0951dc09f89John McCall }; 83d60e22e601852ae1345f01514318a0951dc09f89John McCall 84d60e22e601852ae1345f01514318a0951dc09f89John McCall void declared_test() { 85d60e22e601852ae1345f01514318a0951dc09f89John McCall Class::member(); 86d60e22e601852ae1345f01514318a0951dc09f89John McCall } 87d60e22e601852ae1345f01514318a0951dc09f89John McCall 88d60e22e601852ae1345f01514318a0951dc09f89John McCall void undeclared_test() { 89d60e22e601852ae1345f01514318a0951dc09f89John McCall Class::member(); 90d60e22e601852ae1345f01514318a0951dc09f89John McCall } 91d60e22e601852ae1345f01514318a0951dc09f89John McCall 92d60e22e601852ae1345f01514318a0951dc09f89John McCall void unfriended_test() { 93d60e22e601852ae1345f01514318a0951dc09f89John McCall Class::member(); // expected-error {{'member' is a private member of 'test0::Class'}} 94d60e22e601852ae1345f01514318a0951dc09f89John McCall } 95d60e22e601852ae1345f01514318a0951dc09f89John McCall 96d60e22e601852ae1345f01514318a0951dc09f89John McCall void ClassFriend::test() { 97d60e22e601852ae1345f01514318a0951dc09f89John McCall Class::member(); 98d60e22e601852ae1345f01514318a0951dc09f89John McCall } 99d60e22e601852ae1345f01514318a0951dc09f89John McCall 100d60e22e601852ae1345f01514318a0951dc09f89John McCall void MemberFriend::test() { 101d60e22e601852ae1345f01514318a0951dc09f89John McCall Class::member(); 102d60e22e601852ae1345f01514318a0951dc09f89John McCall } 103d60e22e601852ae1345f01514318a0951dc09f89John McCall 104d60e22e601852ae1345f01514318a0951dc09f89John McCall class UndeclaredClassFriend { 105d60e22e601852ae1345f01514318a0951dc09f89John McCall void test() { 106d60e22e601852ae1345f01514318a0951dc09f89John McCall Class::member(); 107d60e22e601852ae1345f01514318a0951dc09f89John McCall } 108d60e22e601852ae1345f01514318a0951dc09f89John McCall }; 109ceef4ce492c6725180438da69e6621fa0833f523John McCall 110ceef4ce492c6725180438da69e6621fa0833f523John McCall class ClassNonFriend { 111ceef4ce492c6725180438da69e6621fa0833f523John McCall void test() { 112ceef4ce492c6725180438da69e6621fa0833f523John McCall Class::member(); // expected-error {{'member' is a private member of 'test0::Class'}} 113ceef4ce492c6725180438da69e6621fa0833f523John McCall } 114ceef4ce492c6725180438da69e6621fa0833f523John McCall }; 115d60e22e601852ae1345f01514318a0951dc09f89John McCall} 1167aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1177aceaf8cee77c98478e8934dc283910292711a7eJohn McCall// Make sure that friends have access to inherited protected members. 1187aceaf8cee77c98478e8934dc283910292711a7eJohn McCallnamespace test2 { 1197aceaf8cee77c98478e8934dc283910292711a7eJohn McCall struct X; 1207aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1217aceaf8cee77c98478e8934dc283910292711a7eJohn McCall class ilist_half_node { 1227aceaf8cee77c98478e8934dc283910292711a7eJohn McCall friend struct ilist_walker_bad; 1237aceaf8cee77c98478e8934dc283910292711a7eJohn McCall X *Prev; 1247aceaf8cee77c98478e8934dc283910292711a7eJohn McCall protected: 12576ef658c703faf72c00f324fb9edc03169718e3eDouglas Gregor X *getPrev() { return Prev; } // expected-note{{member is declared here}} 1267aceaf8cee77c98478e8934dc283910292711a7eJohn McCall }; 1277aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1287aceaf8cee77c98478e8934dc283910292711a7eJohn McCall class ilist_node : private ilist_half_node { // expected-note {{declared private here}} expected-note {{constrained by private inheritance here}} 1297aceaf8cee77c98478e8934dc283910292711a7eJohn McCall friend struct ilist_walker; 1307aceaf8cee77c98478e8934dc283910292711a7eJohn McCall X *Next; 1317aceaf8cee77c98478e8934dc283910292711a7eJohn McCall X *getNext() { return Next; } // expected-note {{declared private here}} 1327aceaf8cee77c98478e8934dc283910292711a7eJohn McCall }; 1337aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1347aceaf8cee77c98478e8934dc283910292711a7eJohn McCall struct X : ilist_node {}; 1357aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1367aceaf8cee77c98478e8934dc283910292711a7eJohn McCall struct ilist_walker { 1377aceaf8cee77c98478e8934dc283910292711a7eJohn McCall static X *getPrev(X *N) { return N->getPrev(); } 1387aceaf8cee77c98478e8934dc283910292711a7eJohn McCall static X *getNext(X *N) { return N->getNext(); } 1397aceaf8cee77c98478e8934dc283910292711a7eJohn McCall }; 1407aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1417aceaf8cee77c98478e8934dc283910292711a7eJohn McCall struct ilist_walker_bad { 1427aceaf8cee77c98478e8934dc283910292711a7eJohn McCall static X *getPrev(X *N) { return N->getPrev(); } // \ 1437aceaf8cee77c98478e8934dc283910292711a7eJohn McCall // expected-error {{'getPrev' is a private member of 'test2::ilist_half_node'}} \ 1447aceaf8cee77c98478e8934dc283910292711a7eJohn McCall // expected-error {{cannot cast 'test2::X' to its private base class 'test2::ilist_half_node'}} 1457aceaf8cee77c98478e8934dc283910292711a7eJohn McCall 1467aceaf8cee77c98478e8934dc283910292711a7eJohn McCall static X *getNext(X *N) { return N->getNext(); } // \ 1477aceaf8cee77c98478e8934dc283910292711a7eJohn McCall // expected-error {{'getNext' is a private member of 'test2::ilist_node'}} 1487aceaf8cee77c98478e8934dc283910292711a7eJohn McCall }; 1497aceaf8cee77c98478e8934dc283910292711a7eJohn McCall} 150e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall 151e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCallnamespace test3 { 152e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall class A { protected: int x; }; // expected-note {{declared protected here}} 153e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall 154e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall class B : public A { 155e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall friend int foo(B*); 156e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall }; 157e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall 158e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall int foo(B *p) { 159e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall return p->x; 160e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall } 161e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall 162e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall int foo(const B *p) { 163e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall return p->x; // expected-error {{'x' is a protected member of 'test3::A'}} 164e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall } 165e06c1a13172bd6ef38fe927d72198ab3f97c0b4aJohn McCall} 166d325daa506338ab86f9dd468b48fd010673f49a6John McCall 1677c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greifnamespace test3a { 1687c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif class A { protected: int x; }; 1697c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif 1707c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif class B : public A { 1717c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif friend int foo(B*); 1727c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif }; 1737c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif 1747c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif int foo(B * const p) { 1757c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif return p->x; 1767c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif } 1777c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif} 1787c3745af0a171bd62605177e53fc0fce3ff6ab25Gabor Greif 179d325daa506338ab86f9dd468b48fd010673f49a6John McCallnamespace test4 { 180d325daa506338ab86f9dd468b48fd010673f49a6John McCall template <class T> class Holder { 181d325daa506338ab86f9dd468b48fd010673f49a6John McCall T object; 182d325daa506338ab86f9dd468b48fd010673f49a6John McCall friend bool operator==(Holder &a, Holder &b) { 183d325daa506338ab86f9dd468b48fd010673f49a6John McCall return a.object == b.object; // expected-error {{invalid operands to binary expression}} 184d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 185d325daa506338ab86f9dd468b48fd010673f49a6John McCall }; 186d325daa506338ab86f9dd468b48fd010673f49a6John McCall 187d325daa506338ab86f9dd468b48fd010673f49a6John McCall struct Inequal {}; 188d325daa506338ab86f9dd468b48fd010673f49a6John McCall bool test() { 189238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor Holder<Inequal> a, b; 190238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor return a == b; // expected-note {{requested here}} 191d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 192d325daa506338ab86f9dd468b48fd010673f49a6John McCall} 1939ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall 1949ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall 1959ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall// PR6174 1969ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCallnamespace test5 { 1979ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall namespace ns { 1989ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall class A; 1999ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall } 2009ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall 2019ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall class ns::A { 2029ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall private: int x; 2039ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall friend class B; 2049ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall }; 2059ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall 2069ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall namespace ns { 2079ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall class B { 2089ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall int test(A *p) { return p->x; } 2099ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall }; 2109ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall } 2119ea6397bf4ff53768ef4bdc0945965103a22e98cJohn McCall} 2123d04336baf091b16e9d8f85b48b82dafd2695874John McCall 2133d04336baf091b16e9d8f85b48b82dafd2695874John McCall// PR6207 2143d04336baf091b16e9d8f85b48b82dafd2695874John McCallnamespace test6 { 2153d04336baf091b16e9d8f85b48b82dafd2695874John McCall struct A {}; 2163d04336baf091b16e9d8f85b48b82dafd2695874John McCall 2173d04336baf091b16e9d8f85b48b82dafd2695874John McCall struct B { 2183d04336baf091b16e9d8f85b48b82dafd2695874John McCall friend A::A(); 2193d04336baf091b16e9d8f85b48b82dafd2695874John McCall friend A::~A(); 2203d04336baf091b16e9d8f85b48b82dafd2695874John McCall friend A &A::operator=(const A&); 2213d04336baf091b16e9d8f85b48b82dafd2695874John McCall }; 2223d04336baf091b16e9d8f85b48b82dafd2695874John McCall} 22377e8b11524187f81548450e9e2ad9dd0e7200909John McCall 22477e8b11524187f81548450e9e2ad9dd0e7200909John McCallnamespace test7 { 22577e8b11524187f81548450e9e2ad9dd0e7200909John McCall template <class T> struct X { 22677e8b11524187f81548450e9e2ad9dd0e7200909John McCall X(); 22777e8b11524187f81548450e9e2ad9dd0e7200909John McCall ~X(); 22877e8b11524187f81548450e9e2ad9dd0e7200909John McCall void foo(); 22977e8b11524187f81548450e9e2ad9dd0e7200909John McCall void bar(); 23077e8b11524187f81548450e9e2ad9dd0e7200909John McCall }; 23177e8b11524187f81548450e9e2ad9dd0e7200909John McCall 23277e8b11524187f81548450e9e2ad9dd0e7200909John McCall class A { 23377e8b11524187f81548450e9e2ad9dd0e7200909John McCall friend void X<int>::foo(); 23477e8b11524187f81548450e9e2ad9dd0e7200909John McCall friend X<int>::X(); 23577e8b11524187f81548450e9e2ad9dd0e7200909John McCall friend X<int>::X(const X&); 23677e8b11524187f81548450e9e2ad9dd0e7200909John McCall 23777e8b11524187f81548450e9e2ad9dd0e7200909John McCall private: 23877e8b11524187f81548450e9e2ad9dd0e7200909John McCall A(); // expected-note 2 {{declared private here}} 23977e8b11524187f81548450e9e2ad9dd0e7200909John McCall }; 24077e8b11524187f81548450e9e2ad9dd0e7200909John McCall 24177e8b11524187f81548450e9e2ad9dd0e7200909John McCall template<> void X<int>::foo() { 24277e8b11524187f81548450e9e2ad9dd0e7200909John McCall A a; 24377e8b11524187f81548450e9e2ad9dd0e7200909John McCall } 24477e8b11524187f81548450e9e2ad9dd0e7200909John McCall 24577e8b11524187f81548450e9e2ad9dd0e7200909John McCall template<> void X<int>::bar() { 24677e8b11524187f81548450e9e2ad9dd0e7200909John McCall A a; // expected-error {{calling a private constructor}} 24777e8b11524187f81548450e9e2ad9dd0e7200909John McCall } 24877e8b11524187f81548450e9e2ad9dd0e7200909John McCall 24977e8b11524187f81548450e9e2ad9dd0e7200909John McCall template<> X<int>::X() { 25077e8b11524187f81548450e9e2ad9dd0e7200909John McCall A a; 25177e8b11524187f81548450e9e2ad9dd0e7200909John McCall } 25277e8b11524187f81548450e9e2ad9dd0e7200909John McCall 25377e8b11524187f81548450e9e2ad9dd0e7200909John McCall template<> X<int>::~X() { 25477e8b11524187f81548450e9e2ad9dd0e7200909John McCall A a; // expected-error {{calling a private constructor}} 25577e8b11524187f81548450e9e2ad9dd0e7200909John McCall } 25677e8b11524187f81548450e9e2ad9dd0e7200909John McCall} 257630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth 258630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth// Return types, parameters and default arguments to friend functions. 259630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruthnamespace test8 { 260630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth class A { 261630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth typedef int I; // expected-note 4 {{declared private here}} 262aa56a66abb61e9f42b48ae88e43328aba10c9148John McCall static const I x = 0; // expected-note {{implicitly declared private here}} 263630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth friend I f(I i); 264630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth template<typename T> friend I g(I i); 265630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth }; 266630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth 267aa56a66abb61e9f42b48ae88e43328aba10c9148John McCall const A::I A::x; 268630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth A::I f(A::I i = A::x) {} 269630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth template<typename T> A::I g(A::I i) { 270630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth T t; 271630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth } 272630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth template A::I g<A::I>(A::I i); 273630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth 274630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth A::I f2(A::I i = A::x) {} // expected-error 3 {{is a private member of}} 275630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth template<typename T> A::I g2(A::I i) { // expected-error 2 {{is a private member of}} 276630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth T t; 277630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth } 278630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth template A::I g2<A::I>(A::I i); 279630eb01b2568d0958118eb1a0ded02bebecb2b0fChandler Carruth} 2800d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall 2810d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall// PR6885 2820d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCallnamespace test9 { 2830d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall class B { 2840d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall friend class test9; 2850d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall }; 2860d6b1640eb4d1a4a0203235cfdfcdaf3335af36dJohn McCall} 2879da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall 2889da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall// PR7230 2899da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCallnamespace test10 { 290aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith extern "C" void test10_f(void); 291aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith extern "C" void test10_g(void); 2929da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall 2939da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall namespace NS { 2949da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall class C { 2959da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall void foo(void); // expected-note {{declared private here}} 296aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith friend void test10::test10_f(void); 2979da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall }; 2989da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall static C* bar; 2999da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall } 3009da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall 301aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith void test10_f(void) { 3029da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall NS::bar->foo(); 3039da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall } 3049da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall 305aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith void test10_g(void) { 3069da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall NS::bar->foo(); // expected-error {{private member}} 3079da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall } 3089da9cdfd5ac5fcbb8c6a9fc38938e845e53af1edJohn McCall} 309eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall 310eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall// PR8705 311eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCallnamespace test11 { 312eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall class A { 3131f2e1a96bec2ba6418ae7f2d2b525a3575203b6aJohn McCall public: 314eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void test0(int); 315eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void test1(int); 316eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void test2(int); 317eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void test3(int); 318eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall }; 319eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall 320eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall class B { 321eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall typedef int private_type; // expected-note 2 {{implicitly declared private here}} 322eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall friend void A::test0(int); 323eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall friend void A::test1(int); 324eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall }; 325eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall 326eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void A::test0(B::private_type x) {} 327eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void A::test1(int x = B::private_type()) {} 328eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void A::test2(B::private_type x) {} // expected-error {{'private_type' is a private member of 'test11::B'}} 329eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall void A::test3(int x = B::private_type()) {} // expected-error {{'private_type' is a private member of 'test11::B'}} 330eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall} 331417d39f300da40067600863c2733fdeb513fb4d2John McCall 332417d39f300da40067600863c2733fdeb513fb4d2John McCall 333417d39f300da40067600863c2733fdeb513fb4d2John McCall// PR9221 334417d39f300da40067600863c2733fdeb513fb4d2John McCallnamespace test12 { 335417d39f300da40067600863c2733fdeb513fb4d2John McCall struct A { 336417d39f300da40067600863c2733fdeb513fb4d2John McCall void foo(); 337417d39f300da40067600863c2733fdeb513fb4d2John McCall }; 338417d39f300da40067600863c2733fdeb513fb4d2John McCall class B : private A { 339417d39f300da40067600863c2733fdeb513fb4d2John McCall friend void A::foo(); 340417d39f300da40067600863c2733fdeb513fb4d2John McCall void *mem; 341417d39f300da40067600863c2733fdeb513fb4d2John McCall }; 342417d39f300da40067600863c2733fdeb513fb4d2John McCall void A::foo() { 343417d39f300da40067600863c2733fdeb513fb4d2John McCall void *var = static_cast<B*>(this)->mem; 344417d39f300da40067600863c2733fdeb513fb4d2John McCall } 345417d39f300da40067600863c2733fdeb513fb4d2John McCall} 346ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor 347ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregornamespace PR9103 { 348ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor struct base { 349ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor protected: 350ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor static void foo(void) {} 351ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor }; 352ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor 353ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor struct cls: base { 354ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor friend void bar(void) { 355ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor base::foo(); 356ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor } 357ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor }; 358ac57f0b9097e04f70a631549383a2944f74ad844Douglas Gregor} 3598bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall 3608bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall// PR13642. When computing the effective context, we were walking up 3618bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall// the DC chain for the canonical decl, which is unfortunate if that's 3628bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall// (e.g.) a friend declaration. 3638bddeb57d134c0e5f14e319271aa9015886a8ac7John McCallnamespace test14 { 3648bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall class A { 3658bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall class B { // expected-note {{implicitly declared private here}} 3668bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall static int i; 3678bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall friend void c(); 3688bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall }; 3698bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall }; 3708bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall 3718bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall void c() { 3728bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall A::B::i = 5; // expected-error {{'B' is a private member of 'test14::A'}} 3738bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall } 3748bddeb57d134c0e5f14e319271aa9015886a8ac7John McCall} 375