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

            Bug ID: 58972
           Summary: Lambda can't access private members
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: akim.demaille at gmail dot com

Hi all,

Again, this problem report might be bogus.  IANALL and reading the proposed
standard did not really help me understand if the problem is in the compiler,
or in the eye of the beholder.

Anyway, I think that if this is not a problem of G++, it is one of C++.  At
least Clang++ (3.4) accepts it.

$ cat foo.cc
class base
{
protected:
  using type = int;
};

template <typename T>
class derive: public base
{
  using typename base::type;
public:
  void foo(type a)
  {
    auto f = [a](type x){ return x == a; };
    f(32);
  }
};

int main()
{
  derive<char> d;
  d.foo(23);
}
$ clang++-mp-3.4 -std=c++11 foo.cc
$ g++-mp-4.9 --version
g++-mp-4.9 (MacPorts gcc49 4.9-20130915_0) 4.9.0 20130915 (experimental)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++-mp-4.9 -std=c++11 foo.cc
foo.cc: In instantiation of 'struct derive<T>::foo(base::type) [with T = char;
base::type = int]::<lambda(using type = int)>':
foo.cc:14:42:   required from 'void derive<T>::foo(base::type) [with T = char;
base::type = int]'
foo.cc:22:11:   required from here
foo.cc:4:19: error: 'using type = int' is protected
   using type = int;
                   ^
foo.cc:14:18: error: within this context
     auto f = [a](type x){ return x == a; };
                  ^
$ g++-mp-4.8 --version
g++-mp-4.8 (MacPorts gcc48 4.8.1_3) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++-mp-4.8 -std=c++11 foo.cc
foo.cc: In instantiation of 'struct derive<T>::foo(base::type) [with T = char;
base::type = int]::__lambda0':
foo.cc:14:42:   required from 'void derive<T>::foo(base::type) [with T = char;
base::type = int]'
foo.cc:22:11:   required from here
foo.cc:4:19: error: 'using type = int' is protected
   using type = int;
                   ^
foo.cc:14:18: error: within this context
     auto f = [a](type x){ return x == a; };
                  ^

FWIW, if derived is no longer template, it works.

BTW, someone should have a look at this:
http://stackoverflow.com/questions/11933999/why-is-it-not-possible-to-use-private-method-in-a-lambda
(and especially http://ideone.com/DJezf).  Maybe it's the same issue, maybe
it's slightly different, but again, clang++ eats it.

Reply via email to