Record constructor using Objects.requireNonNull

Guoxiong Li lgxbslgx at gmail.com
Fri Jan 1 17:20:29 UTC 2021


Hi,

Good catch! I saw Christian filed an issue in bug tracker. Please see
https://bugs.openjdk.java.net/browse/JDK-8259025
And I have a little patch to fix this bug locally. Could I ask you which
repository should I submit the PR? JDK main-line or JDK 16? I think JDK 16
is better.

The patch is shown below for you, excluding a corresponding test case.

diff --git
a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
index e09f274309c..bae2221549e 100644
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java
@@ -2962,7 +2962,6 @@ public class Attr extends JCTree.Visitor {
                 localEnv.info.isSerializable = true;
                 localEnv.info.isSerializableLambda = true;
             }
-            localEnv.info.isLambda = true;
             List<Type> explicitParamTypes = null;
             if (that.paramKind == JCLambda.ParameterKind.EXPLICIT) {
                 //attribute lambda parameters
@@ -3404,6 +3403,7 @@ public class Attr extends JCTree.Visitor {
                 lambdaEnv = env.dup(that,
env.info.dup(env.info.scope.dup()));
             }
             lambdaEnv.info.yieldResult = null;
+            lambdaEnv.info.isLambda = true;
             return lambdaEnv;
         }


On Fri, Jan 1, 2021 at 10:54 PM Remi Forax <forax at univ-mlv.fr> wrote:

> Yes,
> definitively a bug !
>
> Rémi
>
> ----- Mail original -----
> > De: "Brian Goetz" <brian.goetz at oracle.com>
> > À: "Christian Stein" <sormuras at gmail.com>, "amber-dev" <
> amber-dev at openjdk.java.net>
> > Envoyé: Jeudi 31 Décembre 2020 23:09:14
> > Objet: Re: Record constructor using Objects.requireNonNull
>
> > Looks like a bug.
> >
> > On 12/31/2020 1:22 PM, Christian Stein wrote:
> >> Hi,
> >>
> >> Sascha's finding [1] applied to all requireNonNull variants of
> >> java.util.Objects
> >>
> >>    import static java.util.Objects.*;
> >>    record Test(String v) {
> >>      Test {
> >>        requireNonNull(v);
> >>        requireNonNull(v, "v must be provided");
> >>        // requireNonNull(v, () -> "v must be provided");
> >>        requireNonNullElse(v, "w");
> >>        // requireNonNullElseGet(v, () -> "w");
> >>      }
> >>    }
> >>
> >> leads to this error message after uncommenting one or both of the
> >> supplier-taking lines:
> >>
> >>    Test.java:2: error: invalid compact constructor in record <init>
> >>      Test {
> >>      ^
> >>    (compact constructor must not have return statements)
> >>    1 error
> >>
> >> I ran javac from 16-ea+27 and 17-ea+3.
> >>
> >> Shall I create an issue for this at https://bugs.openjdk.java.net or is
> >> this an expected behaviour?
> >>
> >> Cheers,
> >> Christian
> >>
> > > [1]: https://twitter.com/skohlmann/status/1344684426836500480
>


More information about the amber-dev mailing list