about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume.gomez@huawei.com>2024-07-08 14:40:36 +0200
committerGuillaume Gomez <guillaume.gomez@huawei.com>2024-08-13 20:14:56 +0200
commit72aeffa78cccc8f368d6e8ad8027894e0b152f23 (patch)
treeb426ffe47a93ba3cb8c542e44d06c61eaba51698
parenta3bc2c74786631846554915c7e1295ee48f5be85 (diff)
downloadrust-72aeffa78cccc8f368d6e8ad8027894e0b152f23.tar.gz
rust-72aeffa78cccc8f368d6e8ad8027894e0b152f23.zip
Remove need for `unsafe` code in merged doctests
-rw-r--r--src/librustdoc/doctest/runner.rs15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/librustdoc/doctest/runner.rs b/src/librustdoc/doctest/runner.rs
index 5c0a7bcaef9..46122bbeafd 100644
--- a/src/librustdoc/doctest/runner.rs
+++ b/src/librustdoc/doctest/runner.rs
@@ -107,13 +107,16 @@ impl DocTestRunner {
 {output}
 
 mod __doctest_mod {{
-    pub static mut BINARY_PATH: Option<std::path::PathBuf> = None;
+    use std::sync::OnceLock;
+    use std::path::PathBuf;
+
+    pub static BINARY_PATH: OnceLock<PathBuf> = OnceLock::new();
     pub const RUN_OPTION: &str = \"*doctest-inner-test\";
     pub const BIN_OPTION: &str = \"*doctest-bin-path\";
 
     #[allow(unused)]
-    pub fn get_doctest_path() -> Option<&'static std::path::Path> {{
-        unsafe {{ self::BINARY_PATH.as_deref() }}
+    pub fn doctest_path() -> Option<&'static PathBuf> {{
+        self::BINARY_PATH.get()
     }}
 
     #[allow(unused)]
@@ -145,7 +148,9 @@ while let Some(arg) = args.next() {{
         let Some(binary) = args.next() else {{
             panic!(\"missing argument after `{{}}`\", __doctest_mod::BIN_OPTION);
         }};
-        unsafe {{ crate::__doctest_mod::BINARY_PATH = Some(binary.into()); }}
+        if crate::__doctest_mod::BINARY_PATH.set(binary.into()).is_err() {{
+            panic!(\"`{{}}` option was used more than once\", bin_marker.to_string_lossy());
+        }}
         return std::process::Termination::report(test::test_main(test_args, Vec::from(TESTS), None));
     }} else if arg == test_marker {{
         let Some(nb_test) = args.next() else {{
@@ -254,7 +259,7 @@ test::StaticTestFn(
         } else {
             format!(
                 "
-if let Some(bin_path) = crate::__doctest_mod::get_doctest_path() {{
+if let Some(bin_path) = crate::__doctest_mod::doctest_path() {{
     test::assert_test_result(crate::__doctest_mod::doctest_runner(bin_path, {id}))
 }} else {{
     test::assert_test_result(self::main())