Author: Kazu Hirata
Date: 2026-08-27T08:24:57-07:00
New Revision: a1ab1f7fa23288361d3d081585a17de09c4776b3

URL: 
https://github.com/llvm/llvm-project/commit/a1ab1f7fa23288361d3d081585a17de09c4776b3
DIFF: 
https://github.com/llvm/llvm-project/commit/a1ab1f7fa23288361d3d081585a17de09c4776b3.diff

LOG: [clang][Sema] Fix iterator invalidation in isLayoutCompatibleUnion 
(#219112)

This patch fixes an iterator invalidation bug in
isLayoutCompatibleUnion.

Without this patch, if we delete a matching field, we end up
evaluating I == E even though the iterators are invalidated.  Deleting
a match after the loop fixes the problem.

This bug was discovered with tightened epoch checks in
SmallPtrSetIterator.

Assisted-by: Antigravity

Added: 
    

Modified: 
    clang/lib/Sema/SemaChecking.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 7f3ccea82e8af..5c831e6cdebce 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -16592,19 +16592,13 @@ static bool isLayoutCompatibleUnion(const ASTContext 
&C, const RecordDecl *RD1,
                                                           RD2->fields());
 
   for (auto *Field1 : RD1->fields()) {
-    auto I = UnmatchedFields.begin();
-    auto E = UnmatchedFields.end();
-
-    for ( ; I != E; ++I) {
-      if (isLayoutCompatible(C, Field1, *I, /*IsUnionMember=*/true)) {
-        bool Result = UnmatchedFields.erase(*I);
-        (void) Result;
-        assert(Result);
-        break;
-      }
-    }
-    if (I == E)
+    auto It = llvm::find_if(UnmatchedFields, [&](const FieldDecl *Field2) {
+      return isLayoutCompatible(C, Field1, Field2, /*IsUnionMember=*/true);
+    });
+    if (It == UnmatchedFields.end())
       return false;
+    [[maybe_unused]] bool Result = UnmatchedFields.erase(*It);
+    assert(Result);
   }
 
   return UnmatchedFields.empty();


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

Reply via email to