<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}

h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}

h1 {
        color: #000000;
        font-size: 28pt;
}

h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}

h3 {
        font-size: 18px;
}

h4 {
        font-size: 16px;
}

h5 {
        font-size: 14px;
}

h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}

hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
    display: inherit;
}

p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}

a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}

#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}

button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}

code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}

code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}

pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}

pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}

#ws { background-color: #f8f8f8; }


.bloop_markdown table {
border-collapse: collapse;  
font-family: Helvetica, arial, freesans, clean, sans-serif;  
color: rgb(51, 51, 51);  
font-size: 15px; line-height: 25px;
padding: 0; }

.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
     
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }

.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }

.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }

.bloop_markdown blockquote{
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

code, pre, #ws, #message {
    word-break: normal;
    word-wrap: normal;
}

hr {
    display: inherit;
}

.bloop_markdown :first-child {
    -webkit-margin-before: 0;
}

code, pre, #ws, #message {
    font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}


.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>Ok I already see side effects in my idea which breaks the entire <code>scoped access level</code> thing :/</p>

<pre><code class="swift">class A {
   // incrementTwice() is not visible here
}

extension A {
   private func incrementTwice() {

   }
}
</code></pre>

<p>In my model <code>incrementTwice</code> would be visible in <code>A</code> which it shouldn’t (I agree to that).</p>

<p>That seem like a nasty bug that we missed during review.</p>

<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1466019049084161024" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 15. Juni 2016 um 21:30:20, Robert Widmann via swift-evolution (<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div dir="auto"><div></div><div>



<title></title>


<div>The meaning of private according to the proposal is not
scope-dependent, it is decl-dependent. &nbsp;The mental gymnastics
we are both going through right now are not in the proposal.
&nbsp;I would like them to be.</div>
<div id="AppleMailSignature"><br></div>
<div id="AppleMailSignature">~Robert Widmann</div>
<div><br>
2016/06/15 12:26、Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com">matthew@anandabits.com</a>&gt;
のメッセージ:<br>
<br></div>
<blockquote type="cite">
<div>
<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Jun 15, 2016, at 2:19 PM, Robert Widmann
&lt;<a href="mailto:devteam.codafi@gmail.com" class="">devteam.codafi@gmail.com</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class="">

<div dir="auto" class="">
<div class="">We have diagnostics specifically to prohibit this
case. &nbsp;You cannot raise the access level of members.</div>
<div class=""><br class=""></div>
<div class="">private struct Foo {</div>
<div class="">&nbsp; &nbsp; internal var x : String = ""</div>
<div class="">}</div>
<div class=""><br class=""></div>
<div class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">warning:
declaring an internal var for a private struct.</span></div>
<div class=""><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div>
<div class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">Hence, the
highest allowable level of access for x is private and it becomes
invisible.</span></div>
</div>
</div>
</blockquote>
<blockquote type="cite" class="">
<div class="">
<div dir="auto" class="">
<div class=""><br class=""></div>
<div class="">I would not like the compiler to synthesize this in
my code, and if it did I would like the proposal to say it will
raise access levels of members as you would like it to.</div>
</div>
</div>
</blockquote>
<div><br class=""></div>
<div>That diagnostic is a good thing. &nbsp;I am not suggesting
that you to disregard it.</div>
<div><br class=""></div>
<div>What you are missing is that the meaning of `private` is
scope-dependent. &nbsp;The following example is perfectly
valid:</div>
<div><br class=""></div>
<div>private struct Foo {<br class="">
&nbsp; &nbsp; fileprivate var x : String = “”<br class=""></div>
<div>}</div>
<div><br class=""></div>
<div>`fileprivate` inside `Foo` specifies the same visibility as
`private` at the top level, thus we are not “raising" the
visibility of the member. &nbsp;If no modifier is provided for `x`
it receives the same visibility as its containing type (up to
`internal`).</div>
<div><br class=""></div>
<div>Consider another example:</div>
<div><br class=""></div>
<div>struct Foo {</div>
<div>&nbsp; &nbsp; private struct Bar {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; var x : String = “”</div>
<div>&nbsp; &nbsp; }</div>
<div>}</div>
<div><br class=""></div>
<div>In this example we *cannot* mark `x` as `fileprivate` because
that *would* raise the visibility of `x` beyond that of `Bar`.
&nbsp;`Bar` is only visible inside `Foo`, not at file scope.
&nbsp;This means that `x` also has visibility throughout the
lexical scope of `Foo`, but not outside of it.</div>
<div><br class=""></div>
<div>-Matthew</div>
<div><br class=""></div>
<br class="">
<blockquote type="cite" class="">
<div class="">
<div dir="auto" class="">
<div class=""><br class="">
<div class="">~Robert Widmann</div>
</div>
<div class=""><br class="">
2016/06/15 12:14、Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; のメッセージ:<br class="">
<br class=""></div>
<blockquote type="cite" class="">
<div class="">
<br class="">
<div class="">
<blockquote type="cite" class="">
<div class="">On Jun 15, 2016, at 2:04 PM, Robert Widmann
&lt;<a href="mailto:devteam.codafi@gmail.com" class="">devteam.codafi@gmail.com</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">2016/06/15 11:47、Matthew Johnson &lt;</span><a href="mailto:matthew@anandabits.com" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">matthew@anandabits.com</a><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">&gt; のメッセージ:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">
<blockquote type="cite" class="">On Jun 15, 2016, at 1:37 PM,
Robert Widmann &lt;<a href="mailto:devteam.codafi@gmail.com" class="">devteam.codafi@gmail.com</a>&gt; wrote:<br class="">
<br class="">
The scope of the *declaration* is not the issue. &nbsp;The scope of
its *members* is.<br class=""></blockquote>
<br class="">
Let’s consider an example:<br class="">
<br class="">
private struct Foo {<br class="">
&nbsp;&nbsp;var bar: Int<br class="">
}<br class="">
<br class="">
// elsewhere in the same file:<br class="">
var foo = Foo(bar: 42)<br class="">
foo.bar = 44<br class="">
<br class="">
`Foo` is declared private. &nbsp;Private for this declaration is at
the file scope. &nbsp;The `bar` member has no access modifier so it
has the same visibility as the struct itself, which is file scope.
&nbsp;This will also be true of the implicitly synthesized
memberwise initializer. &nbsp;<br class=""></blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">No, it is also private. &nbsp;It does not inherit its
parent scope because, following the letter of the proposal, that
symbol will only be visible within the current declaration.
&nbsp;We cannot arbitrarily break access control rules because it
is convenient in one special case.<span class="Apple-converted-space">&nbsp;</span></span></div>
</blockquote>
<blockquote type="cite" class="">
<div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">
This means that it is possible to initialize `foo` with a newly
constructed instance of `Foo` and to modify the `bar` member
anywhere else in the same file.<br class=""></blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">bar is not visible here. &nbsp;If it were you could break
access control rules.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">
If `bar` was also declared `private` this would not be possible as
its visibility would be restricted to the surrounding scope of the
initial declaration of `Foo`. &nbsp;This means `Foo` would need to
provide an explicit initializer or factory method with
`fileprivate` visibility in order to be usable.<br class=""></blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">bar is private. &nbsp;Declarations within Foo cannot
decide to raise that access level to make themselves more visible.
&nbsp;If this should be the case, the proposal must be amended as
much.</span></div>
</blockquote>
<blockquote type="cite" class="">
<div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">
Members with no explicit access modifier should have the same
*visibility* as their containing type (with a maximum implicit
visibility of internal), not the same *modifier* as their
containing type. &nbsp;The only case where there is a distinction
is the new `private` visibility. &nbsp;Maybe that is what is
causing the confusion?<br class=""></blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">That is not what the proposal says. &nbsp;The proposal
says it is invisible outside the current decl, which is the
containing structure here.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div>
</blockquote>
<div class=""><br class=""></div>
<div class="">The access modifier is applied to `Foo`, not `bar`.
&nbsp;`Foo` is visible in the scope of the “current declaration”
(this is badly worded - it should say current scope, which is the
file). &nbsp;Because `Foo` has a visibility lower than `internal`
the default visibility of its members match the visibility of
`Foo`, which again is the current scope: the file. &nbsp;The
detailed design section of the proposal is sparse, but it correctly
uses the phrase "visible only within that lexical scope” rather
than the less precise (in the case of top-level code) “current
declaration”.</div>
<div class=""><br class=""></div>
<div class="">I didn’t write the proposal but I was very heavily
involved in the discussions and IIRC I provided the original
suggestion for introducing a scoped access modifier.</div>
<div class=""><br class=""></div>
<div class="">If my example was the following:</div>
<div class=""><br class=""></div>
<div class="">private struct Foo {<br class="">
&nbsp; private var bar: Int<br class="">
}</div>
<div class=""><br class=""></div>
<div class="">Then what you are saying would be correct.
&nbsp;However, The example I showed did not provide an access
modifier for `bar`.</div>
<div class=""><br class=""></div>
<div class="">You cannot just apply the same *access modifier* to
members of the type that do not contain an access modifier.
&nbsp;You have to apply the same *visibility* (limited to
internal). &nbsp;When a type is marked as `private` in the lexical
scope of the file, its unmodified members will be visible in the
same lexical scope as the type itself (which is the file in the
current example).</div>
<div class=""><br class=""></div>
<div class="">-Matthew</div>
<br class="">
<blockquote type="cite" class="">
<div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="">
Does this help?<br class="">
<br class="">
-Matthew<br class="">
<br class="">
<blockquote type="cite" class=""><br class="">
~Robert Widmann<br class="">
<br class="">
2016/06/15 11:36、Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>&gt; のメッセージ:<br class="">
<br class="">
<blockquote type="cite" class="">The scope for a top-level
declaration is the file itself. &nbsp;This means that top-level
declarations with `private` and `fileprivate` should have the same
behavior. &nbsp;They should not be uninstantiable or
unusable.<br class="">
<br class="">
-Matthew<br class="">
<br class="">
<blockquote type="cite" class="">On Jun 15, 2016, at 1:31 PM,
Robert Widmann via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class="">
<br class="">
While implementing SE-0025 (fileprivate), I noticed an interesting
bug in the proposal. &nbsp;Under the implementation outlined there,
any top-level structure, class, or enum declared private cannot
possibly be instantiated and so cannot be used in any way.
&nbsp;Because of this, private top-level declarations are more
often than not blown away entirely by the compiler for being
unused. &nbsp;It seems strange to me to allow a key language
feature to act solely as a hint to the optimizer to reduce the size
of your binary. &nbsp;Perhaps the restrictions around private needs
to be relaxed or the line between fileprivate and private needs to
be investigated again by the community before inclusion in the
language.<br class="">
<br class="">
Thoughts?<br class="">
<br class="">
~Robert Widmann<br class="">
_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></blockquote>
</blockquote>
</blockquote>
</blockquote>
</div>
</blockquote>
</div>
<br class=""></div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<br class=""></div>
</blockquote>


_______________________________________________<br>swift-evolution mailing list<br>swift-evolution@swift.org<br>https://lists.swift.org/mailman/listinfo/swift-evolution<br></div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>