[swift-dev] Unexpected Expr type

Slava Pestov spestov at apple.com
Thu Apr 6 18:05:04 CDT 2017


Here’s what the AST looks like in this case — there is a ParenExpr but it’s inside a LoadExpr — we’re semantically loading the largest sub-expression that’s an lvalue, which here is ‘(x)’ not ‘x’:

      (assign_expr
        (declref_expr type='@lvalue Int' accessKind=write location=x.swift:3:1 range=[x.swift:3:1 - line:3:1] decl=x.(file).v at x.swift:1:5 direct_to_storage function_ref=unapplied specialized=no)
        (load_expr implicit type='(Int)' location=x.swift:3:6 range=[x.swift:3:5 - line:3:7]
          (paren_expr type='(@lvalue Int)' accessKind=read location=x.swift:3:6 range=[x.swift:3:5 - line:3:7]
            (declref_expr type='@lvalue Int' accessKind=read location=x.swift:3:6 range=[x.swift:3:6 - line:3:6] decl=x.(file).v at x.swift:1:5 direct_to_storage function_ref=unapplied specialized=no)))))))

Slava

> On Apr 6, 2017, at 4:02 PM, Halen Wooten via swift-dev <swift-dev at swift.org> wrote:
> 
> Hi Jordan,
> 
> Thanks for your reply. I tried the `dyn_cast<ParenExpr>(src)`, but it
> gives me null. Here's what I've added:
> 
> bool TypeChecker::diagnoseSelfAssignment(const Expr *E) {
> 
>  ...
> 
>  auto src = AE->getSrc();
>  auto parenSrc = dyn_cast<ParenExpr>(src);
>  if (parenSrc)
>    return false;
> 
> ...
> 
> }
> 
> 
> 
> On Thu, Apr 6, 2017 at 6:49 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>> Hi, Halen. Welcome to the compiler. :-) What you're seeing is that we don't
>> usually use C++'s normal RTTI mechanism, but instead go with a "Kind" field
>> that's checked by the custom 'cast', 'dyn_cast', and 'isa' functions. (More
>> information in the LLVM Programmer's Manual.) The debugger doesn't know
>> about this, so it just always shows the base class to be conservative. If
>> you're debugging, you can call dump() to see what kind of Expr it really is,
>> and then cast the pointer down to the right type as needed. In your actual
>> code, you can check `isa<ParenExpr>(src)`, or `dyn_cast<ParenExpr>(src)` if
>> you then need to manipulate the ParenExpr.
>> 
>> Hope that helps,
>> Jordan
>> 
>> 
>> On Apr 6, 2017, at 15:30, Halen Wooten via swift-dev <swift-dev at swift.org>
>> wrote:
>> 
>> Hi swift devs,
>> 
>> I'm working on SR-4464 to learn how to contribute to Swift. I think I
>> have the solution, but I'm getting unexpected results.
>> 
>> I'm using the swift repl within Xcode for testing. Here's my test code.
>> 
>> var name = "name"
>> name = (name)
>> 
>> In TypeChecker::diagnoseSelfAssignment in CSDiag.cpp, the src of the
>> AssignExpr is a plain Expr *, but I would expect it to be a ParenExpr
>> *. Could someone help me figure out what's happening?
>> 
>> Thanks,
>> Halen
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-dev
>> 
>> 
> _______________________________________________
> swift-dev mailing list
> swift-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev



More information about the swift-dev mailing list