Skip to content

Commit

Permalink
Auto merge of #118787 - GuillaumeGomez:rollup-fj5wr3q, r=GuillaumeGomez
Browse files Browse the repository at this point in the history
Rollup of 5 pull requests

Successful merges:

 - #117966 (add safe compilation options)
 - #118747 (Remove extra check cfg handled by libc directly)
 - #118774 (add test for inductive cycle hangs)
 - #118775 (chore: add test case for type with generic)
 - #118782 (use `&` instead of start-process in x.ps1)

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Dec 10, 2023
2 parents 8cd8d31 + dd23469 commit f7253f2
Show file tree
Hide file tree
Showing 12 changed files with 152 additions and 25 deletions.
10 changes: 10 additions & 0 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,16 @@ change-id = 117813
# desired in distributions, for example.
#rpath = true

# Indicates whether symbols should be stripped using `-Cstrip=symbols`.
#strip = false

# Indicates whether stack protectors should be used
# via the unstable option `-Zstack-protector`.
#
# Valid options are : `none`(default),`basic`,`strong`, or `all`.
# `strong` and `basic` options may be buggy and are not recommended, see rust-lang/rust#114903.
#stack-protector = "none"

# Prints each test name as it is executed, to help debug issues in the test harness itself.
#verbose-tests = false

Expand Down
6 changes: 6 additions & 0 deletions src/bootstrap/src/core/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1667,6 +1667,12 @@ impl<'a> Builder<'a> {
}
}

cargo.env(profile_var("STRIP"), self.config.rust_strip.to_string());

if let Some(stack_protector) = &self.config.rust_stack_protector {
rustflags.arg(&format!("-Zstack-protector={stack_protector}"));
}

if let Some(host_linker) = self.linker(compiler.host) {
hostflags.arg(format!("-Clinker={}", host_linker.display()));
}
Expand Down
7 changes: 7 additions & 0 deletions src/bootstrap/src/core/config/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ pub struct Config {
pub rust_debuginfo_level_tests: DebuginfoLevel,
pub rust_split_debuginfo: SplitDebuginfo,
pub rust_rpath: bool,
pub rust_strip: bool,
pub rust_stack_protector: Option<String>,
pub rustc_parallel: bool,
pub rustc_default_linker: Option<String>,
pub rust_optimize_tests: bool,
Expand Down Expand Up @@ -1002,6 +1004,8 @@ define_config! {
description: Option<String> = "description",
musl_root: Option<String> = "musl-root",
rpath: Option<bool> = "rpath",
strip: Option<bool> = "strip",
stack_protector: Option<String> = "stack-protector",
verbose_tests: Option<bool> = "verbose-tests",
optimize_tests: Option<bool> = "optimize-tests",
codegen_tests: Option<bool> = "codegen-tests",
Expand Down Expand Up @@ -1071,6 +1075,7 @@ impl Config {
config.docs = true;
config.docs_minification = true;
config.rust_rpath = true;
config.rust_strip = false;
config.channel = "dev".to_string();
config.codegen_tests = true;
config.rust_dist_src = true;
Expand Down Expand Up @@ -1425,6 +1430,8 @@ impl Config {
set(&mut config.rust_optimize_tests, rust.optimize_tests);
set(&mut config.codegen_tests, rust.codegen_tests);
set(&mut config.rust_rpath, rust.rpath);
set(&mut config.rust_strip, rust.strip);
config.rust_stack_protector = rust.stack_protector;
set(&mut config.jemalloc, rust.jemalloc);
set(&mut config.test_compare_mode, rust.test_compare_mode);
set(&mut config.backtrace, rust.backtrace);
Expand Down
2 changes: 0 additions & 2 deletions src/bootstrap/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,6 @@ const EXTRA_CHECK_CFGS: &[(Option<Mode>, &str, Option<&[&'static str]>)] = &[
(Some(Mode::Std), "no_global_oom_handling", None),
(Some(Mode::Std), "no_rc", None),
(Some(Mode::Std), "no_sync", None),
(Some(Mode::Std), "freebsd12", None),
(Some(Mode::Std), "freebsd13", None),
(Some(Mode::Std), "backtrace_in_libstd", None),
/* Extra values not defined in the built-in targets yet, but used in std */
(Some(Mode::Std), "target_env", Some(&["libnx"])),
Expand Down
14 changes: 14 additions & 0 deletions tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,24 @@ impl A {
fn test(_a: Self, _b: i32) {}
}

struct B<T> {
_b: T
}
impl<T> B<T> {
fn hello(_a: i32) {}
fn test(_a: Self, _b: i32) {}
}

fn main() {
let _a = A {};
A::hello(1);
//~^ ERROR no method named `hello` found
A::test(_a, 1);
//~^ ERROR no method named `test` found

let _b = B {_b: ""};
B::<&str>::hello(1);
//~^ ERROR no method named `hello` found
B::<&str>::test(_b, 1);
//~^ ERROR no method named `test` found
}
14 changes: 14 additions & 0 deletions tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,24 @@ impl A {
fn test(_a: Self, _b: i32) {}
}

struct B<T> {
_b: T
}
impl<T> B<T> {
fn hello(_a: i32) {}
fn test(_a: Self, _b: i32) {}
}

fn main() {
let _a = A {};
_a.hello(1);
//~^ ERROR no method named `hello` found
_a.test(1);
//~^ ERROR no method named `test` found

let _b = B {_b: ""};
_b.hello(1);
//~^ ERROR no method named `hello` found
_b.test(1);
//~^ ERROR no method named `test` found
}
44 changes: 41 additions & 3 deletions tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0599]: no method named `hello` found for struct `A` in the current scope
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:12:8
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:20:8
|
LL | struct A {}
| -------- method `hello` not found for this struct
Expand All @@ -18,7 +18,7 @@ LL | fn hello(_a: i32) {}
| ^^^^^^^^^^^^^^^^^

error[E0599]: no method named `test` found for struct `A` in the current scope
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:14:8
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:22:8
|
LL | struct A {}
| -------- method `test` not found for this struct
Expand All @@ -36,6 +36,44 @@ note: the candidate is defined in an impl for the type `A`
LL | fn test(_a: Self, _b: i32) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 2 previous errors
error[E0599]: no method named `hello` found for struct `B<&str>` in the current scope
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:26:8
|
LL | struct B<T> {
| ----------- method `hello` not found for this struct
...
LL | _b.hello(1);
| ---^^^^^---
| | |
| | this is an associated function, not a method
| help: use associated function syntax instead: `B::<&str>::hello(1)`
|
= note: found the following associated functions; to be used as methods, functions must have a `self` parameter
note: the candidate is defined in an impl for the type `B<T>`
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:14:5
|
LL | fn hello(_a: i32) {}
| ^^^^^^^^^^^^^^^^^

error[E0599]: no method named `test` found for struct `B<&str>` in the current scope
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:28:8
|
LL | struct B<T> {
| ----------- method `test` not found for this struct
...
LL | _b.test(1);
| ---^^^^---
| | |
| | this is an associated function, not a method
| help: use associated function syntax instead: `B::<&str>::test(_b, 1)`
|
= note: found the following associated functions; to be used as methods, functions must have a `self` parameter
note: the candidate is defined in an impl for the type `B<T>`
--> $DIR/suggest-assoc-fn-call-without-receiver.rs:15:5
|
LL | fn test(_a: Self, _b: i32) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0599`.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
// Proving `W<?0>: Trait` instantiates `?0` with `(W<?1>, W<?2>)` and then
// proves `W<?1>: Trait` and `W<?2>: Trait`, resulting in a coinductive cycle.
//
// Proving coinductive cycles runs until we reach a fixpoint. This fixpoint is
// never reached here and each step doubles the amount of nested obligations.
// Proving coinductive cycles runs until we reach a fixpoint. However, after
// computing `try_evaluate_added_goals` in the second fixpoint iteration, the
// self type already has a depth equal to the number of steps. This results
// in enormous constraints, causing the canonicalizer to hang without ever
// reaching the recursion limit. We currently avoid that by erasing the constraints
// from overflow.
//
// This previously caused a hang in the trait solver, see
// https://github.com/rust-lang/trait-system-refactor-initiative/issues/13.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
error[E0275]: overflow evaluating the requirement `W<_>: Trait`
--> $DIR/fixpoint-exponential-growth.rs:29:13
--> $DIR/fixpoint-exponential-growth.rs:33:13
|
LL | impls::<W<_>>();
| ^^^^
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`fixpoint_exponential_growth`)
note: required by a bound in `impls`
--> $DIR/fixpoint-exponential-growth.rs:26:13
--> $DIR/fixpoint-exponential-growth.rs:30:13
|
LL | fn impls<T: Trait>() {}
| ^^^^^ required by this bound in `impls`
Expand Down
33 changes: 33 additions & 0 deletions tests/ui/traits/new-solver/cycles/inductive-fixpoint-hang.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// compile-flags: -Ztrait-solver=next

// This currently hangs if we do not erase constraints from
// overflow.
//
// We set the provisional result of `W<?0>` to `?0 := W<_>`.
// The next iteration does not simply result in a `?0 := W<W<_>` constraint as
// one might expect, but instead each time we evaluate the nested `W<T>` goal we
// apply the previously returned constraints: the first fixpoint iteration goes
// as follows: `W<?1>: Trait` constrains `?1` to `W<?2>`, we then evaluate
// `W<W<?2>>: Trait` the next time we try to prove the nested goal. This results
// inn `W<W<W<?3>>>` and so on. This goes on until we reach overflow in
// `try_evaluate_added_goals`. This means the provisional result after the
// second fixpoint iteration is already `W<W<W<...>>>` with a size proportional
// to the number of steps in `try_evaluate_added_goals`. The size then continues
// to grow. The exponential blowup from having 2 nested goals per impl causes
// the solver to hang without hitting the recursion limit.
trait Trait {}

struct W<T: ?Sized>(*const T);

impl<T: ?Sized> Trait for W<W<T>>
where
W<T>: Trait,
W<T>: Trait,
{}

fn impls_trait<T: Trait>() {}

fn main() {
impls_trait::<W<_>>();
//~^ ERROR overflow evaluating the requirement
}
16 changes: 16 additions & 0 deletions tests/ui/traits/new-solver/cycles/inductive-fixpoint-hang.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
error[E0275]: overflow evaluating the requirement `W<_>: Trait`
--> $DIR/inductive-fixpoint-hang.rs:31:19
|
LL | impls_trait::<W<_>>();
| ^^^^
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`inductive_fixpoint_hang`)
note: required by a bound in `impls_trait`
--> $DIR/inductive-fixpoint-hang.rs:28:19
|
LL | fn impls_trait<T: Trait>() {}
| ^^^^^ required by this bound in `impls_trait`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0275`.
19 changes: 3 additions & 16 deletions x.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,16 @@ $ErrorActionPreference = "Stop"
Get-Command -syntax ${PSCommandPath} >$null

$xpy = Join-Path $PSScriptRoot x.py
# Start-Process for some reason splits arguments on spaces. (Isn't powershell supposed to be simpler than bash?)
# Double-quote all the arguments so it doesn't do that.
$xpy_args = @("""$xpy""")
foreach ($arg in $args) {
$xpy_args += """$arg"""
}
$xpy_args = @($xpy) + $args

function Get-Application($app) {
$cmd = Get-Command $app -ErrorAction SilentlyContinue -CommandType Application | Select-Object -First 1
return $cmd
}

function Invoke-Application($application, $arguments) {
$process = Start-Process -NoNewWindow -PassThru $application $arguments
# WORKAROUND: Caching the handle is necessary to make ExitCode work.
# See https://stackoverflow.com/a/23797762
$handle = $process.Handle
$process.WaitForExit()
if ($null -eq $process.ExitCode) {
Write-Error "Unable to read the exit code"
Exit 1
}
Exit $process.ExitCode
& $application $arguments
Exit $LASTEXITCODE
}

foreach ($python in "py", "python3", "python", "python2") {
Expand Down

0 comments on commit f7253f2

Please sign in to comment.