diff options
| author | bors <bors@rust-lang.org> | 2019-09-09 00:58:38 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-09-09 00:58:38 +0000 |
| commit | 7eb65dfe66e56618f87531cdc378865135c47efb (patch) | |
| tree | 93b0dedbfd2a054b8de311e8e8b51e30dcc9dfd0 | |
| parent | a6624ed9806fe4caa10de5b94e590f71a4a1eab9 (diff) | |
| parent | c44ffafab902e687ef01d2366a7de7237e25245c (diff) | |
| download | rust-7eb65dfe66e56618f87531cdc378865135c47efb.tar.gz rust-7eb65dfe66e56618f87531cdc378865135c47efb.zip | |
Auto merge of #64108 - estebank:issue-36836, r=Centril
Do not complain about unconstrained params when Self is Ty Error Fix #36836.
| -rw-r--r-- | src/librustc_typeck/constrained_generic_params.rs | 18 | ||||
| -rw-r--r-- | src/librustc_typeck/impl_wf_check.rs | 11 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-36836.rs | 15 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-36836.stderr | 9 |
4 files changed, 42 insertions, 11 deletions
diff --git a/src/librustc_typeck/constrained_generic_params.rs b/src/librustc_typeck/constrained_generic_params.rs index 79a04b9423a..dd44f86717f 100644 --- a/src/librustc_typeck/constrained_generic_params.rs +++ b/src/librustc_typeck/constrained_generic_params.rs @@ -20,10 +20,10 @@ impl From<ty::ParamConst> for Parameter { } /// Returns the set of parameters constrained by the impl header. -pub fn parameters_for_impl<'tcx>(impl_self_ty: Ty<'tcx>, - impl_trait_ref: Option<ty::TraitRef<'tcx>>) - -> FxHashSet<Parameter> -{ +pub fn parameters_for_impl<'tcx>( + impl_self_ty: Ty<'tcx>, + impl_trait_ref: Option<ty::TraitRef<'tcx>>, +) -> FxHashSet<Parameter> { let vec = match impl_trait_ref { Some(tr) => parameters_for(&tr, false), None => parameters_for(&impl_self_ty, false), @@ -36,12 +36,10 @@ pub fn parameters_for_impl<'tcx>(impl_self_ty: Ty<'tcx>, /// uniquely determined by `t` (see RFC 447). If it is true, return the list /// of parameters whose values are needed in order to constrain `ty` - these /// differ, with the latter being a superset, in the presence of projections. -pub fn parameters_for<'tcx, T>(t: &T, - include_nonconstraining: bool) - -> Vec<Parameter> - where T: TypeFoldable<'tcx> -{ - +pub fn parameters_for<'tcx>( + t: &impl TypeFoldable<'tcx>, + include_nonconstraining: bool, +) -> Vec<Parameter> { let mut collector = ParameterCollector { parameters: vec![], include_nonconstraining, diff --git a/src/librustc_typeck/impl_wf_check.rs b/src/librustc_typeck/impl_wf_check.rs index fcfd9adef54..bc0f17c3bf0 100644 --- a/src/librustc_typeck/impl_wf_check.rs +++ b/src/librustc_typeck/impl_wf_check.rs @@ -12,7 +12,7 @@ use crate::constrained_generic_params as cgp; use rustc::hir; use rustc::hir::itemlikevisit::ItemLikeVisitor; use rustc::hir::def_id::DefId; -use rustc::ty::{self, TyCtxt}; +use rustc::ty::{self, TyCtxt, TypeFoldable}; use rustc::ty::query::Providers; use rustc::util::nodemap::{FxHashMap, FxHashSet}; use std::collections::hash_map::Entry::{Occupied, Vacant}; @@ -99,6 +99,15 @@ fn enforce_impl_params_are_constrained( ) { // Every lifetime used in an associated type must be constrained. let impl_self_ty = tcx.type_of(impl_def_id); + if impl_self_ty.references_error() { + // Don't complain about unconstrained type params when self ty isn't known due to errors. + // (#36836) + tcx.sess.delay_span_bug( + tcx.def_span(impl_def_id), + "potentially unconstrained type parameters weren't evaluated", + ); + return; + } let impl_generics = tcx.generics_of(impl_def_id); let impl_predicates = tcx.predicates_of(impl_def_id); let impl_trait_ref = tcx.impl_trait_ref(impl_def_id); diff --git a/src/test/ui/issues/issue-36836.rs b/src/test/ui/issues/issue-36836.rs new file mode 100644 index 00000000000..99c56213153 --- /dev/null +++ b/src/test/ui/issues/issue-36836.rs @@ -0,0 +1,15 @@ +// Previously, in addition to the real cause of the problem as seen below, +// the compiler would tell the user: +// +// ``` +// error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or +// predicates +// ``` +// +// With this test, we check that only the relevant error is emitted. + +trait Foo {} + +impl<T> Foo for Bar<T> {} //~ ERROR cannot find type `Bar` in this scope + +fn main() {} diff --git a/src/test/ui/issues/issue-36836.stderr b/src/test/ui/issues/issue-36836.stderr new file mode 100644 index 00000000000..418194fac99 --- /dev/null +++ b/src/test/ui/issues/issue-36836.stderr @@ -0,0 +1,9 @@ +error[E0412]: cannot find type `Bar` in this scope + --> $DIR/issue-36836.rs:13:17 + | +LL | impl<T> Foo for Bar<T> {} + | ^^^ not found in this scope + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0412`. |
