JDK 16 RFR of JDK-8251921: Expand default constructor warning to cover more cases

Jonathan Gibbons jonathan.gibbons at oracle.com
Thu Aug 27 17:46:33 UTC 2020


There's a possible minor typo:

146 public static class StaticBaryNest {

The extra "y" looks incorrect.

Otherwise OK,

-- Jon

On 8/25/20 4:31 PM, Joe Darcy wrote:
> Hello,
>
> As a follow-up to JDK-8071961: "Add javac lint warning when a default 
> constructor is created," Phil observed that there are cases in the JDK 
> where a *protected* class has a default constructor appearing in the 
> JDK. Please review the changes and CSR to augment the warning to cover 
> both public and protected classes. For nested classes, the enclosing 
> types must be either public or protected all the way up for the 
> warning to be issued.
>
>     JDK-8251921: Expand default constructor warning to cover more cases
>     CSR: https://bugs.openjdk.java.net/browse/JDK-8252348
>     webrev: http://cr.openjdk.java.net/~darcy/8251921.0/
>
> Patch below. Clean langtools test run with this change.
>
> Thanks,
>
> -Joe
>
> --- 
> old/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java 
> 2020-08-25 15:04:59.413000000 -0700
> +++ 
> new/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java 
> 2020-08-25 15:04:58.685000000 -0700
> @@ -3835,7 +3835,7 @@
>          if (lint.isEnabled(LintCategory.MISSING_EXPLICIT_CTOR) &&
>              ((c.flags() & (ENUM | RECORD)) == 0) &&
>              !c.isAnonymous() &&
> -            ((c.flags() & PUBLIC) != 0) &&
> +            ((c.flags() & (PUBLIC | PROTECTED)) != 0) &&
>              Feature.MODULES.allowedInSource(source)) {
>              NestingKind nestingKind = c.getNestingKind();
>              switch (nestingKind) {
> @@ -3844,10 +3844,10 @@
>                  case TOP_LEVEL -> {;} // No additional checks needed
>                  case MEMBER -> {
>                      // For nested member classes, all the enclosing
> -                    // classes must be public.
> +                    // classes must be public or protected.
>                      Symbol owner = c.owner;
>                      while (owner != null && owner.kind == TYP) {
> -                        if ((owner.flags() & PUBLIC) == 0)
> +                        if ((owner.flags() & (PUBLIC | PROTECTED)) == 0)
>                              return;
>                          owner = owner.owner;
>                      }
> --- 
> old/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties 
> 2020-08-25 15:05:01.037000000 -0700
> +++ 
> new/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties 
> 2020-08-25 15:05:00.189000000 -0700
> @@ -183,7 +183,7 @@
>      Warn about issues related to classfile contents.
>
>  javac.opt.Xlint.desc.missing-explicit-ctor=\
> -    Warn about missing explicit constructors in public classes in 
> exported packages.
> +    Warn about missing explicit constructors in public and protected 
> classes in exported packages.
>
>  javac.opt.Xlint.desc.deprecation=\
>      Warn about use of deprecated items.
> --- 
> old/test/langtools/tools/javac/warnings/DefaultCtor/DefaultCtorWarningToolBox.java 
> 2020-08-25 15:05:02.313000000 -0700
> +++ 
> new/test/langtools/tools/javac/warnings/DefaultCtor/DefaultCtorWarningToolBox.java 
> 2020-08-25 15:05:01.597000000 -0700
> @@ -97,7 +97,9 @@
>              List.of("Foo.java:4:8: 
> compiler.warn.missing-explicit-ctor: pkg1.Foo, pkg1, mod",
>                      "Foo.java:12:12: 
> compiler.warn.missing-explicit-ctor: pkg1.Foo.FooNest, pkg1, mod",
>                      "Foo.java:16:19: 
> compiler.warn.missing-explicit-ctor: pkg1.Foo.StaticFooNest, pkg1, mod",
> -                    "3 warnings");
> +            "Foo.java:25:15: compiler.warn.missing-explicit-ctor: 
> pkg1.Foo.ProtectedFooNest, pkg1, mod",
> +            "Foo.java:27:19: compiler.warn.missing-explicit-ctor: 
> pkg1.Foo.ProtectedFooNest.ProtectedFooNestNest, pkg1, mod",
> +                    "5 warnings");
>
>          // Warning enable,
>          log = new JavacTask(tb)
> @@ -137,30 +139,34 @@
>          class Bar {
>
>              // No explicit constructor; use a default.
> -            public class FooNest {
> +            public class BarNest {
>              }
>
>              // No explicit constructor; use a default.
> -            public static class StaticFooNest {
> +            public static class StaticBaryNest {
> +            }
> +
> +            // No explicit constructor; use a default.
> +            protected class ProtectedBarNest {
>              }
>
>              // Package-access classes
>
>              // No explicit constructor; use a default.
> -            /*package*/ class PkgFooNest {
> +            /*package*/ class PkgBarNest {
>              }
>
>              // No explicit constructor; use a default.
> -            /*package*/ static class PkgStaticFooNest {
> +            /*package*/ static class PkgStaticBarNest {
>              }
>              // Private classes
>
>              // No explicit constructor; use a default.
> -            private class PrvFooNest {
> +            private class PrvBarNest {
>              }
>
>              // No explicit constructor; use a default.
> -            private static class PrvStaticFooNest {
> +            private static class PrvStaticBarNest {
>              }
>          }
>          """;
> @@ -190,10 +196,18 @@
>              public static class SuppressedStaticFooNest {
>              }
>
> +            // No explicit constructor; use a default.
> +            protected class ProtectedFooNest {
> +                // No explicit constructor; use a default.
> +                protected class ProtectedFooNestNest {}
> +            }
> +
>              // Package-access classes
>
>              // No explicit constructor; use a default.
>              /*package*/ class PkgFooNest {
> +                // No explicit constructor; use a default.
> +                protected class PkgFooNestNest {}
>              }
>
>              // No explicit constructor; use a default.
> @@ -203,6 +217,8 @@
>
>              // No explicit constructor; use a default.
>              private class PrvFooNest {
> +                // No explicit constructor; use a default.
> +                protected class PrvFooNestNest {}
>              }
>
>              // No explicit constructor; use a default.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20200827/6366c883/attachment.htm>


More information about the compiler-dev mailing list