[PATCH] Fix PR20619 - failure to define implicit copy ctor of a by val capture in a generic lambda

Richard Smith richard at metafoo.co.uk
Tue Jan 13 15:01:46 PST 2015


On reflection, can we delay building the initialization expressions for captures until we get to the end of the lambda expression? There seems to be no need to build them early, and delaying would solve the wrong-context problem implicitly.


================
Comment at: lib/Sema/SemaExpr.cpp:12118-12136
@@ +12117,21 @@
+
+  struct TemporarilyJumpOutToDeclContextScopeGuard {
+    Sema &S;
+    Scope *CurScope;
+    DeclContext *CurContext;
+    TemporarilyJumpOutToDeclContextScopeGuard(Sema &S, LambdaScopeInfo *LSI)
+        : S(S), CurScope(S.getCurScope()), CurContext(S.CurContext) {
+      S.CurContext = LSI->Lambda->getDeclContext();
+      // FVQUESTION: Do we really need to mess with the Scope - or can I just
+      // ignore it since, unless I am entirely mistake, its raison d'ĂȘtre seems
+      // to be to aid the Parser, which will not be invoked from the ensuing
+      // sequence?
+      S.setCurScope(S.getScopeForContext(S.CurContext));
+    }
+    ~TemporarilyJumpOutToDeclContextScopeGuard() {
+      S.CurContext = CurContext;
+      S.setCurScope(CurScope);
+    }
+  } DeclContextScopeGuard(S, LSI);
+
+  // Construct the entity that we will be initializing. For an array, this will
----------------
This is:

    ContextRAII SwitchToLambdaContext(S, LSI->Lambda->getDeclContext());

================
Comment at: lib/Sema/SemaExpr.cpp:12125-12128
@@ +12124,6 @@
+      S.CurContext = LSI->Lambda->getDeclContext();
+      // FVQUESTION: Do we really need to mess with the Scope - or can I just
+      // ignore it since, unless I am entirely mistake, its raison d'ĂȘtre seems
+      // to be to aid the Parser, which will not be invoked from the ensuing
+      // sequence?
+      S.setCurScope(S.getScopeForContext(S.CurContext));
----------------
You shouldn't need this; `CurScope` should only be used while parsing (and ideally shouldn't be used in Sema for C++ at all); if we use `CurScope` in here, we will do the wrong thing during template instantiation, where `CurScope` is not set.

http://reviews.llvm.org/D6171

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the cfe-commits mailing list