Skip to content

Commit

Permalink
Unrolled build for rust-lang#135663
Browse files Browse the repository at this point in the history
Rollup merge of rust-lang#135663 - frank-king:fix/135614, r=compiler-errors

Fix ICE in resolving associated items as non-bindings

Fixes rust-lang#135614 so that imported associated functions of traits can be shadowed by local bindings and associated constants of traits can be used in patterns.
  • Loading branch information
rust-timer authored Jan 19, 2025
2 parents 1d55f72 + 067cac9 commit 20053bd
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 3 deletions.
6 changes: 3 additions & 3 deletions compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3960,7 +3960,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
match res {
Res::SelfCtor(_) // See #70549.
| Res::Def(
DefKind::Ctor(_, CtorKind::Const) | DefKind::Const | DefKind::ConstParam,
DefKind::Ctor(_, CtorKind::Const) | DefKind::Const | DefKind::AssocConst | DefKind::ConstParam,
_,
) if is_syntactic_ambiguity => {
// Disambiguate in favor of a unit struct/variant or constant pattern.
Expand All @@ -3969,7 +3969,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
}
Some(res)
}
Res::Def(DefKind::Ctor(..) | DefKind::Const | DefKind::Static { .. }, _) => {
Res::Def(DefKind::Ctor(..) | DefKind::Const | DefKind::AssocConst | DefKind::Static { .. }, _) => {
// This is unambiguously a fresh binding, either syntactically
// (e.g., `IDENT @ PAT` or `ref IDENT`) or because `IDENT` resolves
// to something unusable as a pattern (e.g., constructor function),
Expand Down Expand Up @@ -4005,7 +4005,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
);
None
}
Res::Def(DefKind::Fn, _) | Res::Local(..) | Res::Err => {
Res::Def(DefKind::Fn | DefKind::AssocFn, _) | Res::Local(..) | Res::Err => {
// These entities are explicitly allowed to be shadowed by fresh bindings.
None
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
error[E0005]: refutable pattern in local binding
--> $DIR/resolve-issue-135614-assoc-const.rs:21:9
|
LL | let DEFAULT: u32 = 0;
| ^^^^^^^ pattern `1_u32..=u32::MAX` not covered
LL | const DEFAULT: u32 = 0;
| ------------------ missing patterns are not covered because `DEFAULT` is interpreted as a constant pattern, not a new variable
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
= note: for more information, visit https://doc.rust-lang.org/book/ch19-02-refutability.html
= note: the matched value is of type `u32`
help: introduce a variable instead
|
LL | let DEFAULT_var: u32 = 0;
| ~~~~~~~~~~~

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0005`.
30 changes: 30 additions & 0 deletions tests/ui/resolve/resolve-issue-135614-assoc-const.normal.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
error[E0658]: `use` associated items of traits is unstable
--> $DIR/resolve-issue-135614-assoc-const.rs:6:5
|
LL | use MyDefault::DEFAULT;
| ^^^^^^^^^^^^^^^^^^
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error[E0005]: refutable pattern in local binding
--> $DIR/resolve-issue-135614-assoc-const.rs:21:9
|
LL | let DEFAULT: u32 = 0;
| ^^^^^^^ pattern `1_u32..=u32::MAX` not covered
LL | const DEFAULT: u32 = 0;
| ------------------ missing patterns are not covered because `DEFAULT` is interpreted as a constant pattern, not a new variable
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
= note: for more information, visit https://doc.rust-lang.org/book/ch19-02-refutability.html
= note: the matched value is of type `u32`
help: introduce a variable instead
|
LL | let DEFAULT_var: u32 = 0;
| ~~~~~~~~~~~

error: aborting due to 2 previous errors

Some errors have detailed explanations: E0005, E0658.
For more information about an error, try `rustc --explain E0005`.
30 changes: 30 additions & 0 deletions tests/ui/resolve/resolve-issue-135614-assoc-const.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//@ revisions: normal import_trait_associated_functions
#![cfg_attr(import_trait_associated_functions, feature(import_trait_associated_functions))]

// Makes sure that imported constant can be used in pattern bindings.

use MyDefault::DEFAULT; //[normal]~ ERROR `use` associated items of traits is unstable

trait MyDefault {
const DEFAULT: Self;
}

impl MyDefault for u32 {
const DEFAULT: u32 = 0;
}

impl MyDefault for () {
const DEFAULT: () = ();
}

fn foo(x: u32) -> u32 {
let DEFAULT: u32 = 0; //~ ERROR refutable pattern in local binding
const DEFAULT: u32 = 0;
if let DEFAULT = x { DEFAULT } else { 1 }
}

fn bar() {
let DEFAULT = ();
}

fn main() {}
13 changes: 13 additions & 0 deletions tests/ui/resolve/resolve-issue-135614.normal.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error[E0658]: `use` associated items of traits is unstable
--> $DIR/resolve-issue-135614.rs:7:5
|
LL | use A::b;
| ^^^^
|
= note: see issue #134691 <https://github.com/rust-lang/rust/issues/134691> for more information
= help: add `#![feature(import_trait_associated_functions)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0658`.
15 changes: 15 additions & 0 deletions tests/ui/resolve/resolve-issue-135614.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//@ revisions: normal import_trait_associated_functions
//@[import_trait_associated_functions] check-pass
#![cfg_attr(import_trait_associated_functions, feature(import_trait_associated_functions))]

// Makes sure that imported associated functions are shadowed by the local declarations.

use A::b; //[normal]~ ERROR `use` associated items of traits is unstable

trait A {
fn b() {}
}

fn main() {
let b: ();
}

0 comments on commit 20053bd

Please sign in to comment.