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.
https://reviews.llvm.org/D61239
Files:
test/Index/print-type-size.c
tools/libclang/CXType.cpp
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
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
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits