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

ICE: called Option::unwrap() on a None value in compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs #125757

Closed
cushionbadak opened this issue May 30, 2024 · 2 comments · Fixed by #125774
Assignees
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@cushionbadak
Copy link

cushionbadak commented May 30, 2024

Code

(hand-reduced)

  • #[derive(Default)] added at struct MyStruct, to reduce unrelated error message
#![feature(specialization)]
#![allow(incomplete_features)]

#[derive(Default)]
struct MyStruct {}

trait MyTrait {
    type MyType: Default;
}

impl MyTrait for i32 {
    default type MyType = MyStruct;
}

struct Wrapper2<'a, T, const C: <i32 as MyTrait>::MyType> {
    x: &'a T,
}

impl<'a, const C: usize> Wrapper2<'a, i8, C> {}

fn main() {}
(original)

#![feature(specialization)]
#![allow(incomplete_features)]

struct MyStruct {}

trait MyTrait {
    type MyType: Default;
}

impl MyTrait for i32 {
    default type MyType = MyStruct;
    //~^ ERROR: the trait bound `MyStruct: Default` is not satisfied
}

fn main() {
    let _x: <i32 as MyTrait>::MyType = <i32 as MyTrait>::MyType::default();
}


//@ run-rustfix
fn foo<T: Default>(list: &mut Vec<T>) {
    let mut cloned_items = Vec::new();
    for v in list.iter() {
        cloned_items.push(v.clone())
    }
    list.push(T::default());
    //~^ ERROR cannot borrow `*list` as mutable because it is also borrowed as immutable
    drop(cloned_items);
}
fn bar<T: std::fmt::Display>(x: T) {
    let a = &x;
    let b = a.clone();
    drop(x);
    //~^ ERROR cannot move out of `x` because it is borrowed
    println!("{b}");
}
#[derive(Debug)]
struct A;
fn qux(x: A) {
    let a = &x;
    let b = a.clone();
    drop(x);
    //~^ ERROR cannot move out of `x` because it is borrowed
    println!("{b:?}");
}
fn main() {
    foo(&mut vec![1, 2, 3]);
    bar("");
    qux(A);
}


// Test for issue 81576
// Remove generic arguments if no method is found for all possible generic argument

use std::marker::PhantomData;

struct Wrapper2<'a, T, const C: <i32 as MyTrait>::MyType> {
    x: &'a T,
}

impl<'a, const C: usize> Wrapper2<'a, i8, C> {
    fn method(&self) {}
}

impl<'a, const C: usize> Wrapper2<'a, i16, C> {
    fn method(&self) {}
}

impl<'a, const C: usize> Wrapper2<'a, i32, C> {
    fn method(&self) {}
}
struct Wrapper<T>(T);

impl Wrapper<i8> {
    fn method(&self) {}
}

impl Wrapper<i16> {
    fn method(&self) {}
}

impl Wrapper<i32> {
    fn method(&self) {}
}

impl Wrapper<i64> {
    fn method(&self) {}
}

impl Wrapper<u8> {
    fn method(&self) {}
}

impl Wrapper<u16> {
    fn method(&self) {}
}

struct Point<T> {
    x: T,
    y: T,
}

impl Point<std::fmt::Display> {
    fn distance(&self) -> f64 {
        self.x.hypot(self.y)
    }
}

struct Other;

impl Other {
    fn other(&self) {}
}

struct Struct<T> {
    _phatom: PhantomData<T>,
}

impl<T> Default for Struct<T> {
    fn default() -> Self {
        Self { _phatom: PhantomData }
    }
}

impl<T: Clone + Copy + PartialEq + Eq + PartialOrd + Ord> Struct<T> {
    fn method(&self) {}
}

fn main() {
    let point_f64 = Point { x: 1_f64, y: 1_f64 };
    let d = point_f64.distance();
    let point_i32 = Point { x: 1_i32, y: 1_i32 };
    let d = point_i32.distance();
    //~^ ERROR no method named `distance` found for struct `Point<i32>
    let d = point_i32.other();
    //~^ ERROR no method named `other` found for struct `Point
    let v = vec![1, 2, 3];
    v.iter().map(Box::new(|x| x * x) as Box<dyn Fn(&i32) -> i32>).extend(std::iter::once(100));
    //~^ ERROR no method named `extend` found for struct `Map
    let wrapper = Wrapper(true);
    wrapper.method();
    //~^ ERROR no method named `method` found for struct `Wrapper<bool>
    wrapper.other();
    //~^ ERROR no method named `other` found for struct `Wrapper
    let boolean = true;
    let wrapper = Wrapper2::<'_, _, 3> { x: &boolean };
    wrapper.method();
    //~^ ERROR no method named `method` found for struct `Wrapper2<'_, bool, 3>
    wrapper.other();
    //~^ ERROR no method named `other` found for struct `Wrapper2
    let a = vec![1, 2, 3];
    a.not_found();
    //~^ ERROR no method named `not_found` found for struct `Vec
    let s = Struct::<f64>::default();
    s.method();
    //~^ ERROR the method `method` exists for struct `Struct<f64>`, but its trait bounds were not satisfied
}

Meta

rustc --version --verbose:

rustc 1.80.0-nightly (debd22da6 2024-05-29)
binary: rustc
commit-hash: debd22da66cfa97c74040ebf68e420672ac8560e
commit-date: 2024-05-29
host: x86_64-apple-darwin
release: 1.80.0-nightly
LLVM version: 18.1.6

Error output

Command: rustc

error: `<i32 as MyTrait>::MyType` is forbidden as the type of a const generic parameter
  --> r_note_and_explain_655790.rs:15:33
   |
15 | struct Wrapper2<'a, T, const C: <i32 as MyTrait>::MyType> {
   |                                 ^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: the only supported types are integers, `bool` and `char`
Backtrace

thread 'rustc' panicked at compiler/rustc_infer/src/infer/error_reporting/note_and_explain.rs:666:37:
called `Option::unwrap()` on a `None` value
stack backtrace:
   0: _rust_begin_unwind
   1: core::panicking::panic_fmt
   2: core::panicking::panic
   3: core::option::unwrap_failed
   4: <rustc_infer::infer::error_reporting::TypeErrCtxt>::expected_projection
   5: <rustc_infer::infer::error_reporting::TypeErrCtxt>::note_and_explain_type_err
   6: <rustc_infer::infer::error_reporting::TypeErrCtxt>::note_type_err
   7: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::type_err_ctxt_ext::TypeErrCtxtExt>::report_selection_error
   8: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::type_err_ctxt_ext::InferCtxtPrivExt>::report_fulfillment_error
   9: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::type_err_ctxt_ext::TypeErrCtxtExt>::report_fulfillment_errors
  10: <rustc_trait_selection::traits::engine::ObligationCtxt>::assumed_wf_types_and_report_errors
  11: rustc_hir_analysis::check::wfcheck::check_well_formed
      [... omitted 1 frame ...]
  12: rustc_middle::query::plumbing::query_ensure_error_guaranteed::<rustc_query_system::query::caches::VecCache<rustc_hir::hir_id::OwnerId, rustc_middle::query::erase::Erased<[u8; 1]>>, ()>
  13: rustc_hir_analysis::check::wfcheck::check_mod_type_wf
      [... omitted 1 frame ...]
  14: rustc_hir_analysis::check_crate
  15: rustc_interface::passes::run_required_analyses
  16: rustc_interface::passes::analysis
      [... omitted 1 frame ...]
  17: <rustc_interface::queries::QueryResult<&rustc_middle::ty::context::GlobalCtxt>>::enter::<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#0}::{closure#1}::{closure#3}>
  18: rustc_interface::interface::run_compiler::<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: please make sure that you have updated to the latest nightly

note: please attach the file at `/Volumes/T7/workspace/240529_100chaos_tree_combine_typ/icefiles/rustc-ice-2024-05-30T06_24_54-87773.txt` to your bug report

query stack during panic:
#0 [check_well_formed] checking that `<impl at r_note_and_explain_655790.rs:19:1: 19:45>` is well-formed
#1 [check_mod_type_wf] checking that types are well-formed in top-level module
#2 [analysis] running analysis passes on this crate
end of query stack
error: aborting due to 1 previous error

Note

@cushionbadak cushionbadak added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels May 30, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label May 30, 2024
@mu001999
Copy link
Contributor

Reduced:

#![feature(specialization)]
#![allow(incomplete_features)]

trait MyTrait {
    type MyType;
}

impl MyTrait for () {
    default type MyType = i32;
}

struct Wrapper<const C: <() as MyTrait>::MyType> {}

impl<const C: usize> Wrapper<C> {}

fn main() {}

@mu001999
Copy link
Contributor

@rustbot claim

@bors bors closed this as completed in 4aafc11 May 31, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this issue May 31, 2024
Rollup merge of rust-lang#125774 - mu001999-contrib:fix/125757, r=compiler-errors

Avoid unwrap diag.code directly in note_and_explain_type_err

<!--
If this PR is related to an unstable feature or an otherwise tracked effort,
please link to the relevant tracking issue here. If you don't know of a related
tracking issue or there are none, feel free to ignore this.

This PR will get automatically assigned to a reviewer. In case you would like
a specific user to review your work, you can assign it to them by using

    r​? <reviewer name>
-->

Fixes rust-lang#125757
@fmease fmease removed the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Jun 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants