RFR 8194932: no ambuguity error is emitted if classfile contains two identical methods with different return types

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Jan 11 18:20:04 UTC 2018


Hi,
this is a fix for an issue that has to do with compilation from 
classfile. While typically it is not possible for a Java source to 
contain two override equivalent method (as that would be flagged as 
method clash by javac), when a classfile contains two methods that have 
the same signature but different return types (which is possible at the 
classfile level), javac doesn't generate an ambiguity error when such 
method is called. Instead, javac non-deterministically resolves the call 
to the first method being declared in the classfile.

The solution is to omit a part of the override check that is run in 
Resolve::mostSpecific (**). That is, this part should be disabled if the 
owner of both potentially ambiguous methods is the same. Extra code was 
added to handle the case of statically imported methods, in which case 
javac clones the imported method symbols and replaces their owner to 
make sure that the bytecode comes out in a certain way. So, if javac 
detects that the 'base' symbol of both methods is indeed the same - it 
means that the same symol was imported (and cloned) twice, so we can 
just return either. At this point, we should never have a case where we 
have two maximally specific concrete methods with same owner (unless we 
are in the classfile case).

http://cr.openjdk.java.net/~mcimadamore/8194932/

(**) the override check performed by javac is outside the spec, but 
necessary because javac doesn't filter overload candidates by 
accessibility - that is, overridden methods are played through the javac 
overload resoluytion machinery, and javac prefers the overridden version 
of a method; this is an unfortunate, but historical, javac design choice.

Cheers
Maurizio



More information about the compiler-dev mailing list