-
Notifications
You must be signed in to change notification settings - Fork 13k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merge PatKind::Path
into PatKind::Expr
#134248
base: master
Are you sure you want to change the base?
Conversation
This comment has been minimized.
This comment has been minimized.
7cee193
to
eb60270
Compare
This comment has been minimized.
This comment has been minimized.
eb60270
to
a29a302
Compare
This comment has been minimized.
This comment has been minimized.
40adfed
to
25dae36
Compare
…ler-errors Forbid overwriting types in typeck While trying to figure out some type setting logic in rust-lang#134248 I realized that we sometimes set a type twice. While hopefully that would have been the same type, we didn't ensure that at all and just silently accepted it. So now we reject setting it twice, unless errors are happening, then we don't care. Best reviewed commit by commit. No behaviour change is intended.
…ler-errors Forbid overwriting types in typeck While trying to figure out some type setting logic in rust-lang#134248 I realized that we sometimes set a type twice. While hopefully that would have been the same type, we didn't ensure that at all and just silently accepted it. So now we reject setting it twice, unless errors are happening, then we don't care. Best reviewed commit by commit. No behaviour change is intended.
Rollup merge of rust-lang#134474 - oli-obk:push-yomnkntvzlxw, r=compiler-errors Forbid overwriting types in typeck While trying to figure out some type setting logic in rust-lang#134248 I realized that we sometimes set a type twice. While hopefully that would have been the same type, we didn't ensure that at all and just silently accepted it. So now we reject setting it twice, unless errors are happening, then we don't care. Best reviewed commit by commit. No behaviour change is intended.
Forbid overwriting types in typeck While trying to figure out some type setting logic in rust-lang/rust#134248 I realized that we sometimes set a type twice. While hopefully that would have been the same type, we didn't ensure that at all and just silently accepted it. So now we reject setting it twice, unless errors are happening, then we don't care. Best reviewed commit by commit. No behaviour change is intended.
Forbid overwriting types in typeck While trying to figure out some type setting logic in rust-lang/rust#134248 I realized that we sometimes set a type twice. While hopefully that would have been the same type, we didn't ensure that at all and just silently accepted it. So now we reject setting it twice, unless errors are happening, then we don't care. Best reviewed commit by commit. No behaviour change is intended.
☔ The latest upstream changes (presumably #134788) made this pull request unmergeable. Please resolve the merge conflicts. |
2f05ee6
to
1be4ad1
Compare
This comment has been minimized.
This comment has been minimized.
1be4ad1
to
2269e1f
Compare
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
Merge `PatKind::Path` into `PatKind::Lit` Follow-up to rust-lang#134228 We always had a duplication where `Path`s could be represented as `PatKind::Path` or `PatKind::Lit(ExprKind::Path)`. We had to handle both everywhere, and still do after rust-lang#134228, so I'm removing it now. subsequently we can also nuke `visit_pattern_type_pattern`
This comment has been minimized.
This comment has been minimized.
😅 finally. Ready for review as I have nothing more to add on the code side. Best reviewed commit by commit |
PatKind::Path
into PatKind::Lit
PatKind::Path
into PatKind::Expr
compiler/rustc_hir/src/intravisit.rs
Outdated
PatKind::Expr(ref expression) => { | ||
try_visit!(walk_pat_expr(visitor, pattern.hir_id, pattern.span, expression)) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So this is kind of sketchy. It means that overriding visit_pat_expr
wont' actually visit any PatKind::Expr
. I haven't looked to see if any existing hir visitors would be incorrect now but at the very least it seems like unexpected behaviour.
It also seems like to some extent jankyness around hir visitors and patterns is pre-existing, we store PatExpr
in PatKind::Range
which means that overriding the visit_pat
function won't actually visit the patterns in range patterns. Again I don't really know if there's any existing hir visitors which are buggy because of this but it feels unexpected and like it could cause issues.
If it's possible to keep PatKind::Expr
as containing a PatExpr
for now that would mean that this PR wouldn't make anything worse here. I could imagine that potentially having performance implications though from now having more nodes in the HIR, more HirId
s and generally Pat
being larger as path exprs now go through a layer of indirection through a PatExpr
.
Can probably figure out other solutions if that doesn't work out perf wise, though if that doesn't work out it's probably worth figuring out how to also make visit_pat
visit all patterns as it wouldn't surprise me if they wind up being similar solutions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
visit the patterns in range patterns
there are no patterns within range patterns. you can't do a..5
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right it's a PatExpr
but that's still a pattern no? Just because we don't support all pattern syntax there doesn't make it not a pattern 🤔
edit: Maybe that's just not a good intuition and it's fine for visit_pat
to not visit that stuff though, the important thing is the visit_pat_expr
stuff I think since its a new change
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
141c3ba#diff-ffa196a0614fce5117ac525b8da3cbf210e21efa6f743b2ec2b7eb3d8ea38a76R331-R333 I assume this change is a manifestation of the fact that by storing an PatExprKind
, visitors which are doing something "obviously right" overriding visit_pat_expr
now no longer actually visit all pat exprs
this definitely makes me feel like this is something that could be hit in practice so should probably be worked around somehow
d327296
to
fd47152
Compare
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
Merge `PatKind::Path` into `PatKind::Expr` Follow-up to rust-lang#134228 We always had a duplication where `Path`s could be represented as `PatKind::Path` or `PatKind::Lit(ExprKind::Path)`. We had to handle both everywhere, and still do after rust-lang#134228, so I'm removing it now.
⌛ Trying commit fd47152 with merge 78fe09469938ee57fbc1e1dc8e20855ef0609ae0... |
let expr = hir::PatExpr { hir_id: pat_hir_id, span, kind }; | ||
let expr = self.arena.alloc(expr); | ||
return hir::Pat { | ||
hir_id: self.next_id(), | ||
kind: hir::PatKind::Expr(expr), | ||
span, | ||
default_binding_modes: true, | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fishy HirId
swap, but I can't remember why this is the right soluation. If I do it differently we end up not being able to handle assoc consts anymore
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
💔 Test failed - checks-actions |
fd47152
to
dbf867b
Compare
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
Merge `PatKind::Path` into `PatKind::Expr` Follow-up to rust-lang#134228 We always had a duplication where `Path`s could be represented as `PatKind::Path` or `PatKind::Lit(ExprKind::Path)`. We had to handle both everywhere, and still do after rust-lang#134228, so I'm removing it now.
☀️ Try build successful - checks-actions |
This comment has been minimized.
This comment has been minimized.
Finished benchmarking commit (a5bd41a): comparison URL. Overall result: ❌ regressions - please read the text belowBenchmarking this pull request likely means that it is perf-sensitive, so we're automatically marking it as not fit for rolling up. While you can manually mark this PR as fit for rollup, we strongly recommend not doing so since this PR may lead to changes in compiler perf. Next Steps: If you can justify the regressions found in this try perf run, please indicate this with @bors rollup=never Instruction countThis is the most reliable metric that we have; it was used to determine the overall result at the top of this comment. However, even this metric can sometimes exhibit noise.
Max RSS (memory usage)This benchmark run did not return any relevant results for this metric. CyclesThis benchmark run did not return any relevant results for this metric. Binary sizeThis benchmark run did not return any relevant results for this metric. Bootstrap: 778.767s -> 774.185s (-0.59%) |
No diffs in query executions, so it's all about incremental caching being more expensive due to the extra node, which is unavoidable, but also very small. We can always revisit in the future, but more robust code trumps perf for now. |
Follow-up to #134228
We always had a duplication where
Path
s could be represented asPatKind::Path
orPatKind::Lit(ExprKind::Path)
. We had to handle both everywhere, and still do after #134228, so I'm removing it now.