Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 5 pull requests #125096

Closed
wants to merge 10 commits into from
5 changes: 4 additions & 1 deletion compiler/rustc_hir_typeck/src/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
| ty::Never
| ty::Dynamic(_, _, ty::DynStar)
| ty::Error(_) => {
self.dcx().span_bug(span, format!("`{t:?}` should be sized but is not?"));
let guar = self
.dcx()
.span_delayed_bug(span, format!("`{t:?}` should be sized but is not?"));
return Err(guar);
}
})
}
Expand Down
38 changes: 33 additions & 5 deletions library/core/src/ptr/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,39 @@
//!
//! ## Allocated object
//!
//! For several operations, such as [`offset`] or field projections (`expr.field`), the notion of an
//! "allocated object" becomes relevant. An allocated object is a contiguous region of memory.
//! Common examples of allocated objects include stack-allocated variables (each variable is a
//! separate allocated object), heap allocations (each allocation created by the global allocator is
//! a separate allocated object), and `static` variables.
//! An *allocated object* is a subset of program memory which is addressable
//! from Rust, and within which pointer arithmetic is possible. Examples of
//! allocated objects include heap allocations, stack-allocated variables,
//! statics, and consts. The safety preconditions of some Rust operations -
//! such as `offset` and field projections (`expr.field`) - are defined in
//! terms of the allocated objects on which they operate.
//!
//! An allocated object has a base address, a size, and a set of memory
//! addresses. It is possible for an allocated object to have zero size, but
//! such an allocated object will still have a base address. The base address
//! of an allocated object is not necessarily unique. While it is currently the
//! case that an allocated object always has a set of memory addresses which is
//! fully contiguous (i.e., has no "holes"), there is no guarantee that this
//! will not change in the future.
//!
//! For any allocated object with `base` address, `size`, and a set of
//! `addresses`, the following are guaranteed:
//! - For all addresses `a` in `addresses`, `a` is in the range `base .. (base +
//! size)` (note that this requires `a < base + size`, not `a <= base + size`)
//! - `base` is not equal to [`null()`] (i.e., the address with the numerical
//! value 0)
//! - `base + size <= usize::MAX`
//! - `size <= isize::MAX`
//!
//! As a consequence of these guarantees, given any address `a` within the set
//! of addresses of an allocated object:
//! - It is guaranteed that `a - base` does not overflow `isize`
//! - It is guaranteed that `a - base` is non-negative
//! - It is guaranteed that, given `o = a - base` (i.e., the offset of `a` within
//! the allocated object), `base + o` will not wrap around the address space (in
//! other words, will not overflow `usize`)
//!
//! [`null()`]: null
//!
//! # Strict Provenance
//!
Expand Down
25 changes: 11 additions & 14 deletions src/doc/rustc/src/platform-support/fuchsia.md
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ meta/hello_fuchsia.cm=pkg/meta/hello_fuchsia.cm
```

*Note: Relative manifest paths are resolved starting from the working directory
of `pm`. Make sure to fill out `<SDK_PATH>` with the path to the downloaded
of `ffx`. Make sure to fill out `<SDK_PATH>` with the path to the downloaded
SDK.*

The `.manifest` file will be used to describe the contents of the package by
Expand Down Expand Up @@ -459,12 +459,10 @@ hello_fuchsia/
Next, we'll build a package manifest as defined by our manifest:

```sh
${SDK_PATH}/tools/${ARCH}/pm \
-api-level $(${SDK_PATH}/tools/${ARCH}/ffx version -v | grep "api-level" | head -1 | awk -F ' ' '{print $2}') \
-o pkg/hello_fuchsia_manifest \
-m pkg/hello_fuchsia.manifest \
build \
-output-package-manifest pkg/hello_fuchsia_package_manifest
${SDK_PATH}/tools/${ARCH}/ffx package build \
--api-level $(${SDK_PATH}/tools/${ARCH}/ffx --machine json version | jq .tool_version.api_level) \
--out pkg/hello_fuchsia_manifest \
pkg/hello_fuchsia.manifest
```

This will produce `pkg/hello_fuchsia_manifest/` which is a package manifest we can
Expand Down Expand Up @@ -498,8 +496,7 @@ to.
We can set up our repository with:

```sh
${SDK_PATH}/tools/${ARCH}/pm newrepo \
-repo pkg/repo
${SDK_PATH}/tools/${ARCH}/ffx repository create pkg/repo
```

**Current directory structure**
Expand All @@ -523,17 +520,17 @@ hello_fuchsia/
We can publish our new package to that repository with:

```sh
${SDK_PATH}/tools/${ARCH}/pm publish \
-repo pkg/repo \
-lp -f <(echo "pkg/hello_fuchsia_package_manifest")
${SDK_PATH}/tools/${ARCH}/ffx repository publish \
--package pkg/hello_fuchsia_package_manifest \
pkg/repo
```

Then we can add the repository to `ffx`'s package server as `hello-fuchsia` using:

```sh
${SDK_PATH}/tools/${ARCH}/ffx repository add-from-pm \
pkg/repo \
-r hello-fuchsia
--repository hello-fuchsia \
pkg/repo
```

## Running a Fuchsia component on an emulator
Expand Down
1 change: 0 additions & 1 deletion src/tools/tidy/src/allowed_run_make_makefiles.txt
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ run-make/rlib-format-packed-bundled-libs-3/Makefile
run-make/rlib-format-packed-bundled-libs/Makefile
run-make/rmeta-preferred/Makefile
run-make/rustc-macro-dep-files/Makefile
run-make/rustdoc-io-error/Makefile
run-make/rustdoc-scrape-examples-invalid-expr/Makefile
run-make/rustdoc-scrape-examples-macros/Makefile
run-make/rustdoc-scrape-examples-multiple/Makefile
Expand Down
20 changes: 0 additions & 20 deletions tests/run-make/rustdoc-io-error/Makefile

This file was deleted.

32 changes: 32 additions & 0 deletions tests/run-make/rustdoc-io-error/rmake.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// This test verifies that rustdoc doesn't ICE when it encounters an IO error
// while generating files. Ideally this would be a rustdoc-ui test, so we could
// verify the error message as well.
//
// It operates by creating a temporary directory and modifying its
// permissions so that it is not writable. We have to take special care to set
// the permissions back to normal so that it's able to be deleted later.

use run_make_support::{rustdoc, tmp_dir};
use std::fs;

fn main() {
let out_dir = tmp_dir().join("rustdoc-io-error");
let output = fs::create_dir(&out_dir).unwrap();
let mut permissions = fs::metadata(&out_dir).unwrap().permissions();
let original_permissions = permissions.clone();
permissions.set_readonly(true);
fs::set_permissions(&out_dir, permissions.clone()).unwrap();

let output = rustdoc().input("foo.rs").output(&out_dir).command_output();

// Changing back permissions.
fs::set_permissions(&out_dir, original_permissions).unwrap();

// Checks that rustdoc failed with the error code 1.
#[cfg(unix)]
assert_eq!(output.status.code().unwrap(), 1);
assert!(!output.status.success());
let stderr = String::from_utf8(output.stderr).unwrap();

assert!(stderr.contains("error: couldn't generate documentation: Permission denied"));
}
18 changes: 18 additions & 0 deletions tests/ui/cast/ice-cast-type-with-error-124848.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Regression test for ICE #124848
// Tests that there is no ICE when a cast
// involves a type with error

use std::cell::Cell;

struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
//~^ ERROR use of undeclared lifetime name `'unpinned`
//~| ERROR cannot find type `Pin` in this scope

fn main() {
let mut unpinned = MyType(Cell::new(None));
//~^ ERROR his struct takes 2 arguments but 1 argument was supplied
let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
//~^ ERROR use of undeclared lifetime name `'a`
//~| ERROR use of undeclared lifetime name `'a`
//~| ERROR casting `&MyType<'_>` as `*const Cell<Option<&mut MyType<'_>>>` is invalid
}
63 changes: 63 additions & 0 deletions tests/ui/cast/ice-cast-type-with-error-124848.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
error[E0261]: use of undeclared lifetime name `'unpinned`
--> $DIR/ice-cast-type-with-error-124848.rs:7:32
|
LL | struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
| - ^^^^^^^^^ undeclared lifetime
| |
| help: consider introducing lifetime `'unpinned` here: `'unpinned,`

error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/ice-cast-type-with-error-124848.rs:14:53
|
LL | fn main() {
| - help: consider introducing lifetime `'a` here: `<'a>`
...
LL | let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
| ^^ undeclared lifetime

error[E0261]: use of undeclared lifetime name `'a`
--> $DIR/ice-cast-type-with-error-124848.rs:14:67
|
LL | fn main() {
| - help: consider introducing lifetime `'a` here: `<'a>`
...
LL | let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
| ^^ undeclared lifetime

error[E0412]: cannot find type `Pin` in this scope
--> $DIR/ice-cast-type-with-error-124848.rs:7:60
|
LL | struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
| ^^^ not found in this scope
|
help: consider importing this struct
|
LL + use std::pin::Pin;
|

error[E0061]: this struct takes 2 arguments but 1 argument was supplied
--> $DIR/ice-cast-type-with-error-124848.rs:12:24
|
LL | let mut unpinned = MyType(Cell::new(None));
| ^^^^^^----------------- an argument is missing
|
note: tuple struct defined here
--> $DIR/ice-cast-type-with-error-124848.rs:7:8
|
LL | struct MyType<'a>(Cell<Option<&'unpinned mut MyType<'a>>>, Pin);
| ^^^^^^
help: provide the argument
|
LL | let mut unpinned = MyType(Cell::new(None), /* value */);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0606]: casting `&MyType<'_>` as `*const Cell<Option<&mut MyType<'_>>>` is invalid
--> $DIR/ice-cast-type-with-error-124848.rs:14:20
|
LL | let bad_addr = &unpinned as *const Cell<Option<&'a mut MyType<'a>>> as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 6 previous errors

Some errors have detailed explanations: E0061, E0261, E0412, E0606.
For more information about an error, try `rustc --explain E0061`.
19 changes: 19 additions & 0 deletions tests/ui/coercion/pin-dyn-dispatch-sound.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use std::marker::PhantomPinned;
use std::pin::Pin;

trait MyUnpinTrait {
fn into_pinned_type(self: Pin<&mut Self>) -> Pin<&mut PhantomPinned>;
}
impl MyUnpinTrait for PhantomPinned {
fn into_pinned_type(self: Pin<&mut Self>) -> Pin<&mut PhantomPinned> {
self
}
}
impl Unpin for dyn MyUnpinTrait {} //~ ERROR E0321

// It would be unsound for this function to compile.
fn pin_it(not_yet_pinned: &mut PhantomPinned) -> Pin<&mut PhantomPinned> {
Pin::new(not_yet_pinned as &mut dyn MyUnpinTrait).into_pinned_type()
}

fn main() {}
9 changes: 9 additions & 0 deletions tests/ui/coercion/pin-dyn-dispatch-sound.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0321]: cross-crate traits with a default impl, like `Unpin`, can only be implemented for a struct/enum type, not `(dyn MyUnpinTrait + 'static)`
--> $DIR/pin-dyn-dispatch-sound.rs:12:1
|
LL | impl Unpin for dyn MyUnpinTrait {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0321`.
Loading