Skip to content

ICE: Associated types in struct definitions ICE in trans #20470

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

Closed
nikomatsakis opened this issue Jan 3, 2015 · 1 comment · Fixed by #20706
Closed

ICE: Associated types in struct definitions ICE in trans #20470

nikomatsakis opened this issue Jan 3, 2015 · 1 comment · Fixed by #20706
Labels
A-associated-items Area: Associated items (types, constants & functions)

Comments

@nikomatsakis
Copy link
Contributor

Somebody is failing to normalize an associated type in trans somewhere.

Test case:

// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(associated_types)]

trait Test {
    type V;

    fn test(&self, value: &Self::V) -> bool;
}

///////////////////////////////////////////////////////////////////////////

struct TesterPair<T:Test> {
    tester: T,
    value: T::V,
}

impl<T:Test> TesterPair<T> {
    fn new(tester: T, value: T::V) -> TesterPair<T> {
        TesterPair { tester: tester, value: value }
    }

    fn test(&self) -> bool {
        self.tester.test(&self.value)
    }
}

///////////////////////////////////////////////////////////////////////////

struct EqU32(u32);
impl Test for EqU32 {
    type V = u32;

    fn test(&self, value: &u32) -> bool {
        self.0 == *value
    }
}

struct EqI32(i32);
impl Test for EqI32 {
    type V = i32;

    fn test(&self, value: &i32) -> bool {
        self.0 == *value
    }
}

fn main() {
    let tester = TesterPair::new(EqU32(22), 23);
    tester.test();
}

Yields:

error: internal compiler error: type_of with ty_projection
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Box<Any>', /home/nmatsakis/versioned/rust-2/src/libsyntax/diagnostic.rs:182
@nikomatsakis nikomatsakis changed the title Associated types in struct definitions die in trans ICE: Associated types in struct definitions ICE in trans Jan 3, 2015
@huonw huonw added the A-associated-items Area: Associated items (types, constants & functions) label Jan 3, 2015
@nikomatsakis
Copy link
Contributor Author

I've fixed a lot of this, but it points at a somewhat deeper problem: TypeContents doesn't understand associated types yet. I'm pondering the best way to fix that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-associated-items Area: Associated items (types, constants & functions)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants