use relevant span when unifying ConstVarValue
s
This commit is contained in:
parent
3dbfdb0182
commit
0e84b61053
2 changed files with 9 additions and 8 deletions
|
@ -309,7 +309,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(origin.span).filter(|s| !s.is_dummy())
|
debug_assert!(!origin.span.is_dummy());
|
||||||
|
Some(origin.span)
|
||||||
} else {
|
} else {
|
||||||
bug!("unexpect const: {:?}", ct);
|
bug!("unexpect const: {:?}", ct);
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,7 +6,7 @@ use rustc_data_structures::unify::{
|
||||||
};
|
};
|
||||||
use rustc_span::def_id::DefId;
|
use rustc_span::def_id::DefId;
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::Span;
|
||||||
|
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
@ -176,17 +176,17 @@ impl<'tcx> UnifyValue for ConstVarValue<'tcx> {
|
||||||
type Error = (&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>);
|
type Error = (&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>);
|
||||||
|
|
||||||
fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
|
fn unify_values(value1: &Self, value2: &Self) -> Result<Self, Self::Error> {
|
||||||
let val = match (value1.val, value2.val) {
|
let (val, span) = match (value1.val, value2.val) {
|
||||||
(ConstVariableValue::Known { .. }, ConstVariableValue::Known { .. }) => {
|
(ConstVariableValue::Known { .. }, ConstVariableValue::Known { .. }) => {
|
||||||
bug!("equating two const variables, both of which have known values")
|
bug!("equating two const variables, both of which have known values")
|
||||||
}
|
}
|
||||||
|
|
||||||
// If one side is known, prefer that one.
|
// If one side is known, prefer that one.
|
||||||
(ConstVariableValue::Known { .. }, ConstVariableValue::Unknown { .. }) => {
|
(ConstVariableValue::Known { .. }, ConstVariableValue::Unknown { .. }) => {
|
||||||
Ok(value1.val)
|
(value1.val, value1.origin.span)
|
||||||
}
|
}
|
||||||
(ConstVariableValue::Unknown { .. }, ConstVariableValue::Known { .. }) => {
|
(ConstVariableValue::Unknown { .. }, ConstVariableValue::Known { .. }) => {
|
||||||
Ok(value2.val)
|
(value2.val, value2.origin.span)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If both sides are *unknown*, it hardly matters, does it?
|
// If both sides are *unknown*, it hardly matters, does it?
|
||||||
|
@ -200,14 +200,14 @@ impl<'tcx> UnifyValue for ConstVarValue<'tcx> {
|
||||||
// universe is the minimum of the two universes, because that is
|
// universe is the minimum of the two universes, because that is
|
||||||
// the one which contains the fewest names in scope.
|
// the one which contains the fewest names in scope.
|
||||||
let universe = cmp::min(universe1, universe2);
|
let universe = cmp::min(universe1, universe2);
|
||||||
Ok(ConstVariableValue::Unknown { universe })
|
(ConstVariableValue::Unknown { universe }, value1.origin.span)
|
||||||
}
|
}
|
||||||
}?;
|
};
|
||||||
|
|
||||||
Ok(ConstVarValue {
|
Ok(ConstVarValue {
|
||||||
origin: ConstVariableOrigin {
|
origin: ConstVariableOrigin {
|
||||||
kind: ConstVariableOriginKind::ConstInference,
|
kind: ConstVariableOriginKind::ConstInference,
|
||||||
span: DUMMY_SP,
|
span: span,
|
||||||
},
|
},
|
||||||
val,
|
val,
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue