-
Bug
-
Resolution: Fixed
-
P3
-
repo-panama
Jextract fails on the following test case:
test.h
```
struct Foo {
struct {
union {
int x;
} Bar;
};
};
```
With the following exception:
jdk.internal.clang.TypeLayoutError: InvalidFieldName. type: Type{ spelling=struct Foo, kind=Record }, fieldName: x
at jdk.internal.clang/jdk.internal.clang.Type.getOffsetOf(Type.java:58)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:159)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.lambda$offsetOf$0(RecordLayoutComputer.java:162)
at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:229)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:511)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:163)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.lambda$offsetOf$0(RecordLayoutComputer.java:162)
at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:229)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:511)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:163)
at jdk.jextract/com.sun.tools.jextract.tree.StructLayoutComputer.processField(StructLayoutComputer.java:61)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.compute(RecordLayoutComputer.java:115)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.compute(RecordLayoutComputer.java:68)
at jdk.jextract/com.sun.tools.jextract.tree.LayoutUtils.getRecordLayout(LayoutUtils.java:208)
at jdk.jextract/com.sun.tools.jextract.tree.StructTree.layout(StructTree.java:136)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.visitStruct(AsmCodeFactory.java:286)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.visitStruct(AsmCodeFactory.java:73)
at jdk.jextract/com.sun.tools.jextract.tree.StructTree.accept(StructTree.java:103)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.generateDecl(AsmCodeFactory.java:438)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.generateNativeHeader(AsmCodeFactory.java:112)
at jdk.jextract/com.sun.tools.jextract.JextractTool.generateHeader(JextractTool.java:82)
at jdk.jextract/com.sun.tools.jextract.JextractTool.lambda$processHeaders$3(JextractTool.java:74)
at java.base/java.util.HashMap.forEach(HashMap.java:1333)
at jdk.jextract/com.sun.tools.jextract.JextractTool.processHeaders(JextractTool.java:74)
at jdk.jextract/com.sun.tools.jextract.Main.run(Main.java:264)
at jdk.jextract/com.sun.tools.jextract.Main.main(Main.java:334)
From some debugging; jextract is trying to find the offset of the anonymous struct in Foo, but since it can't lookup the offset by the name of the field (as it's anonymous) it instead tries to find the offset of it's first field, which is Bar. But, the current code is instead looking for the first child _cursor_, which in this case is the union decl. and this causes the failure.
test.h
```
struct Foo {
struct {
union {
int x;
} Bar;
};
};
```
With the following exception:
jdk.internal.clang.TypeLayoutError: InvalidFieldName. type: Type{ spelling=struct Foo, kind=Record }, fieldName: x
at jdk.internal.clang/jdk.internal.clang.Type.getOffsetOf(Type.java:58)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:159)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.lambda$offsetOf$0(RecordLayoutComputer.java:162)
at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:229)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:511)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:163)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.lambda$offsetOf$0(RecordLayoutComputer.java:162)
at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:229)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:511)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:163)
at jdk.jextract/com.sun.tools.jextract.tree.StructLayoutComputer.processField(StructLayoutComputer.java:61)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.compute(RecordLayoutComputer.java:115)
at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.compute(RecordLayoutComputer.java:68)
at jdk.jextract/com.sun.tools.jextract.tree.LayoutUtils.getRecordLayout(LayoutUtils.java:208)
at jdk.jextract/com.sun.tools.jextract.tree.StructTree.layout(StructTree.java:136)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.visitStruct(AsmCodeFactory.java:286)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.visitStruct(AsmCodeFactory.java:73)
at jdk.jextract/com.sun.tools.jextract.tree.StructTree.accept(StructTree.java:103)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.generateDecl(AsmCodeFactory.java:438)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.generateNativeHeader(AsmCodeFactory.java:112)
at jdk.jextract/com.sun.tools.jextract.JextractTool.generateHeader(JextractTool.java:82)
at jdk.jextract/com.sun.tools.jextract.JextractTool.lambda$processHeaders$3(JextractTool.java:74)
at java.base/java.util.HashMap.forEach(HashMap.java:1333)
at jdk.jextract/com.sun.tools.jextract.JextractTool.processHeaders(JextractTool.java:74)
at jdk.jextract/com.sun.tools.jextract.Main.run(Main.java:264)
at jdk.jextract/com.sun.tools.jextract.Main.main(Main.java:334)
From some debugging; jextract is trying to find the offset of the anonymous struct in Foo, but since it can't lookup the offset by the name of the field (as it's anonymous) it instead tries to find the offset of it's first field, which is Bar. But, the current code is instead looking for the first child _cursor_, which in this case is the union decl. and this causes the failure.