Commit b32cd9f
committed
Fix false positive in _final send checking for generic classes
The finalisers pass conservatively reports FINAL_MAY_SEND when it
encounters a method call on an unknown type. When _final calls a method
on a generic class instantiated with concrete type args (e.g.,
Generic[Prim]), the pass follows into the method body where expressions
still reference the generic type parameter A. Since A's constraint is a
trait, is_known(A) returns false and the pass reports a false positive.
Two changes fix this:
1. Reify the method body with the entity's concrete type arguments
before analyzing it. This replaces type parameters with their concrete
types so is_known sees the actual type. The recursion guard is set on
the original body (not the reified copy) so that recursive lookups
correctly detect cycles.
2. Replace ast_get with lookup_try for method resolution. ast_get only
searches the entity's own symbol table, missing methods inherited
through the provides chain. lookup_try handles the full provides chain.
This expands the range of generic code accepted in _final methods.
Cases where the concrete type doesn't have the called method in its
own scope (e.g., Range calling finite() which exists on the Real trait
but not on USize) still fall back to FINAL_MAY_SEND conservatively.
Closes #42491 parent 6491d1f commit b32cd9f
4 files changed
Lines changed: 142 additions & 88 deletions
File tree
- .github/workflows
- .release-notes
- src/libponyc/pass
- test/libponyc
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
| 84 | + | |
| 85 | + | |
84 | 86 | | |
85 | 87 | | |
86 | 88 | | |
87 | 89 | | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
93 | 94 | | |
94 | 95 | | |
95 | 96 | | |
| |||
116 | 117 | | |
117 | 118 | | |
118 | 119 | | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
| 120 | + | |
126 | 121 | | |
127 | 122 | | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
132 | 144 | | |
133 | 145 | | |
134 | 146 | | |
| |||
153 | 165 | | |
154 | 166 | | |
155 | 167 | | |
156 | | - | |
| 168 | + | |
157 | 169 | | |
158 | 170 | | |
159 | 171 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | | - | |
| 17 | + | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| |||
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | | - | |
86 | | - | |
87 | | - | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
| 41 | + | |
97 | 42 | | |
98 | 43 | | |
99 | 44 | | |
| |||
118 | 63 | | |
119 | 64 | | |
120 | 65 | | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | 66 | | |
125 | | - | |
126 | | - | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
127 | 78 | | |
128 | 79 | | |
129 | | - | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
130 | 120 | | |
131 | 121 | | |
132 | 122 | | |
| |||
147 | 137 | | |
148 | 138 | | |
149 | 139 | | |
150 | | - | |
| 140 | + | |
151 | 141 | | |
152 | 142 | | |
153 | 143 | | |
154 | 144 | | |
155 | | - | |
| 145 | + | |
156 | 146 | | |
157 | 147 | | |
158 | 148 | | |
159 | 149 | | |
160 | 150 | | |
161 | 151 | | |
162 | | - | |
| 152 | + | |
163 | 153 | | |
164 | 154 | | |
165 | 155 | | |
166 | 156 | | |
167 | 157 | | |
168 | 158 | | |
169 | 159 | | |
170 | | - | |
| 160 | + | |
171 | 161 | | |
172 | 162 | | |
173 | 163 | | |
| |||
180 | 170 | | |
181 | 171 | | |
182 | 172 | | |
183 | | - | |
| 173 | + | |
184 | 174 | | |
185 | 175 | | |
186 | 176 | | |
| |||
206 | 196 | | |
207 | 197 | | |
208 | 198 | | |
209 | | - | |
| 199 | + | |
210 | 200 | | |
211 | 201 | | |
212 | 202 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
114 | 161 | | |
115 | 162 | | |
116 | 163 | | |
| |||
0 commit comments