<div dir="ltr"><div><div><div>This inconsistency is not limited to situations in which a tuple is a non-temporary value:</div><div><br></div></div><div><div><br></div><div><font face="monospace, monospace">class C {}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">let _ = (C(), 3 as Int) as (Any, Int?)  // WORKS FINE</font></div><div><font face="monospace, monospace">let _ = (C(), 3) as (C, Int) as (Any, Int?)  // TYPE ERROR</font></div><div><font face="monospace, monospace">let _ = ((C(), 3), true).0 as (Any, Int?)  // TYPE ERROR</font></div><div><br></div><div><br></div><div></div></div><div><div>It can even cause the compiler to crash during type-checking on expressions like the one below (which ought to be considered well-typed):</div><div><br></div><div><br></div><div><div><font face="monospace, monospace">let _ = &quot;a&quot;.isEmpty ? (C(), 3) as (C, Int) : (C(), 3) as (Any, Int?)</font></div></div><div><br></div><div><br></div></div><div>And it leads to some rather amusing output if you compile and run this code:<br></div></div><div><br></div><div><br></div><div><span style="font-family:monospace,monospace">if (C(), 3 as Int) is (Any, Int?) {</span><br></div><div><font face="monospace, monospace"><div>  print(&quot;test is true&quot;)</div><div>} else {</div><div>  print(&quot;test is false&quot;)</div><div>}</div></font></div><div><br></div><div><br></div><div>The outcome will look something like this:</div><div><br></div><div><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"></blockquote></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><i><span style="font-family:monospace,monospace">test.swift:88:20: warning: &#39;is&#39; test is always true<br></span><span style="font-family:monospace,monospace">if (C(), 3 as Int) is (Any, Int?) {<br></span><span style="font-family:monospace,monospace">                   ^<br></span><font face="monospace, monospace">test is false</font></i></blockquote><blockquote class="gmail_quote" style="margin:0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);border-right-width:1px;border-right-style:solid;border-right-color:rgb(204,204,204);padding-left:1ex;padding-right:1ex"></blockquote><blockquote class="gmail_quote" style="margin:0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);border-right-width:1px;border-right-style:solid;border-right-color:rgb(204,204,204);padding-left:1ex;padding-right:1ex"></blockquote><div><blockquote class="gmail_quote" style="margin:0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);border-right-width:1px;border-right-style:solid;border-right-color:rgb(204,204,204);padding-left:1ex;padding-right:1ex"></blockquote><blockquote class="gmail_quote" style="margin:0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);border-right-width:1px;border-right-style:solid;border-right-color:rgb(204,204,204);padding-left:1ex;padding-right:1ex"></blockquote></div><div><br></div><div><br></div><div>My bug report contains versions of all of those examples:</div><div><br></div><div><a href="https://bugs.swift.org/browse/SR-2041" target="_blank">https://bugs.swift.org/browse/SR-2041</a></div><div><br></div><div>I used type casts above in order to make the origin of the problem as clear as possible; however, it&#39;s also worth adding one more example to illustrate that this problem is not limited to code that is contrived or uses tuples in ways that are stylistically discouraged:</div><div><div><br></div></div><div><br></div><div><font face="monospace, monospace">func returnPair() -&gt; (C, Int) { return (C(), 3) }</font></div><div><font face="monospace, monospace">var x: Int? = nil</font></div><div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">x = returnPair().1  // WORKS FINE</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(_, x) = returnPair()  // TYPE ERROR</font></div><div><br></div><div><br></div><div>- Aaron<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 6, 2016 at 8:57 AM, Shane S <span dir="ltr">&lt;<a href="mailto:electro_alchemy@hotmail.com" target="_blank">electro_alchemy@hotmail.com</a>&gt;</span> wrote:<br><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>The section you are referencing is regarding ‘assignment’; however, in the example below we aren’t talking about assignment, this is &#39;constant-declaration&#39;, which is different than a ‘parenthesized expression’.</div>
<div><br>
</div>
<div>But overall I get it, and I think I’m trending toward the same conclusion you reached re: checking the full type of the identifier -vs- comparing the types of the constituent elements - interesting stuff!</div><span class="HOEnZb"><font color="#888888">
<div><br>
</div>
<div>Shane</div></font></span><div><div class="h5">
<div><br>
</div>
<br>
<div>
<blockquote type="cite">
<div>On Jul 6, 2016, at 7:34 AM, Neil Faiman &lt;<a href="mailto:neil.swift@faiman.org" target="_blank">neil.swift@faiman.org</a>&gt; wrote:</div>
<br>
<div>
<div style="word-wrap:break-word">
<div>The language reference says that “Assignment is performed from each part of the <i>value</i> to the corresponding part of the <i>expression</i>. A <b>String</b> value can be assigned to a <b>String</b>, and
 a <b>() -&gt; Int</b> value can be assigned to a <b>() throws -&gt; Int</b>, so one would reasonably expect that both tuple assignments would work. </div>
<div><br>
</div>
<div>My hunch would be that the compiler has two different code paths for an assignment whose RHS is an <i>identifier</i> and an assignment whose RHS is a  <i>parenthesized-expression</i>; that in the first case starts about by asking
 whether the RHS type is the same or a subtype of the LHS type, and reporting an error when it isn’t, but that in the second case, it starts with an element-by-element type comparison, which succeeds.</div>
<div><br>
</div>
<div>Regards,</div>
<div><br>
</div>
<div><span style="white-space:pre-wrap"></span>Neil</div>
<div><br>
</div>
<div>
<blockquote type="cite">
<div>On Jul 6, 2016, at 9:55 AM, Shane S via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div>
<br>
<div>
<div style="word-wrap:break-word">
Aaron this works for me in both Swift 2.2 and Swift 3 provided that you remove the ‘throws’ keyword.
<div><br>
</div>
<div>What seems odd to me is not the first assignment, but rather the second that _allows_ the use of ‘throws’ when t.1 (i.e. f) does not throw - is your concern the same?</div>
<div><br>
</div>
<div>Shane</div>
<div><br>
</div>
<div><br>
</div>
<div>
<div>
<div>
<blockquote type="cite">
<div>On Jul 5, 2016, at 10:48 PM, Aaron Bohannon via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:</div>
<br>
<div>
<div dir="ltr">
<div>Yesterday, it was pointed out that a variable name referring to a tuple cannot be used as a pattern.  I have noticed another sort of inconsistency in how tuples are treated when they are referenced by name:</div>
<div><br>
</div>
<div>
<div><font face="monospace, monospace">func f() -&gt; Int { return 5 }</font></div>
<div><font face="monospace, monospace"><br>
</font></div>
<div><font face="monospace, monospace">let t = (&quot;a&quot;, f)</font></div>
<div><font face="monospace, monospace"><br>
</font></div>
<div><font face="monospace, monospace">let _: (String, () throws -&gt; Int) = t  // type error</font></div>
<div><font face="monospace, monospace">let _: (String, () throws -&gt; Int) = (t.0, t.1)  // OK</font></div>
</div>
<div><br>
</div>
<div>This situation leads to a different sort of type error; however, the error seems equally unwarranted.  I can&#39;t see any good reason for a well-typed program to become ill-typed when `(t.0, t.1)` is replaced with `t` (assuming `t` is a pair).</div>
<div><br>
</div>
<div>Should I file a separate bug for the specific example above?</div>
<div><br>
</div>
<div>- Aaron</div>
</div>
_______________________________________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
_______________________________________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
</div>
<br>
</div></div></div>

</blockquote></div><br></div>