about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-06-10 15:49:43 +0000
committerbors <bors@rust-lang.org>2023-06-10 15:49:43 +0000
commitef8ee73fc4ff70a426e71f900441f040db252dae (patch)
treea08e863beffc8590c28675d4feb73a80ba6d1c58
parent788c98df5995c9fe360ba9ba5efb103ee69d05c4 (diff)
parent68e162d3643516240b6b1fd2e6ba27e4fd8c091a (diff)
downloadrust-ef8ee73fc4ff70a426e71f900441f040db252dae.tar.gz
rust-ef8ee73fc4ff70a426e71f900441f040db252dae.zip
Auto merge of #112494 - matthiaskrgr:rollup-xdf3om8, r=matthiaskrgr
Rollup of 5 pull requests

Successful merges:

 - #112297 (bootstrap: Disallow `--exclude test::std`)
 - #112298 (Update field-offset and enable unstable_offset_of)
 - #112335 (ci: Upgrade loongarch64-linux-gnu GCC to 13.1.0)
 - #112413 (Adjust span labels for `HIDDEN_GLOB_REEXPORTS`)
 - #112483 (Add deprecation warning to python versions <3.6 in x.py)

r? `@ghost`
`@rustbot` modify labels: rollup
-rw-r--r--Cargo.lock19
-rw-r--r--compiler/rustc_lint/src/context.rs4
-rw-r--r--compiler/rustc_query_impl/Cargo.toml4
-rw-r--r--src/bootstrap/CHANGELOG.md1
-rw-r--r--src/bootstrap/builder.rs45
-rw-r--r--src/bootstrap/builder/tests.rs37
-rw-r--r--src/bootstrap/config.rs5
-rw-r--r--src/bootstrap/test.rs2
-rw-r--r--src/ci/docker/README.md2
-rw-r--r--src/ci/docker/scripts/crosstool-ng-git.sh2
-rw-r--r--tests/ui/resolve/hidden_glob_reexports.rs4
-rw-r--r--tests/ui/resolve/hidden_glob_reexports.stderr45
-rwxr-xr-xx.py20
13 files changed, 104 insertions, 86 deletions
diff --git a/Cargo.lock b/Cargo.lock
index dbe39a6f521..ef6b0a5959f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -848,7 +848,7 @@ dependencies = [
  "autocfg",
  "cfg-if",
  "crossbeam-utils",
- "memoffset",
+ "memoffset 0.8.0",
  "scopeguard",
 ]
 
@@ -1193,11 +1193,11 @@ dependencies = [
 
 [[package]]
 name = "field-offset"
-version = "0.3.5"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3cf3a800ff6e860c863ca6d4b16fd999db8b752819c1606884047b73e468535"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
 dependencies = [
- "memoffset",
+ "memoffset 0.9.0",
  "rustc_version",
 ]
 
@@ -2146,6 +2146,15 @@ dependencies = [
 ]
 
 [[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
 name = "mime"
 version = "0.3.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3976,7 +3985,7 @@ version = "0.0.0"
 dependencies = [
  "field-offset",
  "measureme",
- "memoffset",
+ "memoffset 0.9.0",
  "rustc-rayon-core",
  "rustc_ast",
  "rustc_data_structures",
diff --git a/compiler/rustc_lint/src/context.rs b/compiler/rustc_lint/src/context.rs
index 947530a1b65..13164b0b339 100644
--- a/compiler/rustc_lint/src/context.rs
+++ b/compiler/rustc_lint/src/context.rs
@@ -953,8 +953,8 @@ pub trait LintContext: Sized {
                     db.span_label(duplicate_reexport_span, format!("but the name `{}` in the {} namespace is also re-exported here", name, namespace));
                 }
                 BuiltinLintDiagnostics::HiddenGlobReexports { name, namespace, glob_reexport_span, private_item_span } => {
-                    db.span_label(glob_reexport_span, format!("the name `{}` in the {} namespace is supposed to be publicly re-exported here", name, namespace));
-                    db.span_label(private_item_span, "but the private item here shadows it");
+                    db.span_note(glob_reexport_span, format!("the name `{}` in the {} namespace is supposed to be publicly re-exported here", name, namespace));
+                    db.span_note(private_item_span, "but the private item here shadows it".to_owned());
                 }
             }
             // Rewrap `db`, and pass control to the user.
diff --git a/compiler/rustc_query_impl/Cargo.toml b/compiler/rustc_query_impl/Cargo.toml
index c9353b6fc9f..ac697a3ae3e 100644
--- a/compiler/rustc_query_impl/Cargo.toml
+++ b/compiler/rustc_query_impl/Cargo.toml
@@ -7,7 +7,6 @@ edition = "2021"
 
 
 [dependencies]
-memoffset = { version = "0.8.0", features = ["unstable_const"] }
 field-offset = "0.3.5"
 measureme = "10.0.0"
 rustc_ast = { path = "../rustc_ast" }
@@ -25,5 +24,8 @@ rustc_span = { path = "../rustc_span" }
 thin-vec = "0.2.12"
 tracing = "0.1"
 
+# Not used directly, but included to enable the unstable_offset_of feature
+memoffset = { version = "0.9.0", features = ["unstable_offset_of"] }
+
 [features]
 rustc_use_parallel_compiler = ["rustc-rayon-core", "rustc_query_system/rustc_use_parallel_compiler"]
diff --git a/src/bootstrap/CHANGELOG.md b/src/bootstrap/CHANGELOG.md
index d6924cf2cfb..1aba0713850 100644
--- a/src/bootstrap/CHANGELOG.md
+++ b/src/bootstrap/CHANGELOG.md
@@ -18,6 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - `x.py fmt` now formats only files modified between the merge-base of HEAD and the last commit in the master branch of the rust-lang repository and the current working directory. To restore old behaviour, use `x.py fmt .`. The check mode is not affected by this change. [#105702](https://github.com/rust-lang/rust/pull/105702)
 - The `llvm.version-check` config option has been removed. Older versions were never supported. If you still need to support older versions (e.g. you are applying custom patches), patch `check_llvm_version` in bootstrap to change the minimum version. [#108619](https://github.com/rust-lang/rust/pull/108619)
 - The `rust.ignore-git` option has been renamed to `rust.omit-git-hash`. [#110059](https://github.com/rust-lang/rust/pull/110059)
+- `--exclude` no longer accepts a `Kind` as part of a Step; instead it uses the top-level Kind of the subcommand. If this matches how you were already using --exclude (e.g. `x test --exclude test::std`), simply remove the kind: `--exclude std`. If you were using a kind that did not match the top-level subcommand, please open an issue explaining why you wanted this feature.
 
 ### Non-breaking changes
 
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
index 0be59cab48b..ea1b34812e5 100644
--- a/src/bootstrap/builder.rs
+++ b/src/bootstrap/builder.rs
@@ -8,7 +8,7 @@ use std::fs::{self, File};
 use std::hash::Hash;
 use std::io::{BufRead, BufReader};
 use std::ops::Deref;
-use std::path::{Component, Path, PathBuf};
+use std::path::{Path, PathBuf};
 use std::process::Command;
 use std::time::{Duration, Instant};
 
@@ -150,29 +150,6 @@ pub struct TaskPath {
     pub kind: Option<Kind>,
 }
 
-impl TaskPath {
-    pub fn parse(path: impl Into<PathBuf>) -> TaskPath {
-        let mut kind = None;
-        let mut path = path.into();
-
-        let mut components = path.components();
-        if let Some(Component::Normal(os_str)) = components.next() {
-            if let Some(str) = os_str.to_str() {
-                if let Some((found_kind, found_prefix)) = str.split_once("::") {
-                    if found_kind.is_empty() {
-                        panic!("empty kind in task path {}", path.display());
-                    }
-                    kind = Kind::parse(found_kind);
-                    assert!(kind.is_some());
-                    path = Path::new(found_prefix).join(components.as_path());
-                }
-            }
-        }
-
-        TaskPath { path, kind }
-    }
-}
-
 impl Debug for TaskPath {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         if let Some(kind) = &self.kind {
@@ -216,7 +193,7 @@ impl PathSet {
         PathSet::Set(set)
     }
 
-    fn has(&self, needle: &Path, module: Option<Kind>) -> bool {
+    fn has(&self, needle: &Path, module: Kind) -> bool {
         match self {
             PathSet::Set(set) => set.iter().any(|p| Self::check(p, needle, module)),
             PathSet::Suite(suite) => Self::check(suite, needle, module),
@@ -224,9 +201,9 @@ impl PathSet {
     }
 
     // internal use only
-    fn check(p: &TaskPath, needle: &Path, module: Option<Kind>) -> bool {
-        if let (Some(p_kind), Some(kind)) = (&p.kind, module) {
-            p.path.ends_with(needle) && *p_kind == kind
+    fn check(p: &TaskPath, needle: &Path, module: Kind) -> bool {
+        if let Some(p_kind) = &p.kind {
+            p.path.ends_with(needle) && *p_kind == module
         } else {
             p.path.ends_with(needle)
         }
@@ -238,11 +215,7 @@ impl PathSet {
     /// This is used for `StepDescription::krate`, which passes all matching crates at once to
     /// `Step::make_run`, rather than calling it many times with a single crate.
     /// See `tests.rs` for examples.
-    fn intersection_removing_matches(
-        &self,
-        needles: &mut Vec<&Path>,
-        module: Option<Kind>,
-    ) -> PathSet {
+    fn intersection_removing_matches(&self, needles: &mut Vec<&Path>, module: Kind) -> PathSet {
         let mut check = |p| {
             for (i, n) in needles.iter().enumerate() {
                 let matched = Self::check(p, n, module);
@@ -307,7 +280,7 @@ impl StepDescription {
     }
 
     fn is_excluded(&self, builder: &Builder<'_>, pathset: &PathSet) -> bool {
-        if builder.config.exclude.iter().any(|e| pathset.has(&e.path, e.kind)) {
+        if builder.config.exclude.iter().any(|e| pathset.has(&e, builder.kind)) {
             println!("Skipping {:?} because it is excluded", pathset);
             return true;
         }
@@ -562,7 +535,7 @@ impl<'a> ShouldRun<'a> {
     ) -> Vec<PathSet> {
         let mut sets = vec![];
         for pathset in &self.paths {
-            let subset = pathset.intersection_removing_matches(paths, Some(kind));
+            let subset = pathset.intersection_removing_matches(paths, kind);
             if subset != PathSet::empty() {
                 sets.push(subset);
             }
@@ -2138,7 +2111,7 @@ impl<'a> Builder<'a> {
         let should_run = (desc.should_run)(ShouldRun::new(self, desc.kind));
 
         for path in &self.paths {
-            if should_run.paths.iter().any(|s| s.has(path, Some(desc.kind)))
+            if should_run.paths.iter().any(|s| s.has(path, desc.kind))
                 && !desc.is_excluded(
                     self,
                     &PathSet::Suite(TaskPath { path: path.clone(), kind: Some(desc.kind) }),
diff --git a/src/bootstrap/builder/tests.rs b/src/bootstrap/builder/tests.rs
index d76b830b0e5..31dcee58216 100644
--- a/src/bootstrap/builder/tests.rs
+++ b/src/bootstrap/builder/tests.rs
@@ -101,23 +101,21 @@ fn test_invalid() {
 
 #[test]
 fn test_intersection() {
-    let set = PathSet::Set(
-        ["library/core", "library/alloc", "library/std"].into_iter().map(TaskPath::parse).collect(),
-    );
+    let set = |paths: &[&str]| {
+        PathSet::Set(paths.into_iter().map(|p| TaskPath { path: p.into(), kind: None }).collect())
+    };
+    let library_set = set(&["library/core", "library/alloc", "library/std"]);
     let mut command_paths =
         vec![Path::new("library/core"), Path::new("library/alloc"), Path::new("library/stdarch")];
-    let subset = set.intersection_removing_matches(&mut command_paths, None);
-    assert_eq!(
-        subset,
-        PathSet::Set(["library/core", "library/alloc"].into_iter().map(TaskPath::parse).collect())
-    );
+    let subset = library_set.intersection_removing_matches(&mut command_paths, Kind::Build);
+    assert_eq!(subset, set(&["library/core", "library/alloc"]),);
     assert_eq!(command_paths, vec![Path::new("library/stdarch")]);
 }
 
 #[test]
 fn test_exclude() {
     let mut config = configure("test", &["A"], &["A"]);
-    config.exclude = vec![TaskPath::parse("src/tools/tidy")];
+    config.exclude = vec!["src/tools/tidy".into()];
     let cache = run_build(&[], config);
 
     // Ensure we have really excluded tidy
@@ -129,21 +127,16 @@ fn test_exclude() {
 
 #[test]
 fn test_exclude_kind() {
-    let path = PathBuf::from("src/tools/cargotest");
-    let exclude = TaskPath::parse("test::src/tools/cargotest");
-    assert_eq!(exclude, TaskPath { kind: Some(Kind::Test), path: path.clone() });
+    let path = PathBuf::from("compiler/rustc_data_structures");
 
     let mut config = configure("test", &["A"], &["A"]);
-    // Ensure our test is valid, and `test::Cargotest` would be run without the exclude.
-    assert!(run_build(&[path.clone()], config.clone()).contains::<test::Cargotest>());
-    // Ensure tests for cargotest are skipped.
-    config.exclude = vec![exclude.clone()];
-    assert!(!run_build(&[path.clone()], config).contains::<test::Cargotest>());
-
-    // Ensure builds for cargotest are not skipped.
-    let mut config = configure("build", &["A"], &["A"]);
-    config.exclude = vec![exclude];
-    assert!(run_build(&[path], config).contains::<tool::CargoTest>());
+    // Ensure our test is valid, and `test::Rustc` would be run without the exclude.
+    assert!(run_build(&[], config.clone()).contains::<test::CrateLibrustc>());
+    // Ensure tests for rustc are skipped.
+    config.exclude = vec![path.clone()];
+    assert!(!run_build(&[], config.clone()).contains::<test::CrateLibrustc>());
+    // Ensure builds for rustc are not skipped.
+    assert!(run_build(&[], config).contains::<compile::Rustc>());
 }
 
 /// Ensure that if someone passes both a single crate and `library`, all library crates get built.
diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs
index 2bc8441759f..c59df7eecf6 100644
--- a/src/bootstrap/config.rs
+++ b/src/bootstrap/config.rs
@@ -17,7 +17,6 @@ use std::path::{Path, PathBuf};
 use std::process::Command;
 use std::str::FromStr;
 
-use crate::builder::TaskPath;
 use crate::cache::{Interned, INTERNER};
 use crate::cc_detect::{ndk_compiler, Language};
 use crate::channel::{self, GitInfo};
@@ -80,7 +79,7 @@ pub struct Config {
     pub sanitizers: bool,
     pub profiler: bool,
     pub omit_git_hash: bool,
-    pub exclude: Vec<TaskPath>,
+    pub exclude: Vec<PathBuf>,
     pub include_default_paths: bool,
     pub rustc_error_format: Option<String>,
     pub json_output: bool,
@@ -957,7 +956,7 @@ impl Config {
 
         // Set flags.
         config.paths = std::mem::take(&mut flags.paths);
-        config.exclude = flags.exclude.into_iter().map(|path| TaskPath::parse(path)).collect();
+        config.exclude = flags.exclude;
         config.include_default_paths = flags.include_default_paths;
         config.rustc_error_format = flags.rustc_error_format;
         config.json_output = flags.json_output;
diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs
index 8f7294e438a..8af0565cd38 100644
--- a/src/bootstrap/test.rs
+++ b/src/bootstrap/test.rs
@@ -1537,7 +1537,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
 
         for exclude in &builder.config.exclude {
             cmd.arg("--skip");
-            cmd.arg(&exclude.path);
+            cmd.arg(&exclude);
         }
 
         // Get paths from cmd args
diff --git a/src/ci/docker/README.md b/src/ci/docker/README.md
index e799d7c9688..852f2e20935 100644
--- a/src/ci/docker/README.md
+++ b/src/ci/docker/README.md
@@ -270,7 +270,7 @@ For targets: `loongarch64-unknown-linux-gnu`
 - Operating System > Linux kernel version = 5.19.16
 - Binary utilities > Version of binutils = 2.40
 - C-library > glibc version = 2.36
-- C compiler > gcc version = 12.2.0
+- C compiler > gcc version = 13.1.0
 - C compiler > C++ = ENABLE -- to cross compile LLVM
 
 ### `mips-linux-gnu.defconfig`
diff --git a/src/ci/docker/scripts/crosstool-ng-git.sh b/src/ci/docker/scripts/crosstool-ng-git.sh
index 449cc476f9a..b8d39915327 100644
--- a/src/ci/docker/scripts/crosstool-ng-git.sh
+++ b/src/ci/docker/scripts/crosstool-ng-git.sh
@@ -2,7 +2,7 @@
 set -ex
 
 URL=https://github.com/crosstool-ng/crosstool-ng
-REV=943364711a650d9b9e84c1b42c91cc0265b6ab5c
+REV=227d99d7f3115f3a078595a580d2b307dcd23e93
 
 mkdir crosstool-ng
 cd crosstool-ng
diff --git a/tests/ui/resolve/hidden_glob_reexports.rs b/tests/ui/resolve/hidden_glob_reexports.rs
index 361243fcd7b..102b5656245 100644
--- a/tests/ui/resolve/hidden_glob_reexports.rs
+++ b/tests/ui/resolve/hidden_glob_reexports.rs
@@ -6,10 +6,10 @@ pub mod upstream_a {
         pub struct Bar {}
     }
 
-    pub use self::inner::*;
-
     struct Foo;
     //~^ WARN private item shadows public glob re-export
+
+    pub use self::inner::*;
 }
 
 pub mod upstream_b {
diff --git a/tests/ui/resolve/hidden_glob_reexports.stderr b/tests/ui/resolve/hidden_glob_reexports.stderr
index ddf7bcda827..11fa94d6fee 100644
--- a/tests/ui/resolve/hidden_glob_reexports.stderr
+++ b/tests/ui/resolve/hidden_glob_reexports.stderr
@@ -1,31 +1,54 @@
 warning: private item shadows public glob re-export
-  --> $DIR/hidden_glob_reexports.rs:11:5
+  --> $DIR/hidden_glob_reexports.rs:9:5
    |
-LL |     pub use self::inner::*;
-   |             -------------- the name `Foo` in the type namespace is supposed to be publicly re-exported here
-LL |
 LL |     struct Foo;
-   |     ^^^^^^^^^^^ but the private item here shadows it
+   |     ^^^^^^^^^^^
+   |
+note: the name `Foo` in the type namespace is supposed to be publicly re-exported here
+  --> $DIR/hidden_glob_reexports.rs:12:13
+   |
+LL |     pub use self::inner::*;
+   |             ^^^^^^^^^^^^^^
+note: but the private item here shadows it
+  --> $DIR/hidden_glob_reexports.rs:9:5
    |
+LL |     struct Foo;
+   |     ^^^^^^^^^^^
    = note: `#[warn(hidden_glob_reexports)]` on by default
 
 warning: private item shadows public glob re-export
   --> $DIR/hidden_glob_reexports.rs:27:9
    |
+LL |     use self::other::Foo;
+   |         ^^^^^^^^^^^^^^^^
+   |
+note: the name `Foo` in the type namespace is supposed to be publicly re-exported here
+  --> $DIR/hidden_glob_reexports.rs:25:13
+   |
 LL |     pub use self::inner::*;
-   |             -------------- the name `Foo` in the type namespace is supposed to be publicly re-exported here
-LL |
+   |             ^^^^^^^^^^^^^^
+note: but the private item here shadows it
+  --> $DIR/hidden_glob_reexports.rs:27:9
+   |
 LL |     use self::other::Foo;
-   |         ^^^^^^^^^^^^^^^^ but the private item here shadows it
+   |         ^^^^^^^^^^^^^^^^
 
 warning: private item shadows public glob re-export
   --> $DIR/hidden_glob_reexports.rs:40:9
    |
+LL |     use std::primitive::u8;
+   |         ^^^^^^^^^^^^^^^^^^
+   |
+note: the name `u8` in the type namespace is supposed to be publicly re-exported here
+  --> $DIR/hidden_glob_reexports.rs:38:13
+   |
 LL |     pub use self::no_def_id::*;
-   |             ------------------ the name `u8` in the type namespace is supposed to be publicly re-exported here
-LL |
+   |             ^^^^^^^^^^^^^^^^^^
+note: but the private item here shadows it
+  --> $DIR/hidden_glob_reexports.rs:40:9
+   |
 LL |     use std::primitive::u8;
-   |         ^^^^^^^^^^^^^^^^^^ but the private item here shadows it
+   |         ^^^^^^^^^^^^^^^^^^
 
 warning: 3 warnings emitted
 
diff --git a/x.py b/x.py
index b8cdf67712c..7163df5cfe9 100755
--- a/x.py
+++ b/x.py
@@ -9,12 +9,17 @@
 if __name__ == '__main__':
     import os
     import sys
+    import warnings
+    from inspect import cleandoc
+
+    major = sys.version_info.major
+    minor = sys.version_info.minor
 
     # If this is python2, check if python3 is available and re-execute with that
     # interpreter. Only python3 allows downloading CI LLVM.
     #
     # This matters if someone's system `python` is python2.
-    if sys.version_info.major < 3:
+    if major < 3:
         try:
             os.execvp("py", ["py", "-3"] + sys.argv)
         except OSError:
@@ -24,6 +29,19 @@ if __name__ == '__main__':
                 # Python 3 isn't available, fall back to python 2
                 pass
 
+    # soft deprecation of old python versions
+    skip_check = os.environ.get("RUST_IGNORE_OLD_PYTHON") == "1"
+    if major < 3 or (major == 3 and minor < 6):
+        msg = cleandoc("""
+            Using python {}.{} but >= 3.6 is recommended. Your python version
+            should continue to work for the near future, but this will
+            eventually change. If python >= 3.6 is not available on your system,
+            please file an issue to help us understand timelines.
+
+            This message can be suppressed by setting `RUST_IGNORE_OLD_PYTHON=1`
+        """.format(major, minor))
+        warnings.warn(msg)
+
     rust_dir = os.path.dirname(os.path.abspath(__file__))
     # For the import below, have Python search in src/bootstrap first.
     sys.path.insert(0, os.path.join(rust_dir, "src", "bootstrap"))