diff options
author | bors <bors@rust-lang.org> | 2023-03-14 14:25:02 +0000 |
---|---|---|
committer | bors <bors@rust-lang.org> | 2023-03-14 14:25:02 +0000 |
commit | 2e7034ebf7f57066c260b680c5e9dfcf04ca4cd5 (patch) | |
tree | a8d0f2648ea80feab3c17f9ddd44e5098bd8ba26 /tests/codegen/src-hash-algorithm/src-hash-algorithm-sha1.rs | |
parent | 669e75163957f8f2408d515ce2da3516cb31f747 (diff) | |
parent | 427aceb9d4f022af56ed39163510185d4251dcde (diff) | |
download | rust-2e7034ebf7f57066c260b680c5e9dfcf04ca4cd5.tar.gz |
Auto merge of #106505 - Nilstrieb:format-args-string-literal-episode-2, r=petrochenkov
Properly allow macro expanded `format_args` invocations to uses captures
Originally, this was kinda half-allowed. There were some primitive checks in place that looked at the span to see whether the input was likely a literal. These "source literal" checks are needed because the spans created during `format_args` parsing only make sense when it is indeed a literal that was written in the source code directly.
This is orthogonal to the restriction that the first argument must be a "direct literal", not being exanpanded from macros. This restriction was imposed by [RFC 2795] on the basis of being too confusing. But this was only concerned with the argument of the invocation being a literal, not whether it was a source literal (maybe in spirit it meant it being a source literal, this is not clear to me).
Since the original check only really cared about source literals (which is good enough to deny the `format_args!(concat!())` example), macros expanding to `format_args` invocations were able to use implicit captures if they spanned the string in a way that lead back to a source string.
The "source literal" checks were not strict enough and caused ICEs in certain cases (see #106191). So I tightened it up in #106195 to really only work if it's a direct source literal.
This caused the `indoc` crate to break. `indoc` transformed the source literal by removing whitespace, which made it not a "source literal" anymore (which is required to fix the ICE). But since `indoc` spanned the literal in ways that made the old check think that it's a literal, it was able to use implicit captures (which is useful and nice for the users of `indoc`).
This commit properly seperates the previously introduced concepts of "source literal" and "direct literal" and therefore allows `indoc` invocations, which don't create "source literals" to use implicit captures again.
Fixes #106191
[RFC 2795]: https://rust-lang.github.io/rfcs/2795-format-args-implicit-identifiers.html#macro-hygiene
Diffstat (limited to 'tests/codegen/src-hash-algorithm/src-hash-algorithm-sha1.rs')
0 files changed, 0 insertions, 0 deletions