[PATCH] D76782: [CodeGenObjC] Fix a crash when attempting to copy a zero-sized bit-field in a non-trivial C struct

Erik Pilkington via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 25 10:16:22 PDT 2020


erik.pilkington created this revision.
erik.pilkington added a reviewer: ahatanak.
Herald added subscribers: ributzka, dexonsmith, jkorous.

Zero sized bit-fields aren't included in the CGRecordLayout, so we shouldn't be calling EmitLValueForField for them.

rdar://60695105


https://reviews.llvm.org/D76782

Files:
  clang/include/clang/AST/NonTrivialTypeVisitor.h
  clang/lib/CodeGen/CGNonTrivialStruct.cpp
  clang/test/CodeGenObjC/strong-in-c-struct.m


Index: clang/test/CodeGenObjC/strong-in-c-struct.m
===================================================================
--- clang/test/CodeGenObjC/strong-in-c-struct.m
+++ clang/test/CodeGenObjC/strong-in-c-struct.m
@@ -887,4 +887,14 @@
   func(0);
 }
 
+struct ZeroBitfield {
+  int : 0;
+  id strong;
+};
+
+void test_zero_bitfield() {
+  struct ZeroBitfield volatile a, b;
+  a = b;
+}
+
 #endif /* USESTRUCT */
Index: clang/lib/CodeGen/CGNonTrivialStruct.cpp
===================================================================
--- clang/lib/CodeGen/CGNonTrivialStruct.cpp
+++ clang/lib/CodeGen/CGNonTrivialStruct.cpp
@@ -543,6 +543,10 @@
                             std::array<Address, 2> Addrs) {
     LValue DstLV, SrcLV;
     if (FD) {
+      // No need to copy zero-length bit-fields.
+      if (FD->isZeroLengthBitField(this->CGF->getContext()))
+        return;
+
       QualType RT = QualType(FD->getParent()->getTypeForDecl(), 0);
       llvm::PointerType *PtrTy = this->CGF->ConvertType(RT)->getPointerTo();
       Address DstAddr = this->getAddrWithOffset(Addrs[DstIdx], Offset);
Index: clang/include/clang/AST/NonTrivialTypeVisitor.h
===================================================================
--- clang/include/clang/AST/NonTrivialTypeVisitor.h
+++ clang/include/clang/AST/NonTrivialTypeVisitor.h
@@ -1,4 +1,4 @@
-//===-- NonTrivialTypeVisitor.h - Visitor for non-trivial Types *- C++ --*-===//
+//===-- NonTrivialTypeVisitor.h - Visitor for non-trivial Types -*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76782.252607.patch
Type: text/x-patch
Size: 1649 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200325/b2caab9f/attachment-0001.bin>


More information about the cfe-commits mailing list