[clang] [clang][dataflow] Avoid putting an assertion in an `LLVM_DEBUG` block. (PR #67313)

via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 25 04:17:45 PDT 2023


https://github.com/martinboehme created https://github.com/llvm/llvm-project/pull/67313

`LLVM_DEBUG` blocks are only run if the `-debug` command line flag is passed.
We don't do this in any of our CI builds, so the assertion has limited value and
it's likely it will start failing over time.


>From 88189183e3562ddc48239d213efffec791b413a2 Mon Sep 17 00:00:00 2001
From: Martin Braenne <mboehme at google.com>
Date: Mon, 25 Sep 2023 11:16:54 +0000
Subject: [PATCH] [clang][dataflow] Avoid putting an assertion in an
 `LLVM_DEBUG` block.

`LLVM_DEBUG` blocks are only run if the `-debug` command line flag is passed.
We don't do this in any of our CI builds, so the assertion has limited value and
it's likely it will start failing over time.
---
 clang/lib/Analysis/FlowSensitive/Transfer.cpp | 28 +++++++++++--------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp
index 2414a1cc026af5f..2ad3f9d7c94a80c 100644
--- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp
+++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp
@@ -696,19 +696,23 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> {
       FieldLocs.insert({Field, &Loc});
     }
 
-    LLVM_DEBUG({
-      // Check that we satisfy the invariant that a `RecordStorageLoation`
-      // contains exactly the set of modeled fields for that type.
-      // `ModeledFields` includes fields from all the bases, but only the
-      // modeled ones. However, if a class type is initialized with an
-      // `InitListExpr`, all fields in the class, including those from base
-      // classes, are included in the set of modeled fields. The code above
-      // should therefore populate exactly the modeled fields.
-      auto ModeledFields = Env.getDataflowAnalysisContext().getModeledFields(Type);
-      assert(ModeledFields.size() == FieldLocs.size());
+    // Check that we satisfy the invariant that a `RecordStorageLoation`
+    // contains exactly the set of modeled fields for that type.
+    // `ModeledFields` includes fields from all the bases, but only the
+    // modeled ones. However, if a class type is initialized with an
+    // `InitListExpr`, all fields in the class, including those from base
+    // classes, are included in the set of modeled fields. The code above
+    // should therefore populate exactly the modeled fields.
+    assert([&]() {
+      auto ModeledFields =
+          Env.getDataflowAnalysisContext().getModeledFields(Type);
+      if (ModeledFields.size() != FieldLocs.size())
+        return false;
       for ([[maybe_unused]] auto [Field, Loc] : FieldLocs)
-        assert(ModeledFields.contains(cast_or_null<FieldDecl>(Field)));
-    });
+        if (!ModeledFields.contains(cast_or_null<FieldDecl>(Field)))
+          return false;
+      return true;
+    }());
 
     auto &Loc =
         Env.getDataflowAnalysisContext().arena().create<RecordStorageLocation>(



More information about the cfe-commits mailing list