Record constructor using Objects.requireNonNull

Guoxiong Li lgxbslgx at gmail.com
Sat Jan 2 12:38:29 UTC 2021


Hi all,

I submitted a PR to JDK main-line to solve this bug. Please see
https://github.com/openjdk/jdk/pull/1917
I would like to let the corresponding reviewers decide whether it should be
backported to JDK 16.

Best Regards.


On Sat, Jan 2, 2021 at 1:20 AM Guoxiong Li <lgxbslgx at gmail.com> wrote:

> 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