From b9f7ac591c798c5f4c694ac5db6928059b21ddd0 Mon Sep 17 00:00:00 2001 From: "Meyer S. Jacobs" Date: Mon, 14 Apr 2014 17:39:52 -0700 Subject: [PATCH] Fixes #13507 Fixes hashing of DefId for ty_enum. Adds tests for cross-crate TypeId equivalence for various types. --- src/librustc/middle/ty.rs | 2 +- src/test/auxiliary/issue13507.rs | 100 +++++++++++++++++++++++++++++ src/test/run-pass/issue-13507-2.rs | 38 +++++++++++ 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 src/test/auxiliary/issue13507.rs create mode 100644 src/test/run-pass/issue-13507-2.rs diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index af53c31ad4eec..9c0c2d484a0ac 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -4565,7 +4565,7 @@ pub fn hash_crate_independent(tcx: &ctxt, t: t, svh: &Svh) -> u64 { } ty_enum(d, _) => { byte!(8); - hash!(d) + did(&mut state, d); } ty_box(_) => { byte!(9); diff --git a/src/test/auxiliary/issue13507.rs b/src/test/auxiliary/issue13507.rs new file mode 100644 index 0000000000000..be066187be52b --- /dev/null +++ b/src/test/auxiliary/issue13507.rs @@ -0,0 +1,100 @@ +// Copyright 2012-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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub mod testtypes { + use std::intrinsics::TypeId; + + pub fn type_ids() -> Vec { + let mut ids = vec!(); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::<&'static FooTrait>()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids + } + + // Tests ty_nil + pub type FooNil = (); + + // Skipping ty_bot + + // Tests ty_bool + pub type FooBool = bool; + + // Tests ty_char + pub type FooChar = char; + + // Tests ty_int (does not test all variants of IntTy) + pub type FooInt = int; + + // Tests ty_uint (does not test all variants of UintTy) + pub type FooUint = uint; + + // Tests ty_float (does not test all variants of FloatTy) + pub type FooFloat = f64; + + // For ty_str, what kind of string should I use? &'static str? ~str? Raw str? + + // Tests ty_enum + pub enum FooEnum { + VarA(uint), + VarB(uint, uint) + } + + // Skipping ty_box + + // Tests ty_uniq (of u8) + pub type FooUniq = ~u8; + + // As with ty_str, what type should be used for ty_vec? + + // Tests ty_ptr + pub type FooPtr = *u8; + + // Skipping ty_rptr + + // Skipping ty_bare_fn (how do you get a bare function type, rather than proc or closure?) + + // Tests ty_closure (does not test all types of closures) + pub type FooClosure = |arg: u8|: 'static -> u8; + + // Tests ty_trait + pub trait FooTrait { + fn foo_method(&self) -> uint; + fn foo_static_method() -> uint; + } + + // Tests ty_struct + pub struct FooStruct { + pub pub_foo_field: uint, + foo_field: uint + } + + // Tests ty_tup + pub type FooTuple = (u8, i8, bool); + + // Skipping ty_param + + // Skipping ty_self + + // Skipping ty_self + + // Skipping ty_infer + + // Skipping ty_err +} diff --git a/src/test/run-pass/issue-13507-2.rs b/src/test/run-pass/issue-13507-2.rs new file mode 100644 index 0000000000000..626381c334dd7 --- /dev/null +++ b/src/test/run-pass/issue-13507-2.rs @@ -0,0 +1,38 @@ +// Copyright 2012-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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:issue13507.rs +extern crate issue13507; +use issue13507::testtypes; + +use std::intrinsics::TypeId; + +pub fn type_ids() -> Vec { + let mut ids = vec!(); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::<&'static testtypes::FooTrait>()); + ids.push(TypeId::of::()); + ids.push(TypeId::of::()); + ids +} + +pub fn main() { + let othercrate = testtypes::type_ids(); + let thiscrate = type_ids(); + assert_eq!(thiscrate, othercrate); +}