rjmccall added inline comments.
================
Comment at: include/clang/AST/Decl.h:977
+
+    unsigned EscapingByref : 1;
   };
----------------
This doesn't actually seem to be initialized anywhere.


================
Comment at: include/clang/AST/Decl.h:1422
+
+  bool isNonEscapingByref() const;
+
----------------
Documentation comments?  I'm not opposed to using `Byref` as a shorthand here, 
but please remember that a lot of Clang maintainers aren't familiar with the 
blocks extension, and those that are aren't necessarily familiar with the 
non-escaping optimization.


================
Comment at: include/clang/AST/Decl.h:3888
+    bool isNonEscapingByref() const {
+      return VariableAndFlags.getPointer()->isNonEscapingByref();
+    }
----------------
Please call `getVariable()` here for clarity.


================
Comment at: include/clang/Sema/ScopeInfo.h:438
+    EscapingBlocks.erase(BD);
+  }
+
----------------
Please describe the expected operation in comments here: that blocks are added 
by default and then removed when the expression is provably used in a 
non-escaping way.


================
Comment at: lib/CodeGen/CGBlocks.cpp:497
+  return VD->isNonEscapingByref() ?
+         CGF.getContext().getLValueReferenceType(VD->getType()) : 
VD->getType();
 }
----------------
Do you need to worry about the variable already having a reference type?


================
Comment at: lib/CodeGen/CGBlocks.cpp:1310
 
-  if (capture.fieldType()->isReferenceType())
+  if (capture.fieldType()->isReferenceType() || variable->isNonEscapingByref())
     addr = EmitLoadOfReference(MakeAddrLValue(addr, capture.fieldType()));
----------------
Isn't the field type already a reference type in this case?

You should leave a comment that you're relying on that, of course.


================
Comment at: lib/Sema/Sema.cpp:1410
+        VD->setEscapingByref();
+    }
+
----------------
It's okay to walk over an unordered set here because you're just changing 
memory.  However, you don't actually need it to be a set; you can just remember 
all the blocks in the function and then ignore them if they're marked as 
non-escaping.


================
Comment at: lib/Sema/Sema.cpp:1412
+
+  for (VarDecl *VD : FSI.ByrefBlockVars)
+    // __block variables might require us to capture a copy-initializer.
----------------
In contrast, it's not okay to walk over an unordered set here because the loop 
body can emit diagnostics and/or instantiate code.

Fortunately, you don't actually need `ByrefBlockVars` to be a set at all; you 
can just use an `llvm::TinyPtrVector'.


================
Comment at: lib/Sema/Sema.cpp:1414
+    // __block variables might require us to capture a copy-initializer.
+    if (VD->isEscapingByref()) {
+      QualType T = VD->getType();
----------------
Please use an early `continue` so you can de-indent the rest of the loop body.


================
Comment at: lib/Sema/Sema.cpp:1420
+      // constructing this copy.
+      if (T->isStructureOrClassType()) {
+        EnterExpressionEvaluationContext scope(
----------------
Should the contents of this block be in a helper function?


================
Comment at: lib/Sema/Sema.cpp:1451
+  // Call this function before popping the current function scope.
+  markEscapingByrefs(*FunctionScopes.back(), *this);
+
----------------
Why before?


Repository:
  rC Clang

https://reviews.llvm.org/D51564



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to