diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java index 0b7f4145db2f..f19c0263347f 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/meta/AnalysisType.java @@ -1228,7 +1228,13 @@ private ResolvedJavaField[] initializeInstanceFields(boolean includeSuperclasses return result; } - static final Comparator FIELD_COMPARATOR = Comparator.comparing(ResolvedJavaField::getJavaKind).thenComparing(ResolvedJavaField::getName); + /** + * Sort fields by the field's name *and* type. Note that sorting by name is not enough as the + * class file format doesn't disallow duplicated names with differing types in the same class. + * Even though you cannot declare duplicated names in source code the class file can be + * manipulated such that two fields will have the same name. + */ + static final Comparator FIELD_COMPARATOR = Comparator.comparing(ResolvedJavaField::getName).thenComparing(f -> f.getType().toJavaName()); private ResolvedJavaField[] convertFields(ResolvedJavaField[] originals, List list, boolean listIncludesSuperClassesFields) { ResolvedJavaField[] localOriginals = originals;