10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++14 20033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlsson 30033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonfriend class A; // expected-error {{'friend' used outside of class}} 40033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonvoid f() { friend class A; } // expected-error {{'friend' used outside of class}} 50033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonclass C { friend class A; }; 60033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonclass D { void f() { friend class A; } }; // expected-error {{'friend' used outside of class}} 7e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall 8e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall// PR5760 9e7e278bce2301990107cef3f873cbbf7da94469aJohn McCallnamespace test0 { 10e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall namespace ns { 11e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall void f(int); 12e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall } 13e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall 14e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall struct A { 15e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall friend void ns::f(int a); 16e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall }; 17e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall} 18e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall 19e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall// Test derived from LLVM's Registry.h 20e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCallnamespace test1 { 21e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall template <class T> struct Outer { 22e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall void foo(T); 23e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall struct Inner { 24e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall friend void Outer::foo(T); 25e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall }; 26e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall }; 27e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall 28e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall void test() { 29e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall (void) Outer<int>::Inner(); 30e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall } 31e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall} 32df370002215a56cbbee139630f1cd8c8299b861fJohn McCall 33df370002215a56cbbee139630f1cd8c8299b861fJohn McCall// PR5476 34df370002215a56cbbee139630f1cd8c8299b861fJohn McCallnamespace test2 { 35df370002215a56cbbee139630f1cd8c8299b861fJohn McCall namespace foo { 36df370002215a56cbbee139630f1cd8c8299b861fJohn McCall void Func(int x); 37df370002215a56cbbee139630f1cd8c8299b861fJohn McCall } 38df370002215a56cbbee139630f1cd8c8299b861fJohn McCall 39df370002215a56cbbee139630f1cd8c8299b861fJohn McCall class Bar { 40df370002215a56cbbee139630f1cd8c8299b861fJohn McCall friend void ::test2::foo::Func(int x); 41df370002215a56cbbee139630f1cd8c8299b861fJohn McCall }; 42df370002215a56cbbee139630f1cd8c8299b861fJohn McCall} 43bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall 44bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall// PR5134 45bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCallnamespace test3 { 46bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall class Foo { 47f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer friend const int getInt(int inInt = 0) {} 485291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor 49bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall }; 50bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall} 51e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor 52e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregornamespace test4 { 53e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor class T4A { 54e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor friend class T4B; 55e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor 56e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor public: 57e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor T4A(class T4B *); 58e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor 59e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor protected: 60e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor T4B *mB; // error here 61e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor }; 62e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor 63e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor class T4B {}; 64e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor} 651d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis 661d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidisnamespace rdar8529993 { 67cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregorstruct A { ~A(); }; 681d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis 691d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidisstruct B : A 701d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis{ 71cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor template<int> friend A::~A(); // expected-error {{destructor cannot be declared as a template}} 721d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis}; 731d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis} 74d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall 75d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall// PR7915 76d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCallnamespace test5 { 77d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall struct A; 78d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall struct A1 { friend void A(); }; 79d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall 80d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall struct B { friend void B(); }; 81d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall} 8208e41a656575ee63f8eefc7805493055c645fa85Nico Weber 8308e41a656575ee63f8eefc7805493055c645fa85Nico Weber// PR8479 8408e41a656575ee63f8eefc7805493055c645fa85Nico Webernamespace test6_1 { 8508e41a656575ee63f8eefc7805493055c645fa85Nico Weber class A { 8608e41a656575ee63f8eefc7805493055c645fa85Nico Weber public: 8708e41a656575ee63f8eefc7805493055c645fa85Nico Weber private: 8808e41a656575ee63f8eefc7805493055c645fa85Nico Weber friend class vectorA; 8908e41a656575ee63f8eefc7805493055c645fa85Nico Weber A() {} 9008e41a656575ee63f8eefc7805493055c645fa85Nico Weber }; 9108e41a656575ee63f8eefc7805493055c645fa85Nico Weber class vectorA { 9208e41a656575ee63f8eefc7805493055c645fa85Nico Weber public: 9308e41a656575ee63f8eefc7805493055c645fa85Nico Weber vectorA(int i, const A& t = A()) {} 9408e41a656575ee63f8eefc7805493055c645fa85Nico Weber }; 9508e41a656575ee63f8eefc7805493055c645fa85Nico Weber void f() { 9608e41a656575ee63f8eefc7805493055c645fa85Nico Weber vectorA v(1); 9708e41a656575ee63f8eefc7805493055c645fa85Nico Weber } 9808e41a656575ee63f8eefc7805493055c645fa85Nico Weber} 9908e41a656575ee63f8eefc7805493055c645fa85Nico Webernamespace test6_2 { 10008e41a656575ee63f8eefc7805493055c645fa85Nico Weber template<class T> 10108e41a656575ee63f8eefc7805493055c645fa85Nico Weber class vector { 10208e41a656575ee63f8eefc7805493055c645fa85Nico Weber public: 10308e41a656575ee63f8eefc7805493055c645fa85Nico Weber vector(int i, const T& t = T()) {} 10408e41a656575ee63f8eefc7805493055c645fa85Nico Weber }; 10508e41a656575ee63f8eefc7805493055c645fa85Nico Weber class A { 10608e41a656575ee63f8eefc7805493055c645fa85Nico Weber public: 10708e41a656575ee63f8eefc7805493055c645fa85Nico Weber private: 10808e41a656575ee63f8eefc7805493055c645fa85Nico Weber friend class vector<A>; 10908e41a656575ee63f8eefc7805493055c645fa85Nico Weber A() {} 11008e41a656575ee63f8eefc7805493055c645fa85Nico Weber }; 11108e41a656575ee63f8eefc7805493055c645fa85Nico Weber void f() { 11208e41a656575ee63f8eefc7805493055c645fa85Nico Weber vector<A> v(1); 11308e41a656575ee63f8eefc7805493055c645fa85Nico Weber } 11408e41a656575ee63f8eefc7805493055c645fa85Nico Weber} 11515d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Webernamespace test6_3 { 11615d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber template<class T> 11715d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber class vector { 11815d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber public: 11915d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber vector(int i) {} 12015d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber void f(const T& t = T()) {} 12115d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber }; 12215d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber class A { 12315d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber public: 12415d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber private: 12515d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber friend void vector<A>::f(const A&); 12615d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber A() {} 12715d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber }; 12815d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber void f() { 12915d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber vector<A> v(1); 13015d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber v.f(); 13115d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber } 13215d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber} 1339c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky 1349c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewyckynamespace test7 { 1359c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky extern "C" { 1369c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky class X { 137aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith friend int test7_f() { return 42; } 1389c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky }; 1399c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky } 1409c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky} 14178037ac3e7562aa3e306eaba97f1c609b86337d9John McCall 14278037ac3e7562aa3e306eaba97f1c609b86337d9John McCall// PR15485 14378037ac3e7562aa3e306eaba97f1c609b86337d9John McCallnamespace test8 { 14478037ac3e7562aa3e306eaba97f1c609b86337d9John McCall namespace ns1 { 14578037ac3e7562aa3e306eaba97f1c609b86337d9John McCall namespace ns2 { 14678037ac3e7562aa3e306eaba97f1c609b86337d9John McCall template<class T> void f(T t); // expected-note {{target of using declaration}} 14778037ac3e7562aa3e306eaba97f1c609b86337d9John McCall } 14878037ac3e7562aa3e306eaba97f1c609b86337d9John McCall using ns2::f; // expected-note {{using declaration}} 14978037ac3e7562aa3e306eaba97f1c609b86337d9John McCall } 15078037ac3e7562aa3e306eaba97f1c609b86337d9John McCall struct A { void f(); }; // expected-note {{target of using declaration}} 15178037ac3e7562aa3e306eaba97f1c609b86337d9John McCall struct B : public A { using A::f; }; // expected-note {{using declaration}} 15278037ac3e7562aa3e306eaba97f1c609b86337d9John McCall struct X { 15378037ac3e7562aa3e306eaba97f1c609b86337d9John McCall template<class T> friend void ns1::f(T t); // expected-error {{cannot befriend target of using declaration}} 15478037ac3e7562aa3e306eaba97f1c609b86337d9John McCall friend void B::f(); // expected-error {{cannot befriend target of using declaration}} 15578037ac3e7562aa3e306eaba97f1c609b86337d9John McCall }; 15678037ac3e7562aa3e306eaba97f1c609b86337d9John McCall} 157319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin 158319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin// PR16423 159319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Linnamespace test9 { 160319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin class C { 161319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin }; 162319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin struct A { 163319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin friend void C::f(int, int, int) {} // expected-error {{no function named 'f' with type 'void (int, int, int)' was found in the specified scope}} 164319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin }; 165319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin} 166f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith 167f9e65a274d4e5c5a45503efc81da43be76503983Richard Smithnamespace test10 { 16822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith struct X {}; 16922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_a(); 17022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_a(X); 171f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith struct A { 17222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_a(); 17322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_b(); 17422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_c(); 17522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(); 17622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_a(X); 17722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_b(X); 17822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_c(X); 17922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(X); 180f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith }; 18122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_b(); 18222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_b(X); 183f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith struct B { 18422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_a(); 18522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_b(); 18622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_c(); 18722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(); 18822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_a(X); 18922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_b(X); 19022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_c(X); 19122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(X); 192f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith }; 19322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_c(); 19422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_c(X); 19522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 19622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // FIXME: Give a better diagnostic for the case where a function exists but is 19722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // not visible. 19822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith void g(X x) { 19922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_a(); 20022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_b(); 20122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_c(); 20222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); // expected-error {{undeclared identifier}} 20322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 20422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_a(); 20522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_b(); 20622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_c(); 20722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(); // expected-error {{no member named 'f10_d'}} 20822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 20922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_a(x); 21022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_b(x); 21122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_c(x); 21222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); // PR16597: expected-error {{undeclared identifier}} 21322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 21422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_a(x); 21522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_b(x); 21622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_c(x); 21722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(x); // expected-error {{no type named 'f10_d'}} 21822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith } 21922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 22022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith struct Y : X { 22122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(); 22222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(X); 22322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith }; 22422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 22522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith struct Z { 22622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith operator X(); 22722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(); 22822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(X); 22922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith }; 23022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 23122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith void g(X x, Y y, Z z) { 23222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); // expected-error {{undeclared identifier}} 23322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(); // expected-error {{no member named 'f10_d'}} 23422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 23522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // f10_d is visible to ADL in the second and third cases. 23622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); // expected-error {{undeclared identifier}} 23722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(y); 23822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(z); 23922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 24022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // No ADL here. 24122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(x); // expected-error {{no type named 'f10_d'}} 24222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(y); // expected-error {{no type named 'f10_d'}} 24322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(z); // expected-error {{no type named 'f10_d'}} 24422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith } 24522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 24622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith void local_externs(X x, Y y) { 24722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_d(); 24822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_d(X); 24922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); 25022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); 25122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // FIXME: This lookup should fail, because the local extern declaration 25222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // should suppress ADL. 25322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(y); 25422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith { 25522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith int f10_d; 25622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); // expected-error {{not a function}} 25722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); // expected-error {{not a function}} 25822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(y); // expected-error {{not a function}} 25922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith } 26022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith } 26122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 26222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith void i(X x, Y y) { 26322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); // expected-error {{undeclared identifier}} 26422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); // expected-error {{undeclared identifier}} 26522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(y); 26622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith } 26722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 26822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith struct C { 26922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(); 27022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith friend void f10_d(X); 27122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith }; 27222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 27322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith void j(X x, Y y) { 27422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); // expected-error {{undeclared identifier}} 27522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); // expected-error {{undeclared identifier}} 27622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(y); 27722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith } 27822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith 27922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_d(); 28022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith extern void f10_d(X); 28122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith void k(X x, Y y, Z z) { 28222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith // All OK now. 28322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(); 28422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith f10_d(x); 28522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(); 28622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(x); 28722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(y); 28822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith ::test10::f10_d(z); 289f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith } 290f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith} 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test11 { 2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines class __attribute__((visibility("hidden"))) B; 2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines class A { 2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend class __attribute__((visibility("hidden"), noreturn)) B; // expected-warning {{'noreturn' attribute only applies to functions and methods}} 2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 2990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3000e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace pr21851 { 3010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// PR21851 was a problem where we assumed that when the friend function redecl 3020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// lookup found a C++ method, it would necessarily have a qualifier. Below we 3030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// have some test cases where unqualified lookup finds C++ methods without using 3040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// qualifiers. Unfortunately, we can't exercise the case of an access check 3050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// failure because nested classes always have access to the members of outer 3060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// classes. 3070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3080e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid friend_own_method() { 3090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines class A { 3100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void m() {} 3110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines friend void m(); 3120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }; 3130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3150e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid friend_enclosing_method() { 3160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines class A; 3170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines class C { 3180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines int p; 3190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines friend class A; 3200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }; 3210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines class A { 3220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void enclosing_friend() { 3230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (void)b->p; 3240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (void)c->p; 3250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines class B { 3270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void b(A *a) { 3280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (void)a->c->p; 3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines int p; 3310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines friend void enclosing_friend(); 3320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }; 3330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines B *b; 3340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines C *c; 3350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }; 3360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3380e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic auto friend_file_func() { 3390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines extern void file_scope_friend(); 3400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines class A { 3410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines int p; 3420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines friend void file_scope_friend(); 3430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines }; 3440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return A(); 3450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3470e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid file_scope_friend() { 3480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines auto a = friend_file_func(); 3490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (void)a.p; 3500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3530e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate<typename T> 3540e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct X_pr6954 { 3550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines operator int(); 3560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines friend void f_pr6954(int x); 3570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}; 3580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3590e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint array0_pr6954[sizeof(X_pr6954<int>)]; 3600e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint array1_pr6954[sizeof(X_pr6954<float>)]; 3610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3620e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid g_pr6954() { 3630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines f_pr6954(5); // expected-error{{undeclared identifier 'f_pr6954'}} 3640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 3650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 366