Commit Graph

3272 Commits

Author SHA1 Message Date
bors aa6a634cb0 Auto merge of #135318 - compiler-errors:vtable-fixes, r=lcnr
Fix deduplication mismatches in vtables leading to upcasting unsoundness

We currently have two cases where subtleties in supertraits can trigger disagreements in the vtable layout, e.g. leading to a different vtable layout being accessed at a callsite compared to what was prepared during unsizing. Namely:

### #135315

In this example, we were not normalizing supertraits when preparing vtables. In the example,

```
trait Supertrait<T> {
    fn _print_numbers(&self, mem: &[usize; 100]) {
        println!("{mem:?}");
    }
}
impl<T> Supertrait<T> for () {}

trait Identity {
    type Selff;
}
impl<Selff> Identity for Selff {
    type Selff = Selff;
}

trait Middle<T>: Supertrait<()> + Supertrait<T> {
    fn say_hello(&self, _: &usize) {
        println!("Hello!");
    }
}
impl<T> Middle<T> for () {}

trait Trait: Middle<<() as Identity>::Selff> {}
impl Trait for () {}

fn main() {
    (&() as &dyn Trait as &dyn Middle<()>).say_hello(&0);
}
```

When we prepare `dyn Trait`, we see a supertrait of `Middle<<() as Identity>::Selff>`, which itself has two supertraits `Supertrait<()>` and `Supertrait<<() as Identity>::Selff>`. These two supertraits are identical, but they are not duplicated because we were using structural equality and *not* considering normalization. This leads to a vtable layout with two trait pointers.

When we upcast to `dyn Middle<()>`, those two supertraits are now the same, leading to a vtable layout with only one trait pointer. This leads to an offset error, and we call the wrong method.

### #135316

This one is a bit more interesting, and is the bulk of the changes in this PR. It's a bit similar, except it uses binder equality instead of normalization to make the compiler get confused about two vtable layouts. In the example,

```
trait Supertrait<T> {
    fn _print_numbers(&self, mem: &[usize; 100]) {
        println!("{mem:?}");
    }
}
impl<T> Supertrait<T> for () {}

trait Trait<T, U>: Supertrait<T> + Supertrait<U> {
    fn say_hello(&self, _: &usize) {
        println!("Hello!");
    }
}
impl<T, U> Trait<T, U> for () {}

fn main() {
    (&() as &'static dyn for<'a> Trait<&'static (), &'a ()>
        as &'static dyn Trait<&'static (), &'static ()>)
        .say_hello(&0);
}
```

When we prepare the vtable for `dyn for<'a> Trait<&'static (), &'a ()>`, we currently consider the PolyTraitRef of the vtable as the key for a supertrait. This leads two two supertraits -- `Supertrait<&'static ()>` and `for<'a> Supertrait<&'a ()>`.

However, we can upcast[^up] without offsetting the vtable from `dyn for<'a> Trait<&'static (), &'a ()>` to `dyn Trait<&'static (), &'static ()>`. This is just instantiating the principal trait ref for a specific `'a = 'static`. However, when considering those supertraits, we now have only one distinct supertrait -- `Supertrait<&'static ()>` (which is deduplicated since there are two supertraits with the same substitutions). This leads to similar offsetting issues, leading to the wrong method being called.

[^up]: I say upcast but this is a cast that is allowed on stable, since it's not changing the vtable at all, just instantiating the binder of the principal trait ref for some lifetime.

The solution here is to recognize that a vtable isn't really meaningfully higher ranked, and to just treat a vtable as corresponding to a `TraitRef` so we can do this deduplication more faithfully. That is to say, the vtable for `dyn for<'a> Tr<'a>` and `dyn Tr<'x>` are always identical, since they both would correspond to a set of free regions on an impl... Do note that `Tr<for<'a> fn(&'a ())>` and `Tr<fn(&'static ())>` are still distinct.

----

There's a bit more that can be cleaned up. In codegen, we can stop using `PolyExistentialTraitRef` basically everywhere. We can also fix SMIR to stop storing `PolyExistentialTraitRef` in its vtable allocations.

As for testing, it's difficult to actually turn this into something that can be tested with `rustc_dump_vtable`, since having multiple supertraits that are identical is a recipe for ambiguity errors. Maybe someone else is more creative with getting that attr to work, since the tests I added being run-pass tests is a bit unsatisfying. Miri also doesn't help here, since it doesn't really generate vtables that are offset by an index in the same way as codegen.

r? `@lcnr` for the vibe check? Or reassign, idk. Maybe let's talk about whether this makes sense.

<sup>(I guess an alternative would also be to not do any deduplication of vtable supertraits (or only a really conservative subset) rather than trying to normalize and deduplicate more faithfully here. Not sure if that works and is sufficient tho.)</sup>

cc `@steffahn` -- ty for the minimizations
cc `@WaffleLapkin` -- since you're overseeing the feature stabilization :3

Fixes #135315
Fixes #135316
2025-01-31 04:09:11 +00:00
Ryan Cumming 55cd18d5cc
Fix a typo in conventions.md
Introduced in #135950
2025-01-31 10:23:46 +11:00
bors a2fba5db46 Auto merge of #135030 - Flakebi:require-cpu, r=workingjubilee
Target option to require explicit cpu

Some targets have many different CPUs and no generic CPU that can be used as a default. For these targets, the user needs to explicitly specify a CPU through `-C target-cpu=`.

Add an option for targets and an error message if no CPU is set.

This affects the proposed amdgpu and avr targets.

amdgpu tracking issue: #135024
AVR MCP: https://github.com/rust-lang/compiler-team/issues/800
2025-01-30 20:21:50 +00:00
Jakub Beránek d56a2103f8
Merge pull request #2234 from Kobzol/rustc-pull-error-code
Make rustc pulls on CI more frequent
2025-01-30 21:09:23 +01:00
Jakub Beránek c45e1e9a0e Run rustc-pull CI every day, don't notify when there is nothing to update 2025-01-30 20:00:39 +01:00
Jakub Beránek a0505b3e7d Rewrite section on executing Docker tests 2025-01-30 18:33:34 +01:00
bors 05dca72667 Auto merge of #136292 - matthiaskrgr:rollup-fw1tlca, r=matthiaskrgr
Rollup of 7 pull requests

Successful merges:

 - #133636 ([rustdoc] Add sans-serif font setting)
 - #135434 (Match Ergonomics 2024: update edition 2024 behavior of feature gates)
 - #135739 (Clean up uses of the unstable `dwarf_version` option)
 - #135882 (simplify `similar_tokens` from `Option<Vec<_>>` to `&[_]`)
 - #136179 (Allow transmuting generic pattern types to and from their base)
 - #136199 (Fix a couple Emscripten tests)
 - #136251 (use impl Into<String> instead of explicit type args with bounds)

r? `@ghost`
`@rustbot` modify labels: rollup
2025-01-30 17:21:59 +00:00
Ralf Jung 2386fc4eec
Merge pull request #4140 from geetanshjuneja/deref
Use deref_pointer_as instead of deref_pointer
2025-01-30 16:31:17 +00:00
Jakub Beránek 88197e4182 Distinguish between "nothing to pull" and "pull error" in josh-sync 2025-01-30 16:48:39 +01:00
Michael Goulet 0cd4069ee4 Rework rustc_dump_vtable 2025-01-30 15:30:04 +00:00
Matthias Krüger 17c41ba782
Rollup merge of #136251 - hkBst:opt_imports, r=estebank
use impl Into<String> instead of explicit type args with bounds
2025-01-30 12:45:38 +01:00
Matthias Krüger a736d3bd37
Rollup merge of #136199 - purplesyringa:emscripten-tests, r=jieyouxu
Fix a couple Emscripten tests

This fixes a couple Emscripten tests where the correct fix is more or less obvious. A couple UI tests are still broken with this PR:

- `tests/ui/abi/numbers-arithmetic/return-float.rs` (#136197)
- `tests/ui/no_std/no-std-unwind-binary.rs` (haven't debugged yet)
- `tests/ui/test-attrs/test-passed.rs` (haven't debugged this either)

`````@rustbot````` label +T-compiler +O-emscripten
2025-01-30 12:45:35 +01:00
Matthias Krüger f507fca02d
Rollup merge of #136179 - oli-obk:push-vxvyttorquxw, r=BoxyUwU
Allow transmuting generic pattern types to and from their base

Pattern types always have the same size as their base type, so we can just ignore the pattern and look at the base type for figuring out whether transmuting is possible.
2025-01-30 12:45:32 +01:00
Matthias Krüger b58aa18166
Rollup merge of #135882 - hkBst:master, r=estebank
simplify `similar_tokens` from `Option<Vec<_>>` to `&[_]`

All uses immediately invoke contains, so maybe a further simplification is possible.
2025-01-30 12:45:27 +01:00
Matthias Krüger 0c165ecea9
Rollup merge of #135739 - wesleywiser:dwarf_version_handling, r=lqd
Clean up uses of the unstable `dwarf_version` option

- Consolidate calculation of the effective value.
- Check the target `DebuginfoKind` instead of using `is_like_msvc`.
- Add the tracking issue to the unstable book page for this feature.

cc #103057
2025-01-30 12:45:21 +01:00
Matthias Krüger df4dc2c187
Rollup merge of #135434 - dianne:match-2024-for-edition-2024, r=Nadrieril
Match Ergonomics 2024: update edition 2024 behavior of feature gates

This updates the edition 2024 behavior of the feature gates `ref_pat_eat_one_layer_2024_structural` and `ref_pat_eat_one_layer_2024` to correspond to the left and right typing rules compared [here](https://nadrieril.github.io/typing-rust-patterns/?compare=true&opts2=AQEBAAABAQABAgIAAQEBAAEBAAABAAA%3D&opts1=AQEBAgEBAQEBAgIAAAAAAAAAAAAAAAA%3D&mode=rules&do_cmp=true&ty_d=3&style=SequentBindingMode), respectively. I'll implement the proposed new behavior for editions ≤ 2021 in another PR.

The tests are split up a bit awkwardly for practical reasons, but I've added new tests from 3 places:
- I got tests for where the typing rules differ from the "Compare" tab of the page linked above. These had to be split up based on where the errors are emitted and how rustfixable they are, so they've ended up in different files to keep tidy. Within each file, though, the order of the tests matches the order the typing differences appear in that comparison (as of when this was written).
- I used [this other comparison](https://nadrieril.github.io/typing-rust-patterns/?q=%5B%26mut+%26%28mut+x%29%5D%3A+%26mut+%5B%26CT%5D&compare=true&opts2=AQEBAgABAQEBAgIAAQEBAAEBAAABAAA%3D&opts1=AQEBAgEBAQEBAgIAAAAAAAAAAAAAAAA%3D&mode=compare&do_cmp=true&ty_d=3&style=SequentBindingMode) to test the `Deref(EatInner, FallbackToOuter)` rule of the left/"structural"/eat-inner ruleset. These are all in `well-typed-edition-2024.rs`.
- I added some select tests for cases where the new typing rules differ from current stable Rust. I had to be pickier about what I included here, but I tried to make sure each typing rule got some coverage. That said, my approach for these tests was a bit ad-hoc, so I may have missed something.

Relevant tracking issue: #123076

r? ````@ghost````
2025-01-30 12:45:18 +01:00
Matthias Krüger 03b79ed48f
Rollup merge of #133636 - GuillaumeGomez:sans-serif, r=rustdoc
[rustdoc] Add sans-serif font setting

Fixes https://github.com/rust-lang/rust/issues/52449.

This PR adds a new setting introducing the possibility to switch to a sans-serif font (`Fira Sans`) for the text.

Can be tested [here](https://rustdoc.crud.net/imperio/sans-serif/std/index.html).

cc ```@rust-lang/rustdoc-frontend```
r? ```@notriddle```
2025-01-30 12:45:13 +01:00
bors 9cefcea1ce Auto merge of #136038 - compiler-errors:outlives, r=lcnr
Simplify and consolidate the way we handle construct `OutlivesEnvironment` for lexical region resolution

This is best reviewed commit-by-commit. I tried to consolidate the API for lexical region resolution *first*, then change the API when it was finally behind a single surface.

r? lcnr or reassign
2025-01-30 11:40:32 +00:00
chiichen 72ceb939b3 feat: modify developing with nix section 2025-01-30 18:03:27 +08:00
chiichen a14bbfbea9 chore: discard padding white space 2025-01-30 18:02:58 +08:00
Oli Scherer 0a83423d04
Merge pull request #4163 from rust-lang/rustup-2025-01-30
Automatic Rustup
2025-01-30 06:23:23 +00:00
The Miri Cronjob Bot a2813cb02a Merge from rustc 2025-01-30 05:06:57 +00:00
bors bc26e04aa0 Auto merge of #136272 - Zalathar:rollup-6s577l5, r=Zalathar
Rollup of 5 pull requests

Successful merges:

 - #135847 (optimize slice::ptr_rotate for small rotates)
 - #136215 (btree/node.rs: remove incorrect comment from pop_internal_level docs)
 - #136252 (spastorino back from vacations)
 - #136254 (Rustc dev guide subtree update)
 - #136259 (Cleanup docs for Allocator)

r? `@ghost`
`@rustbot` modify labels: rollup
2025-01-30 04:12:59 +00:00
Stuart Cook a6301ed6ea
Rollup merge of #136259 - hkBst:patch-30, r=thomcc
Cleanup docs for Allocator

This is an attempt to remove ungrammatical constructions and clean up the prose. I've sometimes had to try hard to understand what was being stated, so it is possible that I've misunderstood the original meaning. In particular, I did not see a difference between:
 - the borrow-checker lifetime of the allocator type itself.
 - as long as at least one of the allocator instance and all of its clones has not been dropped.
2025-01-30 14:25:07 +11:00
Stuart Cook 6a1b089171
Rollup merge of #136254 - BoxyUwU:rdg-push, r=Kobzol
Rustc dev guide subtree update

r? `@Kobzol`
2025-01-30 14:25:06 +11:00
Stuart Cook 4c32108f10
Rollup merge of #136252 - spastorino:remove-spastorino-on-vacations, r=jieyouxu
spastorino back from vacations
2025-01-30 14:25:06 +11:00
Stuart Cook a840adc27d
Rollup merge of #136215 - btj:patch-1, r=cuviper
btree/node.rs: remove incorrect comment from pop_internal_level docs
2025-01-30 14:25:05 +11:00
Stuart Cook d69c27369a
Rollup merge of #135847 - edwloef:slice_ptr_rotate_opt, r=scottmcm
optimize slice::ptr_rotate for small rotates

r? `@scottmcm`

This swaps the positions and numberings of algorithms 1 and 2 in `slice::ptr_rotate`, and pulls the entire outer loop into algorithm 3 since it was redundant for the first two. Effectively, `ptr_rotate` now always does the `memcpy`+`memmove`+`memcpy` sequence if the shifts fit into the stack buffer.
With this change, an `IndexMap`-style `move_index` function is optimized correctly.

Assembly comparisons:
- `move_index`, before: https://godbolt.org/z/Kr616KnYM
- `move_index`, after: https://godbolt.org/z/1aoov6j8h
- the code from `#89714`, before: https://godbolt.org/z/Y4zaPxEG6
- the code from `#89714`, after: https://godbolt.org/z/1dPx83axc

related to #89714
some relevant discussion in https://internals.rust-lang.org/t/idea-shift-move-to-efficiently-move-elements-in-a-vec/22184

Behavior tests pass locally. I can't get any consistent microbenchmark results on my machine, but the assembly diffs look promising.
2025-01-30 14:25:04 +11:00
bors 3c03203e03 Auto merge of #136035 - SpecificProtagonist:miri-zeroed-alloc, r=oli-obk
miri: optimize zeroed alloc

When allocating zero-initialized memory in MIR interpretation, rustc allocates zeroed memory, marks it as initialized and then re-zeroes it. Remove the last step.

I don't expect this to have much of an effect on performance normally, but in my case in which I'm creating a large allocation via mmap it gets in the way.
2025-01-30 01:27:21 +00:00
bors e89b5df104 Auto merge of #135818 - jieyouxu:migrate-translation, r=compiler-errors
tests: Port `translation` to rmake.rs

Part of #121876.

This PR partially supersedes #129011 and is co-authored with `@Oneirical.`

## Summary

This PR ports `tests/run-make/translation` to rmake.rs. Notable changes from the Makefile version include:

- We now actually fail if the rustc invocations fail... The Makefile did not have `SHELL=/bin/bash -o pipefail`, so all the piped rustc invocations to grep vacuously succeeded, even if the broken ftl test case actually regressed over time and ICEs on current master.
    - That test case is converted to assert it fails with a FIXME backlinking to #135817.
- The test coverage is expanded to not ignore windows. Instead, the test now uses symlink capability detection to gate test execution.
- Added some backlinks to relevant tracking issues and the initial translation infra implementation PR.

## Review advice

Best reviewed commit-by-commit.

r? compiler

try-job: aarch64-apple
try-job: i686-mingw
2025-01-29 22:01:53 +00:00
bors 2bb2301427 Auto merge of #134248 - oli-obk:patkind-path-removal, r=BoxyUwU
Merge `PatKind::Path` into `PatKind::Expr`

Follow-up to #134228

We always had a duplication where `Path`s could be represented as `PatKind::Path` or `PatKind::Lit(ExprKind::Path)`. We had to handle both everywhere, and still do after #134228, so I'm removing it now.
2025-01-29 19:16:29 +00:00
Ralf Jung 050368debf
Merge pull request #4122 from tiif/fnabi
Check fixed args number for variadic function
2025-01-29 17:33:59 +00:00
Boxy f61d56ba4d
Rustc pull 2025-01-29 16:46:09 +00:00
bors 821ad97af0 Auto merge of #136248 - matthiaskrgr:rollup-leaxgfd, r=matthiaskrgr
Rollup of 8 pull requests

Successful merges:

 - #133382 (Suggest considering casting fn item as fn pointer in more cases)
 - #136092 (Test pipes also when not running on Windows and Linux simultaneously)
 - #136190 (Remove duplicated code in RISC-V asm bad-reg test)
 - #136192 (ci: remove unused windows runner)
 - #136205 (Properly check that array length is valid type during built-in unsizing in index)
 - #136211 (Update mdbook to 0.4.44)
 - #136212 (Tweak `&mut self` suggestion span)
 - #136214 (Make crate AST mutation accessible for driver callback)

r? `@ghost`
`@rustbot` modify labels: rollup
2025-01-29 16:18:29 +00:00
Matthias Krüger 71c2f1924b
Rollup merge of #136214 - momvart:driver_callback_crate_mut, r=bjorn3
Make crate AST mutation accessible for driver callback

Following  #134130, this brings back the ability to mutate AST before lowering.
2025-01-29 15:29:51 +01:00
Matthias Krüger 7049f66de5
Rollup merge of #136092 - tbu-:pr_io_pipe_test, r=joboet
Test pipes also when not running on Windows and Linux simultaneously

Fixes https://github.com/rust-lang/rust/pull/135635#pullrequestreview-2574184488.

Based on top of #135635 to avoid merge conflicts.
2025-01-29 15:29:30 +01:00
bors 6b8eacae79 Auto merge of #136117 - lnicola:sync-from-ra, r=lnicola
Subtree update of `rust-analyzer`

r? `@ghost`
2025-01-29 08:43:30 +00:00
许杰友 Jieyou Xu (Joe) ea884accae
Merge pull request #2227 from Joren-vanGoethem/master 2025-01-29 05:03:36 +00:00
许杰友 Jieyou Xu (Joe) 5000a7027c
Merge pull request #2231 from yegeunyang/#2069 2025-01-29 05:02:55 +00:00
yegeunyang 2332c8e114 Touch up a sentence 2025-01-28 22:56:52 -06:00
许杰友 Jieyou Xu (Joe) ed1fc5d8e1
Merge pull request #2232 from yegeunyang/#2114
Add a link to declare_lint! macro doc in diagnostics.md
2025-01-29 04:08:54 +00:00
许杰友 Jieyou Xu (Joe) b221a6bfad
Merge pull request #2229 from notriddle/typescript
Add some extra pointers for rustdoc frontend devs
2025-01-29 03:53:00 +00:00
yegeunyang 7e74e43eaa Add link to declare_lint! macro 2025-01-28 21:05:12 -06:00
yegeunyang 930c6a61e3 Add "Writing tests" section 2025-01-28 20:42:26 -06:00
bors 461f4dd349 Auto merge of #136011 - compiler-errors:query-norm-vaniquishes-us, r=jackh726
Revert #135914: Remove usages of `QueryNormalizer` in the compiler

Reverts #135914.

r? jackh726
2025-01-29 02:12:12 +00:00
Mohammad Omidvar 936683c1c9 Make crate AST mutation accessible for driver callback 2025-01-28 19:45:20 +00:00
Michael Goulet cd9a8cc9c3 Move outlives env computation into methods 2025-01-28 18:55:03 +00:00
Michael Howell bc8f00367e Add some extra pointers for rustdoc frontend devs 2025-01-28 11:04:26 -07:00
Ralf Jung e952da1ade
Merge pull request #4161 from oli-obk/push-vnpvrkxznklo
Bump ui test
2025-01-28 17:27:09 +00:00
bors 2eefbd017c Auto merge of #135832 - Kobzol:rustdoc-lto, r=onur-ozkan
Apply LTO config to rustdoc

Before, the LTO configuration from `config.toml` was not applied to `rustdoc`. This provides a small perf. and binary size [win](https://github.com/rust-lang/rust/pull/112049#issuecomment-2605131041) for doc builds.

Since this is configured with Cargo profiles and not rustflags, it should not break tool build cache (https://github.com/rust-lang/rust/pull/131155). I tried to run `x test miri`, `x test rustdoc` and `x test miri` and nothing was rebuilt.

r? `@onur-ozkan`
2025-01-28 17:18:00 +00:00