Also consider TAIT to be uncomputable if the MIR body is tainted
This commit is contained in:
parent
e6e931dda5
commit
48491c182b
3 changed files with 42 additions and 3 deletions
|
@ -183,9 +183,17 @@ impl TaitConstraintLocator<'_> {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Use borrowck to get the type with unerased regions.
|
// Use borrowck to get the type with unerased regions.
|
||||||
let concrete_opaque_types = &self.tcx.mir_borrowck(item_def_id).concrete_opaque_types;
|
let borrowck_results = &self.tcx.mir_borrowck(item_def_id);
|
||||||
debug!(?concrete_opaque_types);
|
|
||||||
if let Some(&concrete_type) = concrete_opaque_types.get(&self.def_id) {
|
// If the body was tainted, then assume the opaque may have been constrained and just set it to error.
|
||||||
|
if let Some(guar) = borrowck_results.tainted_by_errors {
|
||||||
|
self.found =
|
||||||
|
Some(ty::OpaqueHiddenType { span: DUMMY_SP, ty: Ty::new_error(self.tcx, guar) });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug!(?borrowck_results.concrete_opaque_types);
|
||||||
|
if let Some(&concrete_type) = borrowck_results.concrete_opaque_types.get(&self.def_id) {
|
||||||
debug!(?concrete_type, "found constraint");
|
debug!(?concrete_type, "found constraint");
|
||||||
if let Some(prev) = &mut self.found {
|
if let Some(prev) = &mut self.found {
|
||||||
if concrete_type.ty != prev.ty && !(concrete_type, prev.ty).references_error() {
|
if concrete_type.ty != prev.ty && !(concrete_type, prev.ty).references_error() {
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
|
type Tait = impl Copy;
|
||||||
|
// Make sure that this TAIT isn't considered unconstrained...
|
||||||
|
|
||||||
|
fn empty_opaque() -> Tait {
|
||||||
|
if false {
|
||||||
|
match empty_opaque() {}
|
||||||
|
//~^ ERROR non-empty
|
||||||
|
}
|
||||||
|
0u8
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,17 @@
|
||||||
|
error[E0004]: non-exhaustive patterns: type `Tait` is non-empty
|
||||||
|
--> $DIR/unconstrained-due-to-bad-pattern.rs:8:15
|
||||||
|
|
|
||||||
|
LL | match empty_opaque() {}
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: the matched value is of type `Tait`
|
||||||
|
help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern as shown
|
||||||
|
|
|
||||||
|
LL ~ match empty_opaque() {
|
||||||
|
LL + _ => todo!(),
|
||||||
|
LL + }
|
||||||
|
|
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0004`.
|
Loading…
Add table
Add a link
Reference in a new issue