// { dg-do assemble  }
// f() should be able to access B::j, as of FDIS [class.protected]/1

// Subject: Re: [bug] Inheritance and friend access control broken
// References: <199803032141.WAA09332@piano.dptmaths.ens-cachan.fr>
// <orhg5ff544.fsf@iguacu.dcc.unicamp.br>
// <199803041125.MAA06937@cor.dptmaths.ens-cachan.fr>
// <orn2f6ek92.fsf@iguacu.dcc.unicamp.br> <19980304102900.46897@dgii.com>
// From: Alexandre Oliva <oliva@dcc.unicamp.br>
// Date: 06 Mar 1998 01:43:18 -0300

template <int*>
class X {};

template <typename T>
void g();

struct S;

template <typename T>
struct R;

class B {
protected:
  int i; // { dg-error "" } in this context
  static int j;
};

class D : public B {
  friend void f();
  template <typename T>
  friend void g();
  friend struct S;
  template <typename T>
  friend struct R;
};

struct S {
  void h();
  X<&B::j> x;
};

template <typename T>
struct R {
  void h();
  X<&B::j> x;
};

B b;
D d;

void f()
{
    b.i = 3; // { dg-error "" } protected
    d.i = 4;
    B::j = 5;
    D::j = 6;
}

template <typename T>
void g()
{
    b.i = 3; // { dg-error "" } protected
    d.i = 4;
    B::j = 5;
    D::j = 6;
}

template void g<int>();

void S::h()
{
  b.i = 3; // { dg-error "" } protected
  d.i = 4;
  B::j = 5;
  D::j = 6;
}

template <typename T>
void R<T>::h() 
{
  b.i = 3; // { dg-error "" } protected
  d.i = 4;
  B::j = 5;
  D::j = 6;
}

template struct R<double>;
