This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Enough already with the KDE bug!


I've been reviewing a conversation on the code shown below. I was told
at the time that egcs is right and KDE/glibc is wrong; I now find
that this is not correct.

class X{
    unsigned int i;
  public:
    void f();
};

void X::f()
{
  int j=
  (__extension__ ({ union { __typeof(i) __in; int __i; } __u;
                            __u.__in = (i); __u.__i;}));
}

The code in question was similar to the one shown above. The error
message is

a.cc:10: member `i' is a private member of class `X'

It was argued that __typeof is similar to sizeof, and therefore the
same access control should be applied. So far so good.

It seems to me that the union is a local class as described in
[class.local]. In that section, the standard says

  A class can be defined within a function definition; such a class is
  called a local class. The name of a local class is local to its
  enclosing scope. The local class is in the scope of the enclosing
  scope, and has the same access to names outside the function as does
  the enclosing function.

Since `i'is a name outside the member function, the local class can
access it since the function can. So `i' should be accessible, even
though it is private.

What do you think?

Martin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]