Auto merge of #49091 - nikomatsakis:issue-49043-ty-infer-hash, r=michaelwoerister
extend stable hasher to support `CanonicalTy` Fixes #49043 r? @michaelwoerister
This commit is contained in:
commit
15add366fa
4 changed files with 72 additions and 3 deletions
|
|
@ -902,13 +902,59 @@ for ty::TypeVariants<'gcx>
|
|||
TyForeign(def_id) => {
|
||||
def_id.hash_stable(hcx, hasher);
|
||||
}
|
||||
TyInfer(..) => {
|
||||
bug!("ty::TypeVariants::hash_stable() - Unexpected variant {:?}.", *self)
|
||||
TyInfer(infer_ty) => {
|
||||
infer_ty.hash_stable(hcx, hasher);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl_stable_hash_for!(enum ty::InferTy {
|
||||
TyVar(a),
|
||||
IntVar(a),
|
||||
FloatVar(a),
|
||||
FreshTy(a),
|
||||
FreshIntTy(a),
|
||||
FreshFloatTy(a),
|
||||
CanonicalTy(a),
|
||||
});
|
||||
|
||||
impl<'a, 'gcx> HashStable<StableHashingContext<'a>>
|
||||
for ty::TyVid
|
||||
{
|
||||
fn hash_stable<W: StableHasherResult>(&self,
|
||||
_hcx: &mut StableHashingContext<'a>,
|
||||
_hasher: &mut StableHasher<W>) {
|
||||
// TyVid values are confined to an inference context and hence
|
||||
// should not be hashed.
|
||||
bug!("ty::TypeVariants::hash_stable() - can't hash a TyVid {:?}.", *self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'gcx> HashStable<StableHashingContext<'a>>
|
||||
for ty::IntVid
|
||||
{
|
||||
fn hash_stable<W: StableHasherResult>(&self,
|
||||
_hcx: &mut StableHashingContext<'a>,
|
||||
_hasher: &mut StableHasher<W>) {
|
||||
// IntVid values are confined to an inference context and hence
|
||||
// should not be hashed.
|
||||
bug!("ty::TypeVariants::hash_stable() - can't hash an IntVid {:?}.", *self)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'gcx> HashStable<StableHashingContext<'a>>
|
||||
for ty::FloatVid
|
||||
{
|
||||
fn hash_stable<W: StableHasherResult>(&self,
|
||||
_hcx: &mut StableHashingContext<'a>,
|
||||
_hasher: &mut StableHasher<W>) {
|
||||
// FloatVid values are confined to an inference context and hence
|
||||
// should not be hashed.
|
||||
bug!("ty::TypeVariants::hash_stable() - can't hash a FloatVid {:?}.", *self)
|
||||
}
|
||||
}
|
||||
|
||||
impl_stable_hash_for!(struct ty::ParamTy {
|
||||
idx,
|
||||
name
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ macro_rules! __impl_stable_hash_field {
|
|||
|
||||
#[macro_export]
|
||||
macro_rules! impl_stable_hash_for {
|
||||
(enum $enum_name:path { $( $variant:ident $( ( $($arg:ident),* ) )* ),* }) => {
|
||||
(enum $enum_name:path { $( $variant:ident $( ( $($arg:ident),* ) )* ),* $(,)* }) => {
|
||||
impl<'a, 'tcx> ::rustc_data_structures::stable_hasher::HashStable<$crate::ich::StableHashingContext<'a>> for $enum_name {
|
||||
#[inline]
|
||||
fn hash_stable<W: ::rustc_data_structures::stable_hasher::StableHasherResult>(&self,
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ impl<'cx, 'gcx, 'tcx> At<'cx, 'gcx, 'tcx> {
|
|||
let gcx = tcx.global_tcx();
|
||||
let (c_ty, orig_values) = self.infcx.canonicalize_query(&self.param_env.and(ty));
|
||||
let span = self.cause.span;
|
||||
debug!("c_ty = {:?}", c_ty);
|
||||
match &gcx.dropck_outlives(c_ty) {
|
||||
Ok(result) if result.is_proven() => {
|
||||
match self.infcx.instantiate_query_result(
|
||||
|
|
|
|||
22
src/test/incremental/issue-49043.rs
Normal file
22
src/test/incremental/issue-49043.rs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2016 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.
|
||||
|
||||
// Regression test for hashing involving canonical variables. In this
|
||||
// test -- which has an intensional error -- the type of the value
|
||||
// being dropped winds up including a type variable. Canonicalization
|
||||
// would then produce a `?0` which -- in turn -- triggered an ICE in
|
||||
// hashing.
|
||||
|
||||
// revisions:cfail1
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world! {}",*thread_rng().choose(&[0, 1, 2, 3]).unwrap());
|
||||
//[cfail1]~^ ERROR cannot find function `thread_rng`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue