Change:
<!-- Thank you for filing a regression report! A regression is something that changed between versions of Rust but was not supposed to. Please provide a short summary of the regression, along with any information you feel is relevant to replicate it. --Building std library (-Zbuild-std) with nightly for uwp-windows-msvc targets has been failing with compile errors since around after 17/10/22 I expected to see this happen: Last successeful build on 16/10: Instead, this happened: Lastest failed build: It most recently worked on: rustc 1.66.0-nightly ( 2022-10-14) : <!-- Did the compiler crash? If so, please provide a backtrace. --<!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summaryBacktrace</summary<p</p</details<!-- If you know when this regression occurred, please add a line like below, replacing with one of stable, beta, or nightly. modify labels: +regression-from-stable-to-{channel} -regression-untriaged --
Hey, is anyone looking into this because ALXR ci (uwp) builds are failing for over a week. Should this issue be posted in another repo?
This is the right repo, but it fell through the cracks for whatever reason. I can get to it this weekend.
Thank you :)
Oh, sorry I missed this! Since 10.0. console functions are available on UWP (see ). So I think the thing to do here is to simply stop making the function conditionally imported.

Discussion:
pub type LPSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES; pub type LPSTARTUPINFO = *mut STARTUPINFO; pub type LPVOID = *mut c_void; <ins> pub type LPCVOID = *const c_void; </ins> pub type LPWCH = *mut WCHAR; pub type LPWIN32_FIND_DATAW = *mut WIN32_FIND_DATAW; pub type LPWSADATA = *mut WSADATA;

pub tv_usec: c_long, } <ins> #[repr(C)] #[derive(Copy, Clone)] pub struct CONSOLE_READCONSOLE_CONTROL { pub nLength: ULONG, pub nInitialChars: ULONG, pub dwCtrlWakeupMask: ULONG, pub dwControlKeyState: ULONG, } pub type PCONSOLE_READCONSOLE_CONTROL = *mut CONSOLE_READCONSOLE_CONTROL; </ins> // Desktop specific functions & types cfg_if::cfg_if! { if #[cfg(not(target_vendor = "uwp"))] {

extern "system" fn(ExceptionInfo: *mut EXCEPTION_POINTERS) -> LONG; #[repr(C)] <del> #[derive(Copy, Clone)] pub struct CONSOLE_READCONSOLE_CONTROL { pub nLength: ULONG, pub nInitialChars: ULONG, pub dwCtrlWakeupMask: ULONG, pub dwControlKeyState: ULONG, } pub type PCONSOLE_READCONSOLE_CONTROL = *mut CONSOLE_READCONSOLE_CONTROL; #[repr(C)] </del> pub struct BY_HANDLE_FILE_INFORMATION { pub dwFileAttributes: DWORD, pub ftCreationTime: FILETIME,

} pub type LPBY_HANDLE_FILE_INFORMATION = *mut BY_HANDLE_FILE_INFORMATION; <del> pub type LPCVOID = *const c_void; </del> pub const HANDLE_FLAG_INHERIT: DWORD = 0x00000001;

#[link(name = "kernel32")] extern "system" { <del> // Functions forbidden when targeting UWP pub fn ReadConsoleW( hConsoleInput: HANDLE, lpBuffer: LPVOID, nNumberOfCharsToRead: DWORD, lpNumberOfCharsRead: LPDWORD, pInputControl: PCONSOLE_READCONSOLE_CONTROL, ) -> BOOL; pub fn WriteConsoleW( hConsoleOutput: HANDLE, lpBuffer: LPCVOID, nNumberOfCharsToWrite: DWORD, lpNumberOfCharsWritten: LPDWORD, lpReserved: LPVOID, ) -> BOOL; pub fn GetConsoleMode(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL; </del> // Allowed but unused by UWP pub fn GetFileInformationByHandle( hFile: HANDLE,

extern "system" { pub fn GetCurrentProcessId() -> DWORD; <ins> pub fn ReadConsoleW( hConsoleInput: HANDLE, lpBuffer: LPVOID, nNumberOfCharsToRead: DWORD, lpNumberOfCharsRead: LPDWORD, pInputControl: PCONSOLE_READCONSOLE_CONTROL, ) -> BOOL; pub fn WriteConsoleW( hConsoleOutput: HANDLE, lpBuffer: LPCVOID, nNumberOfCharsToWrite: DWORD, lpNumberOfCharsWritten: LPDWORD, lpReserved: LPVOID, ) -> BOOL; pub fn GetConsoleMode(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL; </ins> pub fn GetSystemDirectoryW(lpBuffer: LPWSTR, uSize: UINT) -> UINT; pub fn RemoveDirectoryW(lpPathName: LPCWSTR) -> BOOL; pub fn SetFileAttributesW(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL;

pub mod pipe; pub mod process; pub mod rand; <ins> pub mod stdio; </ins> pub mod thread; pub mod thread_local_dtor; pub mod thread_local_key;

pub mod time; cfg_if::cfg_if! { if #[cfg(not(target_vendor = "uwp"))] { <del> pub mod stdio; </del> pub mod stack_overflow; } else { <del> pub mod stdio_uwp; </del> pub mod stack_overflow_uwp; <del> pub use self::stdio_uwp as stdio; </del> pub use self::stack_overflow_uwp as stack_overflow; } }

<del> #![unstable(issue = "none", feature = "windows_stdio")] use crate::io; use crate::mem::ManuallyDrop; use crate::os::windows::io::FromRawHandle; use crate::sys::c; use crate::sys::handle::Handle; pub struct Stdin {} pub struct Stdout; pub struct Stderr; const MAX_BUFFER_SIZE: usize = 8192; pub const STDIN_BUF_SIZE: usize = MAX_BUFFER_SIZE / 2 * 3; pub fn get_handle(handle_id: c::DWORD) -> io::Result<c::HANDLE> { let handle = unsafe { c::GetStdHandle(handle_id) }; if handle == c::INVALID_HANDLE_VALUE { Err(io::Error::last_os_error()) } else if handle.is_null() { Err(io::Error::from_raw_os_error(c::ERROR_INVALID_HANDLE as i32)) } else { Ok(handle) } } fn write(handle_id: c::DWORD, data: &[u8]) -> io::Result<usize> { let handle = get_handle(handle_id)?; // SAFETY: The handle returned from `get_handle` must be valid and non-null. let handle = unsafe { Handle::from_raw_handle(handle) }; ManuallyDrop::new(handle).write(data) } impl Stdin { pub const fn new() -> Stdin { Stdin {} } } impl io::Read for Stdin { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { let handle = get_handle(c::STD_INPUT_HANDLE)?; // SAFETY: The handle returned from `get_handle` must be valid and non-null. let handle = unsafe { Handle::from_raw_handle(handle) }; ManuallyDrop::new(handle).read(buf) } } impl Stdout { pub const fn new() -> Stdout { Stdout } } impl io::Write for Stdout { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { write(c::STD_OUTPUT_HANDLE, buf) } fn flush(&mut self) -> io::Result<()> { Ok(()) } } impl Stderr { pub const fn new() -> Stderr { Stderr } } impl io::Write for Stderr { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { write(c::STD_ERROR_HANDLE, buf) } fn flush(&mut self) -> io::Result<()> { Ok(()) } } pub fn is_ebadf(err: &io::Error) -> bool { err.raw_os_error() == Some(c::ERROR_INVALID_HANDLE as i32) } pub fn panic_output() -> Option<impl io::Write> { Some(Stderr::new()) } </del>