Scott Murphy Heiberg created GROOVY-12717:
---------------------------------------------
Summary: SC: new of a protected constructor of another package, or
a protected method through a superclass receiver, fails verification instead of
being reported
Key: GROOVY-12717
URL: https://issues.apache.org/jira/browse/GROOVY-12717
Project: Groovy
Issue Type: Bug
Components: Static compilation
Affects Versions: 5.0.8, 4.0.32, 6.0.0
Reporter: Scott Murphy Heiberg
{code:groovy}
// package p
class A {
protected A(String s) { }
protected String im() { 'im' }
protected String getQp() { 'qp' }
}
// package q
@groovy.transform.CompileStatic
class B extends p.A {
B() { super('b') }
static test(p.A a) {
new p.A('x') // or new p.A([:]) with a protected no-argument
constructor
a.im()
a.qp
java.util.function.Supplier<String> s = a::im
java.util.function.Function<p.A, String> f = p.A::im
}
}
{code}
*Actual:* {{VerifyError: Bad access to protected <init> method}} and
{{VerifyError: Bad access to protected data in invokevirtual}} when {{B}} is
loaded, and {{BootstrapMethodError}} for the method references.
*Expected:* a compile error, as javac gives. Outside its package, a protected
constructor can only be called by {{super(...)}} or an anonymous class (JLS
6.6.2.2), and a protected instance method only through a receiver of the
subclass (JLS 6.6.2.1, JVMS 4.10.1.8).
Cause: {{StaticInvocationWriter}} writes {{new}} of such a constructor
directly. Its GROOVY-7325 check for a method compares the types the wrong way
round: it tests whether the current class is a subtype of the receiver type,
not the reverse.
Verified on 5.0.8, 6.0.0 and master. 4.0.32 fails the same way for the
constructors and method references, and rejects {{a.im()}} and {{a.qp}} at
compile time.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)