struct S;
extern S *p;
template<class T> int f(T*, int y = ((T*)p)->x) {
  return y;
}
struct S {
private:
  int x;
  template<class U> friend int f(U*, int); 
};
int g() {
  return f(p);
}

compiles OK with 3.3, but is rejected by 4.1, 4.0 and 3.4:

t4.cc:8: error: 'int S::x' is private
t4.cc:12: error: within this context

According to Mark: This is a G++ bug.  G++ is apparently performing access
control for the default argument expression for "y" (in the template function
"f") in the context of the instantiation, rather than in the context of the
template function.  See [temp.inst] for details.

-- 
           Summary: [3.4/4.0/4.1 Regression] Incorrect access control
                    context
           Product: gcc
           Version: 4.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jsm28 at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23842

Reply via email to