Sorry, meant to thank you for pointing this out. You are correct in that (i) when writing these I wrote them side-by-side, and (ii) when we fixed up the text surrounding top-level/member/local I forgot to put them side-by-side again to check there wasn’t any stray old text. Ug.
(It’s also super annoying that the section numbers don’t match to make this even better!) Alex spotting a small issue that will break up this nice symmetry some more: the restriction on the canonical name excludes the neat trick that we play compiling out enums with constants that have bodies into a sealed hierarchy (as we need to have permitted subclasses that are anonymous classes). It’s fixable but we have to special case enum classes :-( Thanks again, Gavin > On 23 Apr 2021, at 21:19, John Rose <john.r.r...@oracle.com> wrote: > > On Apr 20, 2021, at 2:00 AM, Gavin Bierman <gavin.bier...@oracle.com> wrote: >> >> >> http://cr.openjdk.java.net/~gbierman/jep409/latest/ > > Out of curiosity I compared the two large new sections > on permits, 8.1.4 and 9.1.4, perhaps to find unintentional > divergences. Here are the differences I found FYI, > aside from than the required differences arising > from section numbering and the parallel terminology > of interfaces and lists. > >> The optional permits clause in a [C/I] declaration {specifies, lists} the >> [C/I]s > >> It is a compile-time error if {the same class, a class or interface} is >> {specified, named} more than once in a {, single} permits clause > >> The permitted direct sub[C/I]s of a sealed [C/I] are the [C/I]s listed by >> its permits clause, or, if [C/I] lacks a permits clause, each {, top level >> or member} [C/I] declared in the same compilation unit as [C/I] (7.3) which >> has a canonical name (6.7) > > This last one is especially odd, since “top level or member” > seems redundant when “has a canonical name” is specified. > The latter condition is in both places, and is more pertinent. > > Also, this comment was in the class section, but there was no > parallel comment in the interface section: > >> This means that if a sealed class C lacks a permits clause one will be >> inferred that contains all the top-level and member classes in the same >> compilation unit that list C as their direct superclass. The requirement of >> having a canonical name means that no local classes or anonymous classes >> will be considered. > > Perhaps you added the “canonical name” and did not replace > all of the predecessor language about “top level or member”? > > (As expected, I found no substantive differences.) > > — John