# Is Cthulhu wrong? Or is it the compiler?

**URL:** <https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071>\
**Category:** General Usage\
**Tags:** cthulhu\
**Created:** [April 29, 2023, 2:06am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071 "2023-04-29T02:06:05Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 2:06am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/1 "2023-04-29T02:06:05Z")

</div>

In this fragment, Cthulhu concludes that all types are concrete, known. Yet, at the bottom  
it suddenly springs on me `csuml` is `Any`. I considered `log`, and used `abs` for its argument.  
To no avail. Any idea how to fix it, and where it comes from?

```julia
        csuml::ComplexF64 = czero::ComplexF64                                                                                                                                                                                                                            
453 csumn::ComplexF64 = czero::ComplexF64                                                                                                                                                                                                                   
454 if (lponel && llorn)                                                                                                                                                                                                                                    
            ...                                                                                                                                                                                                                                                       
464 @inbounds for ii::Int64 = (1:3)::Int64::Tuple{Int64, Int64}                                                                                                                                                                                         
465 r0::Float64 = ar0::Vector{Float64}[ii::Int64]::Float64                                                                                                                                                                                          
466 ra::Float64 = ara::Vector{Float64}[ii::Int64]::Float64                                                                                                                                                                                          
467 opp::Float64 = aopp::Vector{Float64}[ii::Int64]::Float64                                                                                                                                                                                        
468 if ((r0::Float64 < ra::Float64)::Bool)                                                                                                                                                                                                          
469 temp::Float64 = ra::Float64                                                                                                                                                                                                                 
470 ra::Float64 = r0::Float64                                                                                                                                                                                                                   
471 r0::Float64 = temp::Float64                                                                                                                                                                                                                 
472 end                                                                                                                                                                                                                                             
473 sr0::Float64 = (r0::Float64 * r0::Float64)::Float64                                                                                                                                                                                             
474 sra::Float64 = (ra::Float64 * ra::Float64)::Float64                                                                                                                                                                                             
475 sopp::Float64 = (opp::Float64 * opp::Float64)::Float64                                                                                                                                                                                          
476 a::Float64 = acos(((((((sra::Float64 + sr0::Float64)::Float64 - sopp::Float64)::Float64) / two::Float64)::Float64 / ra::Float64)::Float64 / r0::Float64)::Float64)::Float64                                                                     
477 b::Float64 = atan(((ra * sin(a::Float64)::Float64)::Float64 / ((r0::Float64 - (ra * cos(a::Float64)::Float64)::Float64)::Float64))::Float64)::Float64                                                                                           
478 (csuml::ComplexF64 += (((r0::Float64 * sin(b::Float64)::Float64 * ((log(abs(tan((((b::Float64 + a::Float64)::Float64) / two::Float64)::Float64)::Float64)::Float64)::Float64 - log(abs(tan((b::Float64 / two::Float64)::Float64)::Float64)::Float64)::Float64)::Float64))::Float64) / qarea::Float64)::Float64)::ComplexF64                                                                                                                                                                                     
479 (csumn::ComplexF64 +=(( (((cos((b::Float64 + a::Float64)::Float64)::Float64 - cos(b::Float64)::Float64)::Float64) / r0::Float64)::Float64 / sin(b::Float64)::Float64)::Float64 / qarea::Float64)::Float64)::ComplexF64                          
480 end                                                                                                                                                                                                                                                 
481 end                                                                                                                                                                                                                                                     
482 csumn::ComplexF64 = (csumn - (sko2::ComplexF64 * csuml::Any)::ComplexF64)::ComplexF64  

```

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 3:11am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/2 "2023-04-29T03:11:41Z")

</div>

Actually, it is not just Cthulhu, `@code_warntype` does the same thing. Everything is fine, until it reports

```julia
    csuml::ComplexF64 = (t5::ComplexF64 / qarea::Float64)::ComplexF64                                                                                                                                                                                   
487 csumn::ComplexF64 = (csumn - (sko2::ComplexF64 * csuml::Any)::ComplexF64)::ComplexF64 

```

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 3:16am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/3 "2023-04-29T03:16:35Z")

</div>

One more observation: there are a lot of allocations. Hence I think the compiler boxes things up and therefore it might actually be compiler failure to correctly detect the type.

---

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [April 29, 2023, 3:18am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/4 "2023-04-29T03:18:25Z")

</div>

It’s also strange to me that it’s very confident that `*(::ComplexF64, ::Any)` returns `ComplexF64`.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 3:55am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/5 "2023-04-29T03:55:59Z")

</div>

The above was tested with 1.8.5. Same result with 1.9.0-rc2, though.

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [April 29, 2023, 7:19am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/6 "2023-04-29T07:19:05Z")

</div>

Can you share the function definition this occurred on? Cthulhu just shows what the compiler knows, so there shouldn’t be a mismatch between what it displays and what the compiler infers.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 2:42pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/7 "2023-04-29T14:42:45Z")

</div>

I’m afraid the function is a bit of a monster. Here is the [gist] ([mwe.jl · GitHub](https://gist.github.com/PetrKryslUCSD/0838a67c28b6f3c3400a0115ea852d88)). To run, include the file.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 3:34pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/8 "2023-04-29T15:34:44Z")

</div>

I figured it out! On line 176 of the gist, `csuml` is reported to assume type of `Any`.  
This is due to a typo on line 333 (undefined variable)! Unfortunately, I had it backwards:  
I thought the variable had become tainted before line 176, while the type was backpropagated  
from way below that line. And the tests I wrote for the function failed to test the branch where the undefined variable was referenced. Uff.

Edit: The story is a bit more complex (🙂 ). See below.

---

<div class="post-metadata">

**Author:** ![Sukera](https://avatars.discourse-cdn.com/v4/letter/s/ce7236/32.png) [@Sukera](https://discourse.julialang.org/u/Sukera)\
**Post date:** [April 29, 2023, 5:04pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/9 "2023-04-29T17:04:04Z")

</div>

Yeah, that’s tricky to find from just `@code_typed`/`@code_warntype` alone - I usually use JET’s `report_call` for that kind of preliminary analysis, which reports such undefined variables.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 5:10pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/10 "2023-04-29T17:10:53Z")

</div>

That is good to know, I will check it out.

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [April 29, 2023, 5:58pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/11 "2023-04-29T17:58:56Z")

</div>

Are you not using the LSP?  
I just copy/pasted your gist, and it gives me `Missing reference: fpgv`, underlining it.

You also have a lot of variables you’re assigning but not using.

I’m a major proponent of tooling. It can save a lot more time than it takes fiddling with it to get it working.  
It does tend to be overzealous with the “possible method call errors” though.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 29, 2023, 6:17pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/12 "2023-04-29T18:17:12Z")

</div>

No, I am not. Though in this case it would have been a boon. In general, I found it too concerned about things which were not real problems.

---

<div class="post-metadata">

**Author:** ![Benny](https://avatars.discourse-cdn.com/v4/letter/b/49beb7/32.png) [@Benny](https://discourse.julialang.org/u/Benny)\
**Post date:** [April 29, 2023, 11:25pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/13 "2023-04-29T23:25:51Z")

</div>

Still baffling to me, if `csuml`’s type inference was ruined by an operation with an undefined variable way afterward, why wouldn’t it be ruined the whole way and affect other variables like `csumn`? How would the compiler decide the point where it stops inferring the variable’s type?

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [April 30, 2023, 2:51pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/14 "2023-04-30T14:51:05Z")

</div>

I think Cthulhu messed up here. On [line 176](https://gist.github.com/PetrKryslUCSD/0838a67c28b6f3c3400a0115ea852d88), the compiler clearly concluded `csuml` was `ComplexF64`, otherwise the result couldn’t have been of the same type.

Then, `csuml` can become `Any` by traversing one path inside the loop starting on line 183. So any of its uses inside the loop should be typed `Any`. But NOT before the loop.

Edit: reported as [issue](https://github.com/JuliaDebug/Cthulhu.jl/issues/447) now.

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [April 30, 2023, 4:46pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/15 "2023-04-30T16:46:05Z")

</div>

![image](https://global.discourse-cdn.com/julialang/original/3X/b/4/b415f78c05f68b955610cc62abde9495c2133d8b.jpeg)

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [May 2, 2023, 2:21am UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/16 "2023-05-02T02:21:49Z")

</div>

How did you get “Missing Reference”? When I run LSP in VS Code, it does not show me that.  
 ![image](https://global.discourse-cdn.com/julialang/original/3X/0/4/04b9fedd52401d6aa19de1a51b1fb9e7e54b4d14.png)

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [May 2, 2023, 2:10pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/17 "2023-05-02T14:10:36Z")

</div>

I’m not sure; it works in emacs.  
 ![scratch](https://global.discourse-cdn.com/julialang/original/3X/a/2/a218b68681ff2ef23500d41469a860803262ea86.png)  
The echo area (bottom of my screen) tells me  
`Julia: Missing reference: fpgv`.

I think there may be settings in VSCode where you can enable some additional diagnostics?

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [May 2, 2023, 2:42pm UTC](https://discourse.julialang.org/t/is-cthulhu-wrong-or-is-it-the-compiler/98071/18 "2023-05-02T14:42:21Z")

</div>

Got it. It is actually a Lint setting.
