Cool. FWIW, even in such a world, I wonder if the conformance needs to be regarded as `fileprivate`:<br><br>In all cases where a private protocol is visible and conformance can be declared, the protocol&#39;s access level would be--<br><br>- effectively fileprivate (if both protocol and conformance are declared top-level)<br>- and/or private (if both protocol and conformance are declared in the same scope)<br>- or unutterably less than fileprivate but more than private (if the protocol is not declared top-level and the conformance is declared in a nested scope).<br><br>In that last case, private is a less accessible level and all other modifiers are more accessible, so the hypothetical feature of declaring conformance with less access remains usable even if the default unutterable access level stays unutterable.<br><div class="gmail_quote"><div dir="ltr">On Thu, Jun 30, 2016 at 11:19 AM Jordan Rose &lt;<a href="mailto:jordan_rose@apple.com">jordan_rose@apple.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><blockquote type="cite"><div>On Jun 29, 2016, at 23:34, John McCall &lt;<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div><blockquote type="cite"><div>On Jun 29, 2016, at 7:07 PM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div dir="ltr">[Resending with fewer recipients]<br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 29, 2016 at 8:55 PM, Jordan Rose <span dir="ltr">&lt;<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div>Updated in <a href="https://github.com/apple/swift-evolution/pull/396" target="_blank">https://github.com/apple/swift-evolution/pull/396</a>. Thanks again, everyone!</div></div></blockquote><div> </div><span style="font-size:12.8px">As usual, a thoughtful result from the core team. Curious, though, where does the following statement come into play?</span><br><span style="font-size:12.8px"><br></span><div style="word-wrap:break-word"><span><font color="#888888"><div style="color:rgb(34,34,34);font-size:12.8px">&quot;The access level of a conformance concerning a `private` type or protocol is considered to be `fileprivate` rather than `private`.&quot;</div></font></span></div></div></div></div></div></blockquote><div><br></div>I think the internal representation may be leaking out.  I believe this is the right basic approach for formalizing the language rules here:</div><div><br></div><div>1. A scope S has access to a declaration D if S has access to the scope S_D in which D is declared and:</div><div>  - if D is explicitly declared &#39;private&#39;, S is equal to S_D or lexically nested within S_D,</div><div>  - if D is explicitly declared &#39;fileprivate&#39;, S appears within the same file as S_D,</div><div>  - if D is explicitly declared &#39;internal&#39;, S appears within the same module as S_D, or</div><div>  - if D lacks an explicit access specifier, S appears within the same module as S_D or S_D is a public extension (*).</div><div>(*) I believe this special case rule about public extensions is correct for the current model.  I&#39;m not sure it&#39;s a good idea, though.</div><div><br></div><div>2. A scope S has access to a scope T if:</div><div>  - S is equal to T or is lexically nested within it,</div><div>  - T is a declaration D and S has access to D, or</div><div>  - T is a file scope.</div></div></div></blockquote><div><br></div></div></div><div style="word-wrap:break-word"><div><div>…and S is in the same file?</div><div><br></div><div>(We never formalized “scope”. Mostly it’s “curly braces, ish”. Not quite 1-1 with “DeclContext”.)</div></div></div><div style="word-wrap:break-word"><div><br><blockquote type="cite"><div><div style="word-wrap:break-word"><div><br></div><div>3. A declaration D shall not use in its signature any declaration D_sig for which there potentially exists a scope S such that S has access to D but not D_sig.  The signature of a declaration includes:</div><div>  - the explicit type of a function, initializer, variable, or constant declaration; or its inferred type (fully &quot;desugared&quot;, e.g. ignoring all type aliases) if an explicit type is not given</div><div>  - the underlying type of a typealias or associatedtype declaration</div><div>  - the superclass type of a class declaration</div><div><div>  - the conformance list of a class, struct, enum, protocol, or extension declaration</div><div>  - the generic parameters and constraints of a generic declaration</div><div></div><div>  - etc.</div><div><br></div><div>Formally, there&#39;s no need to decide the &quot;real&quot; or &quot;effective&quot; access modifier for a declaration.  Conveniently (and not coincidentally), these rules do end up being equivalent to computing an effective access level by just merging information down from the lexical container, but that&#39;s emergent, not fundamental, so don&#39;t put too much energy into whether the emergent access level &quot;makes sense&quot; as a description.</div></div></div></div></blockquote><br></div></div><div style="word-wrap:break-word"><div></div><div>Right. “Effective access” is a query in the compiler to determine the AST’s notion of symbol visibility; it’s not a term we want to use in the language spec.</div><div><br></div><div>These rules seem correct, but they’re not complete—they’re missing the restriction on witnesses for protocol requirements.</div><div><br></div><div>To Xiaodi’s original question, the notion of an access level for conformances is groundwork for a world where you can have conformances with less access than the type or protocol. We’re not in such a world, though, so I should just remove it. (I was reminded of it when rereading the original Access Control writeup, <a href="https://github.com/apple/swift/blob/master/docs/AccessControl.rst" target="_blank">https://github.com/apple/swift/blob/master/docs/AccessControl.rst</a>.)</div></div><div style="word-wrap:break-word"><div><br></div><div>Jordan</div></div></blockquote></div>