================
@@ -26,23 +26,36 @@ using namespace clang;
 using namespace clang::CIRGen;
 
 namespace {
-/// Return true if the expression tree contains an AbstractConditionalOperator
-/// (ternary ?:), which is the only construct whose CIR codegen calls
-/// ConditionalEvaluation::beginEvaluation() and thus causes cleanups to be
-/// deferred via pushFullExprCleanup.  Logical &&/|| do NOT call
-/// beginEvaluation(); their branch-local cleanups are handled by LexicalScope.
+/// Return true if the expression tree contains a construct that causes 
cleanups
+/// to be deferred via pushFullExprCleanup.
 class ConditionalEvaluationFinder
     : public RecursiveASTVisitor<ConditionalEvaluationFinder> {
+  const ASTContext &astContext;
   bool foundConditional = false;
 
 public:
+  ConditionalEvaluationFinder(const ASTContext &astContext)
+      : astContext(astContext) {}
+
   bool found() const { return foundConditional; }
 
   bool VisitAbstractConditionalOperator(AbstractConditionalOperator *) {
     foundConditional = true;
     return false;
   }
 
+  bool VisitCXXNewExpr(CXXNewExpr *e) {
+    // If the new expression requires a null check, its initializer may be
+    // skipped. In that case, the cleanup for any temporaries created in the
+    // initializer must be conditional.
+    if (e->shouldNullCheckAllocation() &&
----------------
andykaylor wrote:

Looking at classic codegen, I see that it also puts `|| 
sanitizerPerformTypeCheck()` in the second part of this condition. Thinking 
about what that means for this code, I think maybe I'm putting more than we 
need in the check here. This was duplicating the conditions under which we 
perform a null check, but the conditional case only happens if there is an 
initializer and even then only if the initializer requires cleanup. If the 
allocation itself requires cleanup (that is, if we need to delete the allocated 
pointer in the case where the constructor throws), the cleanup is emitted 
inside the null check true region).

So, I don't we do want to share this check with the other location, but I think 
I can simplify it here.

https://github.com/llvm/llvm-project/pull/213376
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to