[PATCH] D61239: [libclang] Allow field offset lookups in types with incomplete arrays.

Jorn Vernee via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Apr 28 06:19:44 PDT 2019

JornVernee created this revision.
JornVernee added reviewers: akyrtzi, aaron.ballman, rsmith.
JornVernee added a project: clang.
Herald added subscribers: arphaman, dexonsmith.

Currently, looking up the offset of a field in a type with an incomplete array, using `clang_Type_getOffsetOf` always returns `CXTypeLayoutError_Incomplete`. e.g. for the following:

  struct Foo {
      int size;
      void* data[]; // incomplete array

This returns `CXTypeLayoutError_Incomplete` when looking up the offset of either the 'size' or the 'data' field.

But, since an incomplete array always appears at the end of a record, looking up the field offsets should be fine. Note that this also works fine using the offsetof macro.

The fix for this is to ignore incomplete array fields when doing the recursive type validation.



Index: tools/libclang/CXType.cpp
--- tools/libclang/CXType.cpp
+++ tools/libclang/CXType.cpp
@@ -953,7 +953,7 @@
 static long long visitRecordForValidation(const RecordDecl *RD) {
   for (const auto *I : RD->fields()){
     QualType FQT = I->getType();
-    if (FQT->isIncompleteType())
+    if (FQT->isIncompleteType() && !FQT->isIncompleteArrayType()) // IAT is okay here
       return CXTypeLayoutError_Incomplete;
     if (FQT->isDependentType())
       return CXTypeLayoutError_Dependent;
Index: test/Index/print-type-size.c
--- /dev/null
+++ test/Index/print-type-size.c
@@ -0,0 +1,30 @@
+struct Foo {
+    int size;
+    void* data[]; // incomplete array
+struct Bar {
+    int size;
+    struct {
+        int dummy;
+        void* data[]; // incomplete array
+    };
+struct Baz {
+    int size;
+    union {
+        void* data1[]; // incomplete array
+        void* data2[]; // incomplete array
+    };
+// RUN: c-index-test -test-print-type-size %s | FileCheck %s
+// CHECK: FieldDecl=size:2:9 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=0]
+// CHECK: FieldDecl=data:3:11 (Definition) [type=void *[]] [typekind=IncompleteArray] [sizeof=-2] [alignof=-2] [offsetof=64]
+// CHECK: FieldDecl=size:7:9 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=0]
+// CHECK: FieldDecl=dummy:9:13 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=64/0]
+// CHECK: FieldDecl=data:10:15 (Definition) [type=void *[]] [typekind=IncompleteArray] [sizeof=-2] [alignof=-2] [offsetof=128/64]
+// CHECK: FieldDecl=size:15:9 (Definition) [type=int] [typekind=Int] [sizeof=4] [alignof=4] [offsetof=0]
+// CHECK: FieldDecl=data1:17:15 (Definition) [type=void *[]] [typekind=IncompleteArray] [sizeof=-2] [alignof=-2] [offsetof=64/0]
+// CHECK: FieldDecl=data2:18:15 (Definition) [type=void *[]] [typekind=IncompleteArray] [sizeof=-2] [alignof=-2] [offsetof=64/0]
\ No newline at end of file

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61239.197023.patch
Type: text/x-patch
Size: 2101 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190428/a884d9f9/attachment-0001.bin>

More information about the cfe-commits mailing list