// { dg-do assemble  }
// GROUPS passed visibility
#include <iostream>



class base {
//==========

    void base_priv(const char * n) 		
	{ std::cout << "base_priv called from: " << n << "\n";  };

protected:

    void base_prot(const char * n) 
	{ std::cout << "base_prot called from: " << n << "\n"; };

public:

    void base_publ(const char * n) 
	{ std::cout << "base_publ called from: " << n << "\n"; };

    void test(const char * n) { base_publ(n); base_prot(n); base_priv(n); }

}; // class base
 


class derived : public base {	// Make this public, 
//============================	// and we don't get an error

friend void derived_friend();

public :

    void test(const char * n) { base_publ(n); base_prot(n);}

}; // class derived



void
derived_friend()
//--------------
{
    derived pd;

    pd.base_publ("friend of derived class");	// Compiler error here
    pd.base_prot("friend of derived class");
}



int main(int argc, char *argv[])
//==========================
{
    base b;
    b.base_publ("base class object");
    b.test("member of base class object");
    std::cout << "\n";

    derived pd;
    pd.test("member of derived class object");
    derived_friend();
    std::cout << "\n";

} /* main */

