From 2d678d695637ed1023fd80fea482d60a288e4343 Mon Sep 17 00:00:00 2001
From: Dario Nieuwenhuis <dirbaio@dirbaio.net>
Date: Thu, 25 Jul 2024 15:53:00 +0200
Subject: [PATCH] Update to Rust 1.80, make check-cfg unconditional.

---
 ci.sh                                |  6 ------
 embassy-executor/build_common.rs     | 21 +--------------------
 embassy-hal-internal/build_common.rs | 21 +--------------------
 embassy-rp/src/i2c.rs                | 18 ++++++------------
 embassy-stm32/build_common.rs        | 21 +--------------------
 embassy-stm32/src/adc/mod.rs         |  1 +
 embassy-stm32/src/opamp.rs           |  2 ++
 embassy-stm32/src/ospi/mod.rs        | 17 +++++------------
 embassy-stm32/src/spi/mod.rs         |  1 +
 embassy-sync/build_common.rs         | 21 +--------------------
 embassy-usb/src/msos.rs              |  2 ++
 rust-toolchain.toml                  |  2 +-
 12 files changed, 22 insertions(+), 111 deletions(-)

diff --git a/ci.sh b/ci.sh
index 341fe6a09..4c9397cee 100755
--- a/ci.sh
+++ b/ci.sh
@@ -10,12 +10,6 @@ if ! command -v cargo-batch &> /dev/null; then
     exit 1
 fi
 
-# check-cfg is stable on rustc 1.79 but not cargo 1.79.
-# however, our cargo-batch is currently based on cargo 1.80, which does support check-cfg.
-# so, force build.rs scripts to emit check-cfg commands.
-# when 1.80 hits stable we can make build.rs unconditionally emit check-cfg and remove all this.
-export EMBASSY_FORCE_CHECK_CFG=1  
-
 export RUSTFLAGS=-Dwarnings
 export DEFMT_LOG=trace,embassy_hal_internal=debug,embassy_net_esp_hosted=debug,cyw43=info,cyw43_pio=info,smoltcp=info
 if [[ -z "${CARGO_TARGET_DIR}" ]]; then
diff --git a/embassy-executor/build_common.rs b/embassy-executor/build_common.rs
index 0487eb3c5..4f24e6d37 100644
--- a/embassy-executor/build_common.rs
+++ b/embassy-executor/build_common.rs
@@ -8,8 +8,6 @@
 
 use std::collections::HashSet;
 use std::env;
-use std::ffi::OsString;
-use std::process::Command;
 
 /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
 /// them (`cargo:rust-check-cfg=cfg(X)`).
@@ -17,7 +15,6 @@ use std::process::Command;
 pub struct CfgSet {
     enabled: HashSet<String>,
     declared: HashSet<String>,
-    emit_declared: bool,
 }
 
 impl CfgSet {
@@ -25,7 +22,6 @@ impl CfgSet {
         Self {
             enabled: HashSet::new(),
             declared: HashSet::new(),
-            emit_declared: is_rustc_nightly(),
         }
     }
 
@@ -49,7 +45,7 @@ impl CfgSet {
     ///
     /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
     pub fn declare(&mut self, cfg: impl AsRef<str>) {
-        if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared {
+        if self.declared.insert(cfg.as_ref().to_owned()) {
             println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
         }
     }
@@ -69,21 +65,6 @@ impl CfgSet {
     }
 }
 
-fn is_rustc_nightly() -> bool {
-    if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
-        return true;
-    }
-
-    let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
-
-    let output = Command::new(rustc)
-        .arg("--version")
-        .output()
-        .expect("failed to run `rustc --version`");
-
-    String::from_utf8_lossy(&output.stdout).contains("nightly")
-}
-
 /// Sets configs that describe the target platform.
 pub fn set_target_cfgs(cfgs: &mut CfgSet) {
     let target = env::var("TARGET").unwrap();
diff --git a/embassy-hal-internal/build_common.rs b/embassy-hal-internal/build_common.rs
index 0487eb3c5..4f24e6d37 100644
--- a/embassy-hal-internal/build_common.rs
+++ b/embassy-hal-internal/build_common.rs
@@ -8,8 +8,6 @@
 
 use std::collections::HashSet;
 use std::env;
-use std::ffi::OsString;
-use std::process::Command;
 
 /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
 /// them (`cargo:rust-check-cfg=cfg(X)`).
@@ -17,7 +15,6 @@ use std::process::Command;
 pub struct CfgSet {
     enabled: HashSet<String>,
     declared: HashSet<String>,
-    emit_declared: bool,
 }
 
 impl CfgSet {
@@ -25,7 +22,6 @@ impl CfgSet {
         Self {
             enabled: HashSet::new(),
             declared: HashSet::new(),
-            emit_declared: is_rustc_nightly(),
         }
     }
 
@@ -49,7 +45,7 @@ impl CfgSet {
     ///
     /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
     pub fn declare(&mut self, cfg: impl AsRef<str>) {
-        if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared {
+        if self.declared.insert(cfg.as_ref().to_owned()) {
             println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
         }
     }
@@ -69,21 +65,6 @@ impl CfgSet {
     }
 }
 
-fn is_rustc_nightly() -> bool {
-    if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
-        return true;
-    }
-
-    let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
-
-    let output = Command::new(rustc)
-        .arg("--version")
-        .output()
-        .expect("failed to run `rustc --version`");
-
-    String::from_utf8_lossy(&output.stdout).contains("nightly")
-}
-
 /// Sets configs that describe the target platform.
 pub fn set_target_cfgs(cfgs: &mut CfgSet) {
     let target = env::var("TARGET").unwrap();
diff --git a/embassy-rp/src/i2c.rs b/embassy-rp/src/i2c.rs
index 10d3c86b3..ac2b1bc5a 100644
--- a/embassy-rp/src/i2c.rs
+++ b/embassy-rp/src/i2c.rs
@@ -312,13 +312,13 @@ impl<'d, T: Instance> I2c<'d, T, Async> {
         }
     }
 
-    /// Read from address into buffer using DMA.
+    /// Read from address into buffer asynchronously.
     pub async fn read_async(&mut self, addr: impl Into<u16>, buffer: &mut [u8]) -> Result<(), Error> {
         Self::setup(addr.into())?;
         self.read_async_internal(buffer, true, true).await
     }
 
-    /// Write to address from buffer using DMA.
+    /// Write to address from buffer asynchronously.
     pub async fn write_async(
         &mut self,
         addr: impl Into<u16>,
@@ -328,7 +328,7 @@ impl<'d, T: Instance> I2c<'d, T, Async> {
         self.write_async_internal(bytes, true).await
     }
 
-    /// Write to address from bytes and read from address into buffer using DMA.
+    /// Write to address from bytes and read from address into buffer asynchronously.
     pub async fn write_read_async(
         &mut self,
         addr: impl Into<u16>,
@@ -779,9 +779,6 @@ pub fn i2c_reserved_addr(addr: u16) -> bool {
 }
 
 pub(crate) trait SealedInstance {
-    const TX_DREQ: u8;
-    const RX_DREQ: u8;
-
     fn regs() -> crate::pac::i2c::I2c;
     fn reset() -> crate::pac::resets::regs::Peripherals;
     fn waker() -> &'static AtomicWaker;
@@ -816,11 +813,8 @@ pub trait Instance: SealedInstance {
 }
 
 macro_rules! impl_instance {
-    ($type:ident, $irq:ident, $reset:ident, $tx_dreq:expr, $rx_dreq:expr) => {
+    ($type:ident, $irq:ident, $reset:ident) => {
         impl SealedInstance for peripherals::$type {
-            const TX_DREQ: u8 = $tx_dreq;
-            const RX_DREQ: u8 = $rx_dreq;
-
             #[inline]
             fn regs() -> pac::i2c::I2c {
                 pac::$type
@@ -846,8 +840,8 @@ macro_rules! impl_instance {
     };
 }
 
-impl_instance!(I2C0, I2C0_IRQ, set_i2c0, 32, 33);
-impl_instance!(I2C1, I2C1_IRQ, set_i2c1, 34, 35);
+impl_instance!(I2C0, I2C0_IRQ, set_i2c0);
+impl_instance!(I2C1, I2C1_IRQ, set_i2c1);
 
 /// SDA pin.
 pub trait SdaPin<T: Instance>: crate::gpio::Pin {}
diff --git a/embassy-stm32/build_common.rs b/embassy-stm32/build_common.rs
index 0487eb3c5..4f24e6d37 100644
--- a/embassy-stm32/build_common.rs
+++ b/embassy-stm32/build_common.rs
@@ -8,8 +8,6 @@
 
 use std::collections::HashSet;
 use std::env;
-use std::ffi::OsString;
-use std::process::Command;
 
 /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
 /// them (`cargo:rust-check-cfg=cfg(X)`).
@@ -17,7 +15,6 @@ use std::process::Command;
 pub struct CfgSet {
     enabled: HashSet<String>,
     declared: HashSet<String>,
-    emit_declared: bool,
 }
 
 impl CfgSet {
@@ -25,7 +22,6 @@ impl CfgSet {
         Self {
             enabled: HashSet::new(),
             declared: HashSet::new(),
-            emit_declared: is_rustc_nightly(),
         }
     }
 
@@ -49,7 +45,7 @@ impl CfgSet {
     ///
     /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
     pub fn declare(&mut self, cfg: impl AsRef<str>) {
-        if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared {
+        if self.declared.insert(cfg.as_ref().to_owned()) {
             println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
         }
     }
@@ -69,21 +65,6 @@ impl CfgSet {
     }
 }
 
-fn is_rustc_nightly() -> bool {
-    if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
-        return true;
-    }
-
-    let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
-
-    let output = Command::new(rustc)
-        .arg("--version")
-        .output()
-        .expect("failed to run `rustc --version`");
-
-    String::from_utf8_lossy(&output.stdout).contains("nightly")
-}
-
 /// Sets configs that describe the target platform.
 pub fn set_target_cfgs(cfgs: &mut CfgSet) {
     let target = env::var("TARGET").unwrap();
diff --git a/embassy-stm32/src/adc/mod.rs b/embassy-stm32/src/adc/mod.rs
index 7a7d7cd8e..26b729f70 100644
--- a/embassy-stm32/src/adc/mod.rs
+++ b/embassy-stm32/src/adc/mod.rs
@@ -2,6 +2,7 @@
 
 #![macro_use]
 #![allow(missing_docs)] // TODO
+#![cfg_attr(adc_f3_v2, allow(unused))]
 
 #[cfg(not(adc_f3_v2))]
 #[cfg_attr(adc_f1, path = "f1.rs")]
diff --git a/embassy-stm32/src/opamp.rs b/embassy-stm32/src/opamp.rs
index ca94a573d..789176b3d 100644
--- a/embassy-stm32/src/opamp.rs
+++ b/embassy-stm32/src/opamp.rs
@@ -45,6 +45,7 @@ pub struct OpAmpOutput<'d, T: Instance> {
 /// OpAmp internal outputs, wired directly to ADC inputs.
 ///
 /// This struct can be used as an ADC input.
+#[cfg(opamp_g4)]
 pub struct OpAmpInternalOutput<'d, T: Instance> {
     _inner: &'d OpAmp<'d, T>,
 }
@@ -184,6 +185,7 @@ impl<'d, T: Instance> Drop for OpAmpOutput<'d, T> {
     }
 }
 
+#[cfg(opamp_g4)]
 impl<'d, T: Instance> Drop for OpAmpInternalOutput<'d, T> {
     fn drop(&mut self) {
         T::regs().csr().modify(|w| {
diff --git a/embassy-stm32/src/ospi/mod.rs b/embassy-stm32/src/ospi/mod.rs
index f6eb0d17c..289bfa672 100644
--- a/embassy-stm32/src/ospi/mod.rs
+++ b/embassy-stm32/src/ospi/mod.rs
@@ -1060,10 +1060,6 @@ pub(crate) trait SealedInstance {
     const REGS: Regs;
 }
 
-trait SealedWord {
-    const CONFIG: u8;
-}
-
 /// OSPI instance trait.
 #[allow(private_bounds)]
 pub trait Instance: Peripheral<P = Self> + SealedInstance + RccPeripheral {}
@@ -1110,17 +1106,14 @@ impl<'d, T: Instance, M: PeriMode> GetConfig for Ospi<'d, T, M> {
 
 /// Word sizes usable for OSPI.
 #[allow(private_bounds)]
-pub trait Word: word::Word + SealedWord {}
+pub trait Word: word::Word {}
 
 macro_rules! impl_word {
-    ($T:ty, $config:expr) => {
-        impl SealedWord for $T {
-            const CONFIG: u8 = $config;
-        }
+    ($T:ty) => {
         impl Word for $T {}
     };
 }
 
-impl_word!(u8, 8);
-impl_word!(u16, 16);
-impl_word!(u32, 32);
+impl_word!(u8);
+impl_word!(u16);
+impl_word!(u32);
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs
index 656676d9f..20718147a 100644
--- a/embassy-stm32/src/spi/mod.rs
+++ b/embassy-stm32/src/spi/mod.rs
@@ -1282,6 +1282,7 @@ pub(crate) struct Info {
 struct State {}
 
 impl State {
+    #[allow(unused)]
     const fn new() -> Self {
         Self {}
     }
diff --git a/embassy-sync/build_common.rs b/embassy-sync/build_common.rs
index 0487eb3c5..4f24e6d37 100644
--- a/embassy-sync/build_common.rs
+++ b/embassy-sync/build_common.rs
@@ -8,8 +8,6 @@
 
 use std::collections::HashSet;
 use std::env;
-use std::ffi::OsString;
-use std::process::Command;
 
 /// Helper for emitting cargo instruction for enabling configs (`cargo:rustc-cfg=X`) and declaring
 /// them (`cargo:rust-check-cfg=cfg(X)`).
@@ -17,7 +15,6 @@ use std::process::Command;
 pub struct CfgSet {
     enabled: HashSet<String>,
     declared: HashSet<String>,
-    emit_declared: bool,
 }
 
 impl CfgSet {
@@ -25,7 +22,6 @@ impl CfgSet {
         Self {
             enabled: HashSet::new(),
             declared: HashSet::new(),
-            emit_declared: is_rustc_nightly(),
         }
     }
 
@@ -49,7 +45,7 @@ impl CfgSet {
     ///
     /// This enables rustc to check that the configs in `#[cfg(...)]` attributes are valid.
     pub fn declare(&mut self, cfg: impl AsRef<str>) {
-        if self.declared.insert(cfg.as_ref().to_owned()) && self.emit_declared {
+        if self.declared.insert(cfg.as_ref().to_owned()) {
             println!("cargo:rustc-check-cfg=cfg({})", cfg.as_ref());
         }
     }
@@ -69,21 +65,6 @@ impl CfgSet {
     }
 }
 
-fn is_rustc_nightly() -> bool {
-    if env::var_os("EMBASSY_FORCE_CHECK_CFG").is_some() {
-        return true;
-    }
-
-    let rustc = env::var_os("RUSTC").unwrap_or_else(|| OsString::from("rustc"));
-
-    let output = Command::new(rustc)
-        .arg("--version")
-        .output()
-        .expect("failed to run `rustc --version`");
-
-    String::from_utf8_lossy(&output.stdout).contains("nightly")
-}
-
 /// Sets configs that describe the target platform.
 pub fn set_target_cfgs(cfgs: &mut CfgSet) {
     let target = env::var("TARGET").unwrap();
diff --git a/embassy-usb/src/msos.rs b/embassy-usb/src/msos.rs
index 25936d084..9f4e1a57b 100644
--- a/embassy-usb/src/msos.rs
+++ b/embassy-usb/src/msos.rs
@@ -278,6 +278,7 @@ pub enum DescriptorType {
 
 /// Table 5. Descriptor set information structure.
 #[allow(non_snake_case)]
+#[allow(unused)]
 #[repr(C, packed(1))]
 pub struct DescriptorSetInformation {
     dwWindowsVersion: u32,
@@ -288,6 +289,7 @@ pub struct DescriptorSetInformation {
 
 /// Table 4. Microsoft OS 2.0 platform capability descriptor header.
 #[allow(non_snake_case)]
+#[allow(unused)]
 #[repr(C, packed(1))]
 pub struct PlatformDescriptor {
     bLength: u8,
diff --git a/rust-toolchain.toml b/rust-toolchain.toml
index 037fc5c6a..ce9040a70 100644
--- a/rust-toolchain.toml
+++ b/rust-toolchain.toml
@@ -1,5 +1,5 @@
 [toolchain]
-channel = "1.79"
+channel = "1.80"
 components = [ "rust-src", "rustfmt", "llvm-tools" ]
 targets = [
     "thumbv7em-none-eabi",