<div dir="ltr">This is a pretty great bug: <a href="https://bugs.swift.org/browse/SR-3483">https://bugs.swift.org/browse/SR-3483</a><div><div><br></div><div><div><font face="monospace, monospace">    let x: Double? = 1</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    </font><span style="font-family:monospace,monospace">// error: ambiguous reference to member &#39;+&#39;</span></div><div><font face="monospace, monospace">    let sum = x! + x! + x!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    </font><span style="font-family:monospace,monospace">//  error: value of optional type &#39;Double?&#39; not unwrapped; did you mean to use &#39;!&#39; or &#39;?&#39;?</span></div><div><font face="monospace, monospace">    let sum: Double = x! + x! + x!</font></div></div><div><br></div><div>I&#39;ve been poking around and I think the problem might be in LinkedExprAnalyzer. This class collects type info about elements in a chain of binary operators to speed up constraint solving. It does so in this case by grabbing the DeclRefExpr&#39;s type: <a href="https://github.com/apple/swift/tree/474096b9cbd6ff7ac998d7cea41d629512e25570#L230-L239">https://github.com/apple/swift/tree/474096b9cbd6ff7ac998d7cea41d629512e25570#L230-L239</a></div><div><br></div><div>However, since this is an ASTWalker, (I think) it automatically traverses into the ForceValueExpr without remembering that the type it finds inside (from the DeclRefExpr) should have one level of optionality removed when added to the constraint system.</div><div><br></div><div>This theory sort of makes sense to me, but it doesn&#39;t explain why the simpler &quot;<font face="monospace, monospace">let sum = x! + x!</font>&quot; typechecks correctly, because that goes through the same code path.</div><div><br></div><div>Am I correct that the LinkedExprAnalyzer probably needs to make sure it doesn&#39;t keep the Optional when adding the type of a ForceValueExpr? Why wouldn&#39;t this also cause problems for a single binop application?</div><div><br></div><div>Would it be more appropriate for LinkedExprAnalyzer to be an ASTVisitor (ExprVisitor) so that instead of just saying &quot;yes, continue traversing downwards&quot; (by returning {true, expr}), its ForceValueExpr case could recursively call visit() and then getAnyOptionalObjectType on the result?</div><div><br></div><div><br></div><div>Semi-eptly,</div><div><div><div class="gmail_signature"><div dir="ltr"><div>Jacob<br></div></div></div></div>
</div></div></div>