Create a FreshFloatTy separate from FreshIntTy
There is no subtyping relationship between the types (or their non-freshened variants), so they can not be merged. Fixes #22645 Fixes #24352 Fixes #23825 Should fix #25235 (no test in issue). Should fix #19976 (test is outdated).
This commit is contained in:
parent
2a5a320bab
commit
36eb09f356
8 changed files with 90 additions and 11 deletions
|
|
@ -129,11 +129,12 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeFreshener<'a, 'tcx> {
|
|||
.probe(v)
|
||||
.map(|v| v.to_type(tcx)),
|
||||
ty::FloatVar(v),
|
||||
ty::FreshIntTy)
|
||||
ty::FreshFloatTy)
|
||||
}
|
||||
|
||||
ty::ty_infer(ty::FreshTy(c)) |
|
||||
ty::ty_infer(ty::FreshIntTy(c)) => {
|
||||
ty::ty_infer(ty::FreshIntTy(c)) |
|
||||
ty::ty_infer(ty::FreshFloatTy(c)) => {
|
||||
if c >= self.freshen_count {
|
||||
tcx.sess.bug(
|
||||
&format!("Encountered a freshend type with id {} \
|
||||
|
|
|
|||
|
|
@ -1685,7 +1685,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
ty::ty_err => ok_if(Vec::new()),
|
||||
|
||||
ty::ty_infer(ty::FreshTy(_))
|
||||
| ty::ty_infer(ty::FreshIntTy(_)) => {
|
||||
| ty::ty_infer(ty::FreshIntTy(_))
|
||||
| ty::ty_infer(ty::FreshFloatTy(_)) => {
|
||||
self.tcx().sess.bug(
|
||||
&format!(
|
||||
"asked to assemble builtin bounds of unexpected type: {}",
|
||||
|
|
@ -1747,7 +1748,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
ty::ty_projection(..) |
|
||||
ty::ty_infer(ty::TyVar(_)) |
|
||||
ty::ty_infer(ty::FreshTy(_)) |
|
||||
ty::ty_infer(ty::FreshIntTy(_)) => {
|
||||
ty::ty_infer(ty::FreshIntTy(_)) |
|
||||
ty::ty_infer(ty::FreshFloatTy(_)) => {
|
||||
self.tcx().sess.bug(
|
||||
&format!(
|
||||
"asked to assemble constituent types of unexpected type: {}",
|
||||
|
|
|
|||
|
|
@ -1688,11 +1688,8 @@ pub enum InferTy {
|
|||
/// unbound type variable. This is convenient for caching etc. See
|
||||
/// `middle::infer::freshen` for more details.
|
||||
FreshTy(u32),
|
||||
|
||||
// FIXME -- once integral fallback is impl'd, we should remove
|
||||
// this type. It's only needed to prevent spurious errors for
|
||||
// integers whose type winds up never being constrained.
|
||||
FreshIntTy(u32),
|
||||
FreshFloatTy(u32)
|
||||
}
|
||||
|
||||
#[derive(Clone, RustcEncodable, RustcDecodable, PartialEq, Eq, Hash, Debug, Copy)]
|
||||
|
|
@ -1764,6 +1761,7 @@ impl fmt::Debug for InferTy {
|
|||
FloatVar(ref v) => v.fmt(f),
|
||||
FreshTy(v) => write!(f, "FreshTy({:?})", v),
|
||||
FreshIntTy(v) => write!(f, "FreshIntTy({:?})", v),
|
||||
FreshFloatTy(v) => write!(f, "FreshFloatTy({:?})", v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3765,7 +3763,7 @@ pub fn type_contents<'tcx>(cx: &ctxt<'tcx>, ty: Ty<'tcx>) -> TypeContents {
|
|||
}
|
||||
|
||||
// Scalar and unique types are sendable, and durable
|
||||
ty_infer(ty::FreshIntTy(_)) |
|
||||
ty_infer(ty::FreshIntTy(_)) | ty_infer(ty::FreshFloatTy(_)) |
|
||||
ty_bool | ty_int(_) | ty_uint(_) | ty_float(_) |
|
||||
ty_bare_fn(..) | ty::ty_char => {
|
||||
TC::None
|
||||
|
|
@ -4315,6 +4313,7 @@ pub fn type_is_fresh(ty: Ty) -> bool {
|
|||
match ty.sty {
|
||||
ty_infer(FreshTy(_)) => true,
|
||||
ty_infer(FreshIntTy(_)) => true,
|
||||
ty_infer(FreshFloatTy(_)) => true,
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
|
|
@ -5016,6 +5015,7 @@ pub fn ty_sort_string<'tcx>(cx: &ctxt<'tcx>, ty: Ty<'tcx>) -> String {
|
|||
ty_infer(FloatVar(_)) => "floating-point variable".to_string(),
|
||||
ty_infer(FreshTy(_)) => "skolemized type".to_string(),
|
||||
ty_infer(FreshIntTy(_)) => "skolemized integral type".to_string(),
|
||||
ty_infer(FreshFloatTy(_)) => "skolemized floating-point type".to_string(),
|
||||
ty_projection(_) => "associated type".to_string(),
|
||||
ty_param(ref p) => {
|
||||
if p.space == subst::SelfSpace {
|
||||
|
|
|
|||
|
|
@ -67,7 +67,8 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Match<'a, 'tcx> {
|
|||
|
||||
match (&a.sty, &b.sty) {
|
||||
(_, &ty::ty_infer(ty::FreshTy(_))) |
|
||||
(_, &ty::ty_infer(ty::FreshIntTy(_))) => {
|
||||
(_, &ty::ty_infer(ty::FreshIntTy(_))) |
|
||||
(_, &ty::ty_infer(ty::FreshFloatTy(_))) => {
|
||||
Ok(a)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -349,7 +349,8 @@ pub fn ty_to_string<'tcx>(cx: &ctxt<'tcx>, typ: &ty::TyS<'tcx>) -> String {
|
|||
ty::FloatVar(ref vid) if print_var_ids => vid.repr(cx),
|
||||
ty::TyVar(_) | ty::IntVar(_) | ty::FloatVar(_) => format!("_"),
|
||||
ty::FreshTy(v) => format!("FreshTy({})", v),
|
||||
ty::FreshIntTy(v) => format!("FreshIntTy({})", v)
|
||||
ty::FreshIntTy(v) => format!("FreshIntTy({})", v),
|
||||
ty::FreshFloatTy(v) => format!("FreshFloatTy({})", v)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
29
src/test/compile-fail/issue-22645.rs
Normal file
29
src/test/compile-fail/issue-22645.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
use std::ops::Add;
|
||||
|
||||
trait Scalar {}
|
||||
impl Scalar for f64 {}
|
||||
|
||||
struct Bob;
|
||||
|
||||
impl<RHS: Scalar> Add <RHS> for Bob {
|
||||
type Output = Bob;
|
||||
fn add(self, rhs : RHS) -> Bob {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let b = Bob + 3.5;
|
||||
b + 3 //~ ERROR: is not implemented
|
||||
//~^ ERROR: is not implemented
|
||||
//~^^ ERROR: is not implemented
|
||||
//~^^^ ERROR: mismatched types
|
||||
}
|
||||
15
src/test/compile-fail/issue-24352.rs
Normal file
15
src/test/compile-fail/issue-24352.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
fn main() {
|
||||
1.0f64 - 1.0;
|
||||
1.0f64 - 1 //~ ERROR: is not implemented
|
||||
//~^ ERROR: is not implemented
|
||||
}
|
||||
30
src/test/run-pass/issue-23825.rs
Normal file
30
src/test/run-pass/issue-23825.rs
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright 2015 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.
|
||||
|
||||
trait Stringify {
|
||||
fn to_string(&self) -> String;
|
||||
}
|
||||
|
||||
impl Stringify for u32 {
|
||||
fn to_string(&self) -> String { format!("u32: {}", *self) }
|
||||
}
|
||||
|
||||
impl Stringify for f32 {
|
||||
fn to_string(&self) -> String { format!("f32: {}", *self) }
|
||||
}
|
||||
|
||||
fn print<T: Stringify>(x: T) -> String {
|
||||
x.to_string()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
assert_eq!(&print(5), "u32: 5");
|
||||
assert_eq!(&print(5.0), "f32: 5");
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue