Skip to content

ICE with specialization #39448

Closed
Closed
@gnzlbg

Description

@gnzlbg
Contributor

The following example ices the compiler:

#![feature(specialization)]

trait A : Sized {
    fn foo(self, _: Self) -> Self { self }
}

impl A for u8 {}
impl A for u16 {}

// requires specialization:
impl FromA<u8> for u16 {
    fn from(x: u8) -> u16 { x as u16 }
}

trait FromA<T> {
    fn from(T) -> Self;
}

//impl<T: A, U: A > FromA<T> for U { // no ICE
impl<T: A, U: A + FromA<T>> FromA<T> for U {  // ICE
    default fn from(x: T) -> Self { // specialization: :(
        ToA::to(x)
    }
}

trait ToA<T> {
    fn to(self) -> T;
}

// From implies Into
impl<T, U> ToA<U> for T
    where U: FromA<T>
{
    fn to(self) -> U {
        U::from(self)
    }
}

#[allow(dead_code)]
fn foo<T: A, U: A>(x: T, y: U) -> U {
    x.foo(y.to()).to()
}

fn main() {
    
    let z = foo(8u8, 1u16);
}

Activity

added
I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
on Feb 14, 2017
eminence

eminence commented on Dec 6, 2017

@eminence
Contributor

Bug triage: On current nightly (rustc 1.23.0-nightly (e97ba8328 2017-11-25)) this is no longer an ICE, instead it yields the following error:

error[E0275]: overflow evaluating the requirement `T: FromA<U>`
  --> a.rs:41:13
   |
41 |     x.foo(y.to()).to()
   |             ^^
   |
   = note: required because of the requirements on the impl of `FromA<U>` for `T`
   = note: required because of the requirements on the impl of `ToA<T>` for `U`

error: aborting due to previous error
added
E-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.
E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.
and removed
C-bugCategory: This is a bug.
I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
on Jan 25, 2019
estebank

estebank commented on Jan 25, 2019

@estebank
Contributor

This can be closed by adding the repro case as a regression test.

added a commit that references this issue on Feb 17, 2019

Rollup merge of rust-lang#58545 - emlai:regression-test-for-39448, r=…

6394d71
added a commit that references this issue on Feb 18, 2019

Rollup merge of rust-lang#58545 - emlai:regression-test-for-39448, r=…

baa01cf
added a commit that references this issue on Feb 18, 2019

Rollup merge of rust-lang#58545 - emlai:regression-test-for-39448, r=…

f2b237d

10 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-specializationArea: Trait impl specializationE-easyCall for participation: Easy difficulty. Experience needed to fix: Not much. Good first issue.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @sanxiyn@eminence@gnzlbg@estebank@Mark-Simulacrum

        Issue actions

          ICE with specialization · Issue #39448 · rust-lang/rust