Bug in encoding type annotations for supertype_targets

Joel Borggrén-Franck joel.borggren.franck at gmail.com
Thu Jan 28 18:45:05 UTC 2016


Hello,

While working on the core reflection code for type annotation I
discovered what I believe is a javac bug. It looks like javac omits
the type_path structure for nested types in supertype and implemets
targets. In the example below, when looking at GenericSub in javap I
get this encoding of @Foo:

RuntimeVisibleTypeAnnotations:
  0: #18(): CLASS_EXTENDS, type_index=-1, location=[TYPE_ARGUMENT(0)]

as expected, but when looking at either Impl or SubInner I get:

RuntimeVisibleTypeAnnotations:
  0: #15(): CLASS_EXTENDS, type_index=0

or

RuntimeVisibleTypeAnnotations:
  0: #14(): CLASS_EXTENDS, type_index=-1

Note the missing type_path (location in javap) for the nesting, which
I think table Table 4.7.20.2-E in the vm spec implies.

I can file a bug if you want me to.

cheers
/Joel

--- 8< ---

import java.lang.annotation.*;
import java.util.*;
import java.lang.reflect.*;

/*
 * @test
 */
public class LostTypePath {}

class Super {}
class Sub extends @Foo Super {}

class Generic<A> {}
class GenericSub<B> extends Generic<@Foo B> {}

class Outer { public static class Inner {}}
class SubInner extends Outer . @Foo Inner {}

interface IOuter { public interface IInner {}}
class Impl implements IOuter . @Foo IInner {}

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface Foo {}


More information about the compiler-dev mailing list