Skip to content

Fix ICE in resolving associated items as non-bindings #135663

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

Merged
merged 1 commit into from
Jan 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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: ();
}
Loading