--- old/src/jdk.jextract/share/classes/com/sun/tools/jextract/TypedefHandler.java 2019-04-05 16:11:27.000000000 +0530 +++ new/src/jdk.jextract/share/classes/com/sun/tools/jextract/TypedefHandler.java 2019-04-05 16:11:26.000000000 +0530 @@ -126,7 +126,7 @@ Cursor dc = defTree.cursor(); List trees = replacements.computeIfAbsent(dc, k -> new ArrayList<>()); trees.add(((StructTree)defTree).withName(tt.name())); - log.print(Level.FINE, () -> "Typedef " + defTree.type().spelling() + " as " + tt.name()); + log.print(Level.FINE, () -> "Typedef " + defTree.type().spelling() + " as " + tt.name()); return null; } else if (defTree.name().equals(tt.name())) { /* @@ -140,6 +140,16 @@ } } + /* + * There are typedefs on built-in types like struct __va_list_tag. These + * are not exposed as declaration cursor for any headers, but are available + * from Type objects. We've to walk and check null file path to detect these + * Cursors and create Trees. + */ + Utils.getBuiltinRecordTypes(tt.type()).forEach(c -> { + decls.add(treeMaker.createTree(c)); + }); + decls.add(tt); return null; }