[Bug c++/51494] Legal program rejection - capturing "this" when using static method inside lambda

luto at mit dot edu gcc-bugzilla@gcc.gnu.org
Thu May 3 21:53:00 GMT 2012


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

Andy Lutomirski <luto at mit dot edu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |luto at mit dot edu

--- Comment #2 from Andy Lutomirski <luto at mit dot edu> 2012-05-03 21:53:18 UTC ---
This seems to have gotten worse in gcc 4.7.  This code is now rejected as well:

This code:

struct A
{
  static void func1() {}
};

template<typename T>
struct B : public A
{
  void func2() const
  {
    func3([&]{ func1(); });
  }

  template<typename Func>
  void func3(Func f) const
  {
  }
};

template class B<int>;

The error is:

template_bug.cc: In instantiation of ‘B<T>::func2() const [with T =
int]::<lambda()>’:
template_bug.cc:11:22:   required from ‘struct B<T>::func2() const [with T =
int]::<lambda()>’
template_bug.cc:11:5:   required from ‘void B<T>::func2() const [with T = int]’
template_bug.cc:20:16:   required from here
template_bug.cc:11:16: error: redeclaration of ‘const B<int>* const
B<T>::func2() const [with T = int]::<lambda()>::__this’
template_bug.cc:11:22: note: previous declaration ‘const B<int>* const
B<T>::func2() const [with T = int]::<lambda()>::__this’
template_bug.cc:11:16: error: redeclaration of ‘const B<int>* const this’
template_bug.cc:11:22: error: ‘const B<int>* const this’ previously declared
here
template_bug.cc:15:8: error: ‘void B<T>::func3(Func) const [with Func =
B<T>::func2() const [with T = int]::<lambda()>; T = int]’, declared using local
type ‘B<T>::func2() const [with T = int]::<lambda()>’, is used but never
defined [-fpermissive]

Your patch fixes this test case, too.



More information about the Gcc-bugs mailing list