Fixup Windows verbatim paths when used with the include!
macro by ChrisDenton · Pull Request #125205 · rust-lang/rust (original) (raw)
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
On Windows, the following code can fail if the OUT_DIR
environment variable is a verbatim path (i.e. begins with \\?\
):
include!(concat!(env!("OUT_DIR"), "/src/repro.rs"));
This is because verbatim paths treat /
literally, as if it were just another character in the file name.
The good news is that the standard library already has code to fix this. We can simply use components
to normalize the path so it works as intended.
r? @jieyouxu
rustbot has assigned @jieyouxu.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.
Use r?
to explicitly pick a reviewer
rustbot added S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
Some changes occurred in run-make tests.
cc @jieyouxu
ChrisDenton added the T-lang
Relevant to the language team, which will review and decide on the PR/issue.
label
This comment has been minimized.
While I'd very much welcome a review from jieyouxu, this will need lang approval. I think it could just be considered a bug fix but it might also be considered a change in language.
cc @joshtriplett maybe?
Given that I see most projects already using /
as the separator, calling it a bug fix seems fair. Still, I agree that lang should see it.
Changes look reasonable from compiler side. Rolling a lang reviewer to decide if this behavior change is acceptable.
r? lang
ChrisDenton added S-waiting-on-team
Status: Awaiting decision from the relevant subteam (see the T- label).
and removed T-compiler
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
This comment has been minimized.
When using concat!
to join paths, the Unix path separator (/
) is often used. This breaks on Windows if the base path is a verbatim path (i.e. starts with \\?\
).
It looks like this is limited to verbatim paths, which seems completely safe. This wouldn't be safe to do for arbitrary Windows driver-interpreted paths, but it seems entirely safe for Windows verbatim paths.
Thanks! So I'm going to go out on a limb and say jieyouxu's positive review still stands.
@bors r=jieyouxu
📌 Commit edc97a0 has been approved by jieyouxu
It is now in the queue for this repository.
bors added S-waiting-on-bors
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
and removed S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
Status: Awaiting decision from the relevant subteam (see the T- label).
labels
1 similar comment
I mean you can't use
concat
in path, right?
This isn't concat
-specific though, because it'll change if you put a string literal in the include
too.
I just think that we should do it for all compiler paths if we're doing it here.
🔔 This is now entering its final comment period, as per the review above. 🔔
@rustbot labels -I-lang-nominated
We discussed this in the meeting today... and it's now in FCP.
The final comment period, with a disposition to merge, as per the review above, is now complete.
As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.
This will be merged soon.
I mean you can't use
concat
in path, right?This isn't
concat
-specific though, because it'll change if you put a string literal in theinclude
too.I just think that we should do it for all compiler paths if we're doing it here.
Oh, it turns out we do something kind of similar for path
already:
// On windows, the base path might have the form |
---|
// `\\?\foo\bar` in which case it does not tolerate |
// mixed `/` and `\` separators, so canonicalize |
// `/` to `\`. |
#[cfg(windows)] |
let path_str = path_str.replace("/", "\\"); |
This has passed lang FCP and was earlier approved by @jieyouxu so I'll merge this now. I'll look more at #[path]
but it already looks like it does the equivalent by virtue of using Path::join
(which handles verbatim paths).
Some(dir_path.join(path_str)) |
---|
@bors r=jieyouxu
📌 Commit edc97a0 has been approved by jieyouxu
It is now in the queue for this repository.
bors added S-waiting-on-bors
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
and removed S-waiting-on-author
Status: This is awaiting some action (such as code changes or more information) from the author.
labels
bors added a commit to rust-lang-ci/rust that referenced this pull request
…iaskrgr
Rollup of 8 pull requests
Successful merges:
- rust-lang#125205 (Fixup Windows verbatim paths when used with the
include!
macro) - rust-lang#131049 (Validate args are correct for
UnevaluatedConst
,ExistentialTraitRef
/ExistentialProjection
) - rust-lang#131549 (Add a note for
?
on aimpl Future<Output = Result<..>>
in sync function) - rust-lang#131731 (add
TestFloatParse
totools.rs
for bootstrap) - rust-lang#131732 (Add doc(plugins), doc(passes), etc. to INVALID_DOC_ATTRIBUTES)
- rust-lang#132006 (don't stage-off to previous compiler when CI rustc is available)
- rust-lang#132022 (Move
cmp_in_dominator_order
out of graph dominator computation) - rust-lang#132033 (compiletest: Make
line_directive
return aDirectiveLine
)
r? @ghost
@rustbot
modify labels: rollup
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
Rollup merge of rust-lang#125205 - ChrisDenton:verbatim-include, r=jieyouxu
Fixup Windows verbatim paths when used with the include!
macro
On Windows, the following code can fail if the OUT_DIR
environment variable is a verbatim path (i.e. begins with \\?\
):
include!(concat!(env!("OUT_DIR"), "/src/repro.rs"));
This is because verbatim paths treat /
literally, as if it were just another character in the file name.
The good news is that the standard library already has code to fix this. We can simply use components
to normalize the path so it works as intended.
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request
This MR contains the following updates:
Package | Update | Change |
---|---|---|
rust | minor | 1.83.0 -> 1.84.0 |
MR created with the help of el-capitano/tools/renovate-bot.
Proposed changes to behavior should be submitted there as MRs.
Release Notes
rust-lang/rust (rust)
v1.84.0
==========================
Language
- Allow
#[deny]
inside#[forbid]
as a no-op - Show a warning when
-Ctarget-feature
is used to toggle features that can lead to unsoundness due to ABI mismatches - Use the next-generation trait solver in coherence
- Allow coercions to drop the principal of trait objects
- Support
/
as the path separator forinclude!()
in all cases on Windows - Taking a raw ref (
raw (const|mut)
) of a deref of a pointer (*ptr
) is now safe - Stabilize s390x inline assembly
- Stabilize Arm64EC inline assembly
- Lint against creating pointers to immediately dropped temporaries
- Execute drop glue when unwinding in an
extern "C"
function
Compiler
- Add
--print host-tuple
flag to print the host target tuple and affirm the "target tuple" terminology over "target triple" - Declaring functions with a calling convention not supported on the current target now triggers a hard error
- Set up indirect access to external data for
loongarch64-unknown-linux-{musl,ohos}
- Enable XRay instrumentation for LoongArch Linux targets
- Extend the
unexpected_cfgs
lint to also warn in external macros - Stabilize WebAssembly
multivalue
,reference-types
, andtail-call
target features - Added Tier 2 support for the
wasm32v1-none
target
Libraries
- Implement
From<&mut {slice}>
forBox/Rc/Arc<{slice}>
- Move
<float>::copysign
,<float>::abs
,<float>::signum
tocore
- Add
LowerExp
andUpperExp
implementations toNonZero
- Implement
FromStr
forCString
andTryFrom<CString>
forString
std::os::darwin
has been made public
Stabilized APIs
Ipv6Addr::is_unique_local
Ipv6Addr::is_unicast_link_local
core::ptr::with_exposed_provenance
core::ptr::with_exposed_provenance_mut
<ptr>::addr
<ptr>::expose_provenance
<ptr>::with_addr
<ptr>::map_addr
<int>::isqrt
<int>::checked_isqrt
<uint>::isqrt
NonZero::isqrt
core::ptr::without_provenance
core::ptr::without_provenance_mut
core::ptr::dangling
core::ptr::dangling_mut
Pin::as_deref_mut
These APIs are now stable in const contexts
AtomicBool::from_ptr
AtomicPtr::from_ptr
AtomicU8::from_ptr
AtomicU16::from_ptr
AtomicU32::from_ptr
AtomicU64::from_ptr
AtomicUsize::from_ptr
AtomicI8::from_ptr
AtomicI16::from_ptr
AtomicI32::from_ptr
AtomicI64::from_ptr
AtomicIsize::from_ptr
<ptr>::is_null
<ptr>::as_ref
<ptr>::as_mut
Pin::new
Pin::new_unchecked
Pin::get_ref
Pin::into_ref
Pin::get_mut
Pin::get_unchecked_mut
Pin::static_ref
Pin::static_mut
Cargo
Rustdoc
Compatibility Notes
- Enable by default the
LSX
target feature for LoongArch Linux targets - The unstable
-Zprofile
flag (“gcov-style” coverage instrumentation) has been removed. This does not affect the stable flags for coverage instrumentation (-Cinstrument-coverage
) and profile-guided optimization (-Cprofile-generate
,-Cprofile-use
), which are unrelated and remain available. - Support for the target named
wasm32-wasi
has been removed as the target is now namedwasm32-wasip1
. This completes the transition plan for this target following the introduction ofwasm32-wasip1
in Rust 1.78. Compiler warnings on use ofwasm32-wasi
introduced in Rust 1.81 are now gone as well as the target is removed. - [The syntax
&pin (mut|const) T
is now parsed as a type which in theory could affect macro expansion results in some edge cases](rust-lang/rust#130635 (comment)) - [Legacy syntax for calling
std::arch
functions is no longer permitted to declare items or bodies (such as closures, inline consts, or async blocks).](rust-lang/rust#130443 (comment)) - Declaring functions with a calling convention not supported on the current target now triggers a hard error
- The next-generation trait solver is now enabled for coherence, fixing multiple soundness issues
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this MR and you won't be reminded about this update again.
- If you want to rebase/retry this MR, check this box
This MR has been generated by Renovate Bot.
wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request
Pkgsrc changes:
- Adapt patches, one of the patched files were restructured upstream.
- Checksum changes.
Upstream changes:
Version 1.84.1 (2025-01-30)
- [Fix ICE 132920 in duplicate-crate diagnostics.] (rust-lang/rust#133304)
- [Fix errors for overlapping impls in incremental rebuilds.] (rust-lang/rust#133828)
- [Fix slow compilation related to the next-generation trait solver.] (rust-lang/rust#135618)
- [Fix debuginfo when LLVM's location discriminator value limit is exceeded.] (rust-lang/rust#135643)
- Fixes for building Rust from source:
- [Only try to distribute
llvm-objcopy
if llvm tools are enabled.] (rust-lang/rust#134240) - [Add Profile Override for Non-Git Sources.] (rust-lang/rust#135433)
- [Resolve symlinks of LLVM tool binaries before copying them.] (rust-lang/rust#135585)
- [Make it possible to use ci-rustc on tarball sources.] (rust-lang/rust#135722)
- [Only try to distribute
Version 1.84.0 (2025-01-09)
Language
- [Allow
#[deny]
inside#[forbid]
as a no-op] (rust-lang/rust#121560) - [Show a warning when
-Ctarget-feature
is used to toggle features that can lead to unsoundness due to ABI mismatches] (rust-lang/rust#129884) - [Use the next-generation trait solver in coherence] (rust-lang/rust#130654)
- [Allow coercions to drop the principal of trait objects] (rust-lang/rust#131857)
- [Support
/
as the path separator forinclude!()
in all cases on Windows] (rust-lang/rust#125205) - [Taking a raw ref (
raw (const|mut)
) of a deref of a pointer (*ptr
) is now safe] (rust-lang/rust#129248) - [Stabilize s390x inline assembly] (rust-lang/rust#131258)
- [Stabilize Arm64EC inline assembly] (rust-lang/rust#131781)
- [Lint against creating pointers to immediately dropped temporaries] (rust-lang/rust#128985)
- [Execute drop glue when unwinding in an
extern "C"
function] (rust-lang/rust#129582)
Compiler
- [Add
--print host-tuple
flag to print the host target tuple and affirm the "target tuple" terminology over "target triple"] (rust-lang/rust#125579) - [Declaring functions with a calling convention not supported on the current target now triggers a hard error] (rust-lang/rust#129935)
- [Set up indirect access to external data for
loongarch64-unknown-linux-{musl,ohos}
] (rust-lang/rust#131583) - [Enable XRay instrumentation for LoongArch Linux targets] (rust-lang/rust#131818)
- [Extend the
unexpected_cfgs
lint to also warn in external macros] (rust-lang/rust#132577) - [Stabilize WebAssembly
multivalue
,reference-types
, andtail-call
target features] (rust-lang/rust#131080) - [Added Tier 2 support for the
wasm32v1-none
target] (rust-lang/rust#131487)
Libraries
- [Implement
From<&mut {slice}>
forBox/Rc/Arc<{slice}>
] (rust-lang/rust#129329) - [Move
<float>::copysign
,<float>::abs
,<float>::signum
tocore
] (rust-lang/rust#131304) - [Add
LowerExp
andUpperExp
implementations toNonZero
] (rust-lang/rust#131377) - [Implement
FromStr
forCString
andTryFrom<CString>
forString
] (rust-lang/rust#130608) - [
std::os::darwin
has been made public] (rust-lang/rust#130635)
Stabilized APIs
- [
Ipv6Addr::is_unique_local
] (https://doc.rust-lang.org/stable/core/net/struct.Ipv6Addr.html#method.is_unique_local) - [
Ipv6Addr::is_unicast_link_local
] (https://doc.rust-lang.org/stable/core/net/struct.Ipv6Addr.html#method.is_unicast_link_local) - [
core::ptr::with_exposed_provenance
] (https://doc.rust-lang.org/stable/core/ptr/fn.with_exposed_provenance.html) - [
core::ptr::with_exposed_provenance_mut
] (https://doc.rust-lang.org/stable/core/ptr/fn.with_exposed_provenance_mut.html) - [
<ptr>::addr
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.addr) - [
<ptr>::expose_provenance
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.expose_provenance) - [
<ptr>::with_addr
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.with_addr) - [
<ptr>::map_addr
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.map_addr) - [
<int>::isqrt
] (https://doc.rust-lang.org/stable/core/primitive.i32.html#method.isqrt) - [
<int>::checked_isqrt
] (https://doc.rust-lang.org/stable/core/primitive.i32.html#method.checked_isqrt) - [
<uint>::isqrt
] (https://doc.rust-lang.org/stable/core/primitive.u32.html#method.isqrt) - [
NonZero::isqrt
] (https://doc.rust-lang.org/stable/core/num/struct.NonZero.html#impl-NonZero%3Cu128%3E/method.isqrt) - [
core::ptr::without_provenance
] (https://doc.rust-lang.org/stable/core/ptr/fn.without_provenance.html) - [
core::ptr::without_provenance_mut
] (https://doc.rust-lang.org/stable/core/ptr/fn.without_provenance_mut.html) - [
core::ptr::dangling
] (https://doc.rust-lang.org/stable/core/ptr/fn.dangling.html) - [
core::ptr::dangling_mut
] (https://doc.rust-lang.org/stable/core/ptr/fn.dangling_mut.html)
These APIs are now stable in const contexts
- [
AtomicBool::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicBool.html#method.from_ptr) - [
AtomicPtr::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicPtr.html#method.from_ptr) - [
AtomicU8::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicU8.html#method.from_ptr) - [
AtomicU16::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicU16.html#method.from_ptr) - [
AtomicU32::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicU32.html#method.from_ptr) - [
AtomicU64::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicU64.html#method.from_ptr) - [
AtomicUsize::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicUsize.html#method.from_ptr) - [
AtomicI8::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicI8.html#method.from_ptr) - [
AtomicI16::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicI16.html#method.from_ptr) - [
AtomicI32::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicI32.html#method.from_ptr) - [
AtomicI64::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicI64.html#method.from_ptr) - [
AtomicIsize::from_ptr
] (https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicIsize.html#method.from_ptr) - [
<ptr>::is_null
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.is_null-1) - [
<ptr>::as_ref
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.as_ref-1) - [
<ptr>::as_mut
] (https://doc.rust-lang.org/stable/core/primitive.pointer.html#method.as_mut) - [
Pin::new
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.new) - [
Pin::new_unchecked
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.new_unchecked) - [
Pin::get_ref
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.get_ref) - [
Pin::into_ref
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.into_ref) - [
Pin::get_mut
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.get_mut) - [
Pin::get_unchecked_mut
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.get_unchecked_mut) - [
Pin::static_ref
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.static_ref) - [
Pin::static_mut
] (https://doc.rust-lang.org/stable/core/pin/struct.Pin.html#method.static_mut)
Cargo
- [Stabilize MSRV-aware resolver config] (rust-lang/cargo#14639)
- [Stabilize resolver v3] (rust-lang/cargo#14754)
Rustdoc
- [rustdoc-search: improve type-driven search] (rust-lang/rust#127589)
Compatibility Notes
- [Enable by default the
LSX
target feature for LoongArch Linux targets] (rust-lang/rust#132140) - The unstable
-Zprofile
flag ("gcov-style" coverage instrumentation) has been removed. This does not affect the stable flags for coverage instrumentation (-Cinstrument-coverage
) and profile-guided optimization (-Cprofile-generate
,-Cprofile-use
), which are unrelated and remain available. - Support for the target named
wasm32-wasi
has been removed as the target is now namedwasm32-wasip1
. This completes the [transition] (rust-lang/compiler-team#607) plan for this target following [the introduction ofwasm32-wasip1
] (rust-lang/rust#120468) in Rust 1.78. Compiler warnings on [use ofwasm32-wasi
] (rust-lang/rust#126662) introduced in Rust 1.81 are now gone as well as the target is removed. - [The syntax
&pin (mut|const) T
is now parsed as a type which in theory could affect macro expansion results in some edge cases] (rust-lang/rust#130635 (comment)) - [Legacy syntax for calling
std::arch
functions is no longer permitted to declare items or bodies (such as closures, inline consts, or async blocks).] (rust-lang/rust#130443 (comment)) - The
wasm32-unknown-emscripten
target's binary release of the standard library is now [built with the latest emsdk 3.1.68] (rust-lang/rust#131533), which fixes an ABI-incompatibility with Emscripten >= 3.1.42. If you are locally using a version of emsdk with an incompatible ABI (e.g. before 3.1.42 or a future one), you should build your code with-Zbuild-std
to ensure thatstd
uses the correct ABI. - [Declaring functions with a calling convention not supported on the current target now triggers a hard error] (rust-lang/rust#129935)
- [The next-generation trait solver is now enabled for coherence, fixing multiple soundness issues] (rust-lang/rust#130654)
This was referenced
Feb 17, 2025
Labels
Area: port run-make Makefiles to rmake.rs
This issue / PR is in PFCP or FCP with a disposition to merge it.
The final comment period is finished for this PR / Issue.
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
Relevant to the language team, which will review and decide on the PR/issue.