]> granicus.if.org Git - clang/commit
Fix the second half of PR34266: Don't implicitly capture '*this' if the members...
authorFaisal Vali <faisalv@yahoo.com>
Sun, 17 Sep 2017 15:37:51 +0000 (15:37 +0000)
committerFaisal Vali <faisalv@yahoo.com>
Sun, 17 Sep 2017 15:37:51 +0000 (15:37 +0000)
commita857498d9ee1da4bdbe0fa67d6f2f6c96c604f35
treeb7e5d80db43d727b63671d35373860c290edf6d0
parente7476fadc94b87293e7192c419125cf446d454ce
Fix the second half of PR34266:  Don't implicitly capture '*this' if the members are found in a class unrelated to the enclosing class.

https://bugs.llvm.org/show_bug.cgi?id=34266

For e.g.
  struct A {
     void f(int);
     static void f(char);
  };
  struct B {
    auto foo() {
      return [&] (auto a) {
         A::f(a); // this should not cause a capture of '*this'
      };
    }
  };

The patch does the following:
1) It moves the check to attempt an implicit capture of '*this' by reference into the more logical location of when the call is actually built within ActOnCallExpr (as opposed to when the unresolved-member-lookup node is created).
  - Reminder: A capture of '*this' by value has to always be an explicit capture.

2) It additionally checks whether the naming class of the UnresolvedMemberExpr ('A' in the example above) is related to the enclosing class ('B' above).

P.S. If you have access to ISO-C++'s CWG reflector, see this thread for some potentially related discussion: http://lists.isocpp.org/core/2017/08/2851.php

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@313487 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprMember.cpp
test/SemaCXX/cxx1y-generic-lambdas-capturing.cpp