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)

Reply via email to