From 4a6dc8e20328ecb627a519c6704afadcf378a72b Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Fri, 12 Mar 2021 12:02:29 +0000 Subject: [PATCH] Only allow tait defining uses in function and method return position --- compiler/rustc_typeck/src/check/check.rs | 22 ++++++++++-- .../rustc_typeck/src/check/fn_ctxt/_impl.rs | 19 ++++++++-- .../rustc_typeck/src/check/gather_locals.rs | 13 +++---- compiler/rustc_typeck/src/check/mod.rs | 13 +++---- .../feature-gate-type_alias_impl_trait.rs | 4 +-- .../feature-gate-type_alias_impl_trait.stderr | 29 ++++++++------- .../ui/generator/layout-error.min_tait.stderr | 35 +++++++++++++++++-- src/test/ui/generator/layout-error.rs | 7 ++-- ...ata-sufficient-for-layout.full_tait.stderr | 12 +++++-- ...data-sufficient-for-layout.min_tait.stderr | 24 +++++++++++++ .../metadata-sufficient-for-layout.rs | 8 +++-- src/test/ui/mir/issue-75053.full_tait.stderr | 12 ++++--- .../ui/mir/issue-75053.in_bindings.stderr | 2 +- src/test/ui/mir/issue-75053.min_tait.stderr | 12 ++++--- src/test/ui/mir/issue-75053.rs | 3 +- ...ue-52843-closure-constrain.min_tait.stderr | 14 ++++++-- .../issue-52843-closure-constrain.rs | 2 +- .../issue-53096.full_tait.stderr | 12 +++++-- .../issue-53096.min_tait.stderr | 12 +++++++ .../ui/type-alias-impl-trait/issue-53096.rs | 7 ++-- ...78-generator-and-const-fn.full_tait.stderr | 12 +++++-- ...678-generator-and-const-fn.min_tait.stderr | 12 +++++++ .../issue-53678-generator-and-const-fn.rs | 9 +++-- .../ui/type-alias-impl-trait/issue-60371.rs | 1 + .../type-alias-impl-trait/issue-60371.stderr | 11 +++++- .../issue-60407.full_tait.stderr | 12 +++++-- .../issue-60407.min_tait.stderr | 24 +++++++++++++ .../ui/type-alias-impl-trait/issue-60407.rs | 11 +++--- .../issue-63279.min_tait.stderr | 14 ++++++-- .../ui/type-alias-impl-trait/issue-63279.rs | 2 +- ...-opaque-ty-from-val-twice.full_tait.stderr | 12 +++++-- ...t-opaque-ty-from-val-twice.min_tait.stderr | 21 +++++++++++ ...sue-65679-inst-opaque-ty-from-val-twice.rs | 6 ++-- ..._inferrable_concrete_type.full_tait.stderr | 14 ++++++-- ...o_inferrable_concrete_type.min_tait.stderr | 14 ++++++-- .../no_inferrable_concrete_type.rs | 5 +-- .../structural-match-no-leak.min_tait.stderr | 12 ++++--- .../structural-match-no-leak.rs | 4 +-- .../structural-match.full_tait.stderr | 18 +++++++--- .../structural-match.min_tait.stderr | 12 ++++--- .../type-alias-impl-trait/structural-match.rs | 9 ++--- 41 files changed, 384 insertions(+), 113 deletions(-) create mode 100644 src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr diff --git a/compiler/rustc_typeck/src/check/check.rs b/compiler/rustc_typeck/src/check/check.rs index a22376279c2..5e0a0524690 100644 --- a/compiler/rustc_typeck/src/check/check.rs +++ b/compiler/rustc_typeck/src/check/check.rs @@ -87,8 +87,26 @@ pub(super) fn check_fn<'a, 'tcx>( let declared_ret_ty = fn_sig.output(); - let revealed_ret_ty = - fcx.instantiate_opaque_types_from_value(fn_id, declared_ret_ty, decl.output.span()); + let feature = match tcx.hir().get(fn_id) { + Node::Item(hir::Item { kind: ItemKind::Fn(..), .. }) | + Node::ImplItem(hir::ImplItem { + kind: hir::ImplItemKind::Fn(..), .. + }) => None, + // I don't know if TAIT uses in trait declarations make sense at all + Node::TraitItem(hir::TraitItem { + kind: hir::TraitItemKind::Fn(..), + .. + }) | + // Forbid TAIT in closure return position for now. + Node::Expr(hir::Expr { kind: hir::ExprKind::Closure(..), .. }) => Some(sym::type_alias_impl_trait), + node => bug!("Item being checked wasn't a function/closure: {:?}", node), + }; + let revealed_ret_ty = fcx.instantiate_opaque_types_from_value( + fn_id, + declared_ret_ty, + decl.output.span(), + feature, + ); debug!("check_fn: declared_ret_ty: {}, revealed_ret_ty: {}", declared_ret_ty, revealed_ret_ty); fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(revealed_ret_ty))); fcx.ret_type_span = Some(decl.output.span()); diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs b/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs index f5e9cc1efcc..84ce6964f04 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs @@ -26,11 +26,11 @@ use rustc_middle::ty::{ self, AdtKind, CanonicalUserType, DefIdTree, GenericParamDefKind, ToPolyTraitRef, ToPredicate, Ty, UserType, }; -use rustc_session::lint; -use rustc_span::hygiene::DesugaringKind; +use rustc_session::{lint, parse::feature_err}; use rustc_span::source_map::{original_sp, DUMMY_SP}; use rustc_span::symbol::{kw, sym, Ident}; use rustc_span::{self, BytePos, MultiSpan, Span}; +use rustc_span::{hygiene::DesugaringKind, Symbol}; use rustc_trait_selection::infer::InferCtxtExt as _; use rustc_trait_selection::opaque_types::InferCtxtExt as _; use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _; @@ -362,6 +362,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { parent_id: hir::HirId, value: T, value_span: Span, + feature: Option, ) -> T { let parent_def_id = self.tcx.hir().local_def_id(parent_id); debug!( @@ -380,7 +381,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let mut opaque_types = self.opaque_types.borrow_mut(); let mut opaque_types_vars = self.opaque_types_vars.borrow_mut(); + for (ty, decl) in opaque_type_map { + if let Some(feature) = feature { + if let hir::OpaqueTyOrigin::TyAlias = decl.origin { + if !self.tcx.features().enabled(feature) { + feature_err( + &self.tcx.sess.parse_sess, + feature, + value_span, + "type alias impl trait is not permitted here", + ) + .emit(); + } + } + } let _ = opaque_types.insert(ty, decl); let _ = opaque_types_vars.insert(decl.concrete_ty, decl.opaque_type); } diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index 825ebc19fa6..4c5d16d0b70 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -4,7 +4,7 @@ use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::PatKind; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_middle::ty::Ty; -use rustc_span::Span; +use rustc_span::{sym, Span}; use rustc_trait_selection::traits; use std::mem; @@ -58,11 +58,12 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { Some(ref ty) => { let o_ty = self.fcx.to_ty(&ty); - let revealed_ty = if self.fcx.tcx.features().impl_trait_in_bindings { - self.fcx.instantiate_opaque_types_from_value(self.parent_id, o_ty, ty.span) - } else { - o_ty - }; + let revealed_ty = self.fcx.instantiate_opaque_types_from_value( + self.parent_id, + o_ty, + ty.span, + Some(sym::impl_trait_in_bindings), + ); let c_ty = self.fcx.inh.infcx.canonicalize_user_type_annotation(UserType::Ty(revealed_ty)); diff --git a/compiler/rustc_typeck/src/check/mod.rs b/compiler/rustc_typeck/src/check/mod.rs index bb85336d7fb..85bd45f0ca8 100644 --- a/compiler/rustc_typeck/src/check/mod.rs +++ b/compiler/rustc_typeck/src/check/mod.rs @@ -121,9 +121,9 @@ use rustc_middle::ty::{self, RegionKind, Ty, TyCtxt, UserType}; use rustc_session::config; use rustc_session::parse::feature_err; use rustc_session::Session; -use rustc_span::source_map::DUMMY_SP; use rustc_span::symbol::{kw, Ident}; use rustc_span::{self, BytePos, MultiSpan, Span}; +use rustc_span::{source_map::DUMMY_SP, sym}; use rustc_target::abi::VariantIdx; use rustc_target::spec::abi::Abi; use rustc_trait_selection::traits; @@ -547,11 +547,12 @@ fn typeck_with_fallback<'tcx>( let expected_type = fcx.normalize_associated_types_in(body.value.span, expected_type); fcx.require_type_is_sized(expected_type, body.value.span, traits::ConstSized); - let revealed_ty = if tcx.features().impl_trait_in_bindings { - fcx.instantiate_opaque_types_from_value(id, expected_type, body.value.span) - } else { - expected_type - }; + let revealed_ty = fcx.instantiate_opaque_types_from_value( + id, + expected_type, + body.value.span, + Some(sym::impl_trait_in_bindings), + ); // Gather locals in statics (because of block expressions). GatherLocalsVisitor::new(&fcx, id).visit_body(body); diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs index 3b31bc159c0..dfd82a25f4c 100644 --- a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs +++ b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs @@ -13,7 +13,7 @@ fn define() -> Bar { type Foo2 = impl Debug; fn define2() { - let x = || -> Foo2 { 42 }; + let x = || -> Foo2 { 42 }; //~ ERROR not permitted here } type Foo3 = impl Debug; @@ -31,7 +31,7 @@ type Foo4 = impl Debug; fn define4() { let y: Foo4 = 42; - //~^ ERROR mismatched types + //~^ ERROR not permitted here } fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr index da3ddb1c509..43fd76ef0ed 100644 --- a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr +++ b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.stderr @@ -10,6 +10,15 @@ LL | Bar(42) = note: expected opaque type `impl Debug` found type `{integer}` +error[E0658]: type alias impl trait is not permitted here + --> $DIR/feature-gate-type_alias_impl_trait.rs:16:19 + | +LL | let x = || -> Foo2 { 42 }; + | ^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + error[E0308]: mismatched types --> $DIR/feature-gate-type_alias_impl_trait.rs:23:18 | @@ -36,19 +45,14 @@ LL | define3(42) = note: expected opaque type `impl Debug` found type `{integer}` -error[E0308]: mismatched types - --> $DIR/feature-gate-type_alias_impl_trait.rs:33:19 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/feature-gate-type_alias_impl_trait.rs:33:12 | -LL | type Foo4 = impl Debug; - | ---------- the expected opaque type -... LL | let y: Foo4 = 42; - | ---- ^^ expected opaque type, found integer - | | - | expected due to this + | ^^^^ | - = note: expected opaque type `impl Debug` - found type `{integer}` + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable error: could not find defining uses --> $DIR/feature-gate-type_alias_impl_trait.rs:5:12 @@ -68,6 +72,7 @@ error: could not find defining uses LL | type Foo4 = impl Debug; | ^^^^^^^^^^ -error: aborting due to 7 previous errors +error: aborting due to 8 previous errors -For more information about this error, try `rustc --explain E0308`. +Some errors have detailed explanations: E0308, E0658. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/generator/layout-error.min_tait.stderr b/src/test/ui/generator/layout-error.min_tait.stderr index 1be39856883..be469d781b5 100644 --- a/src/test/ui/generator/layout-error.min_tait.stderr +++ b/src/test/ui/generator/layout-error.min_tait.stderr @@ -4,6 +4,37 @@ error[E0425]: cannot find value `Foo` in this scope LL | let a = Foo; | ^^^ not found in this scope -error: aborting due to previous error +error[E0658]: type alias impl trait is not permitted here + --> $DIR/layout-error.rs:31:27 + | +LL | Task::spawn(&POOL, || cb()); + | ^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable -For more information about this error, try `rustc --explain E0425`. +error[E0658]: type alias impl trait is not permitted here + --> $DIR/layout-error.rs:30:28 + | +LL | static POOL: Task = Task::new(); + | ^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/layout-error.rs:31:24 + | +LL | Task::spawn(&POOL, || cb()); + | ^^^^^^^ expected `[type error]`, got `impl Future` + | +note: previous use here + --> $DIR/layout-error.rs:30:5 + | +LL | static POOL: Task = Task::new(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0425, E0658. +For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/generator/layout-error.rs b/src/test/ui/generator/layout-error.rs index 549c6f6ebe7..9f15a6b2eca 100644 --- a/src/test/ui/generator/layout-error.rs +++ b/src/test/ui/generator/layout-error.rs @@ -12,7 +12,7 @@ use std::future::Future; pub struct Task(F); impl Task { - fn new() -> Self { + const fn new() -> Self { todo!() } fn spawn(&self, _: impl FnOnce() -> F) { @@ -27,6 +27,7 @@ fn main() { type F = impl Future; // Check that statics are inhabited computes they layout. - static POOL: Task = Task::new(); - Task::spawn(&POOL, || cb()); + static POOL: Task = Task::new(); //[min_tait]~ ERROR not permitted here + Task::spawn(&POOL, || cb()); //[min_tait]~ ERROR type alias impl trait is not permitted here + //[min_tait]~^ ERROR concrete type differs from previous } diff --git a/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr b/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr index 59cd8e04513..ce874c1518c 100644 --- a/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr +++ b/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/metadata-sufficient-for-layout.rs:11:32 + --> $DIR/metadata-sufficient-for-layout.rs:10:32 | LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^ @@ -8,12 +8,18 @@ LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_binding = note: see issue #63063 for more information warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/metadata-sufficient-for-layout.rs:11:55 + --> $DIR/metadata-sufficient-for-layout.rs:10:55 | LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #63065 for more information -warning: 2 warnings emitted +error: fatal error triggered by #[rustc_error] + --> $DIR/metadata-sufficient-for-layout.rs:29:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr b/src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr new file mode 100644 index 00000000000..e2b0d3622a6 --- /dev/null +++ b/src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr @@ -0,0 +1,24 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/metadata-sufficient-for-layout.rs:22:23 + | +LL | static A: Option = None; + | ^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/metadata-sufficient-for-layout.rs:25:1 + | +LL | fn f() -> F { metadata_sufficient_for_layout::g() } + | ^^^^^^^^^^^ expected `[type error]`, got `impl Generator` + | +note: previous use here + --> $DIR/metadata-sufficient-for-layout.rs:22:1 + | +LL | static A: Option = None; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/generator/metadata-sufficient-for-layout.rs b/src/test/ui/generator/metadata-sufficient-for-layout.rs index 7d474c82eef..f206093d971 100644 --- a/src/test/ui/generator/metadata-sufficient-for-layout.rs +++ b/src/test/ui/generator/metadata-sufficient-for-layout.rs @@ -4,10 +4,9 @@ // Regression test for #80998. // // aux-build:metadata-sufficient-for-layout.rs -// check-pass // revisions: min_tait full_tait -#![feature(min_type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait, rustc_attrs)] #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] //[full_tait]~^ WARN incomplete //[full_tait]~| WARN incomplete @@ -21,7 +20,10 @@ type F = impl Generator<(), Yield = (), Return = ()>; // Static queries the layout of the generator. static A: Option = None; +//[min_tait]~^ ERROR not permitted here fn f() -> F { metadata_sufficient_for_layout::g() } +//[min_tait]~^ ERROR concrete type differs -fn main() {} +#[rustc_error] +fn main() {} //[full_tait]~ ERROR diff --git a/src/test/ui/mir/issue-75053.full_tait.stderr b/src/test/ui/mir/issue-75053.full_tait.stderr index 0737c666f85..aff19094b7a 100644 --- a/src/test/ui/mir/issue-75053.full_tait.stderr +++ b/src/test/ui/mir/issue-75053.full_tait.stderr @@ -7,11 +7,15 @@ LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] = note: `#[warn(incomplete_features)]` on by default = note: see issue #63063 for more information -error: fatal error triggered by #[rustc_error] - --> $DIR/issue-75053.rs:51:1 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-75053.rs:52:15 | -LL | fn main() { - | ^^^^^^^^^ +LL | let _pos: Phantom1> = Scope::new().my_index(); + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable error: aborting due to previous error; 1 warning emitted +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/mir/issue-75053.in_bindings.stderr b/src/test/ui/mir/issue-75053.in_bindings.stderr index 1c473d99139..a43fabc8f5d 100644 --- a/src/test/ui/mir/issue-75053.in_bindings.stderr +++ b/src/test/ui/mir/issue-75053.in_bindings.stderr @@ -8,7 +8,7 @@ LL | #![cfg_attr(in_bindings, feature(impl_trait_in_bindings))] = note: see issue #63065 for more information error[E0282]: type annotations needed - --> $DIR/issue-75053.rs:53:38 + --> $DIR/issue-75053.rs:52:38 | LL | type O; | ------- `>::O` defined here diff --git a/src/test/ui/mir/issue-75053.min_tait.stderr b/src/test/ui/mir/issue-75053.min_tait.stderr index 180a4094ff2..7ce91e851a7 100644 --- a/src/test/ui/mir/issue-75053.min_tait.stderr +++ b/src/test/ui/mir/issue-75053.min_tait.stderr @@ -1,8 +1,12 @@ -error: fatal error triggered by #[rustc_error] - --> $DIR/issue-75053.rs:51:1 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-75053.rs:52:15 | -LL | fn main() { - | ^^^^^^^^^ +LL | let _pos: Phantom1> = Scope::new().my_index(); + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable error: aborting due to previous error +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/mir/issue-75053.rs b/src/test/ui/mir/issue-75053.rs index 80c0c796100..fc88d00c0c3 100644 --- a/src/test/ui/mir/issue-75053.rs +++ b/src/test/ui/mir/issue-75053.rs @@ -49,7 +49,6 @@ impl>>, U> MyIndex> for Scope { #[rustc_error] fn main() { - //[min_tait,full_tait]~^ ERROR rustc_error - let _pos: Phantom1> = Scope::new().my_index(); + let _pos: Phantom1> = Scope::new().my_index(); //[min_tait,full_tait]~ ERROR not permitted here //[in_bindings]~^ ERROR type annotations needed } diff --git a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr index d71e12c60ff..c2cb4829fb7 100644 --- a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr @@ -1,8 +1,17 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-52843-closure-constrain.rs:13:22 + | +LL | let null = || -> Opaque { 0 }; + | ^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + error: concrete type differs from previous defining opaque type use --> $DIR/issue-52843-closure-constrain.rs:13:16 | LL | let null = || -> Opaque { 0 }; - | ^^^^^^^^^^^^^^^^^^ expected `String`, got `i32` + | ^^^^^^^^^^^^^^^^^^ expected `String`, got `[type error]` | note: previous use here --> $DIR/issue-52843-closure-constrain.rs:12:5 @@ -10,5 +19,6 @@ note: previous use here LL | fn _unused() -> Opaque { String::new() } | ^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to previous error +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs index e4ccb3742bc..01f874155fa 100644 --- a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs +++ b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs @@ -10,7 +10,7 @@ use std::fmt::Debug; fn main() { type Opaque = impl Debug; fn _unused() -> Opaque { String::new() } - let null = || -> Opaque { 0 }; + let null = || -> Opaque { 0 }; //[min_tait]~ ERROR: not permitted here //~^ ERROR: concrete type differs from previous defining opaque type use println!("{:?}", null()); } diff --git a/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr index 38756ce4eb8..1a03ce79661 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-53096.rs:5:32 + --> $DIR/issue-53096.rs:4:32 | LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] | ^^^^^^^^^^^^^^^^^^^^^^ @@ -8,12 +8,18 @@ LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trai = note: see issue #63065 for more information warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-53096.rs:5:56 + --> $DIR/issue-53096.rs:4:56 | LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] | ^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #63063 for more information -warning: 2 warnings emitted +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-53096.rs:14:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr new file mode 100644 index 00000000000..c6c7a51618d --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-53096.rs:10:19 + | +LL | const BAZR: Foo = bar(); + | ^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-53096.rs b/src/test/ui/type-alias-impl-trait/issue-53096.rs index 00c04935e50..fb621dc0bce 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53096.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53096.rs @@ -1,5 +1,4 @@ -// check-pass -#![feature(const_impl_trait, const_fn_fn_ptr_basics)] +#![feature(const_impl_trait, const_fn_fn_ptr_basics, rustc_attrs)] // revisions: min_tait full_tait #![feature(min_type_alias_impl_trait)] #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] @@ -9,5 +8,7 @@ type Foo = impl Fn() -> usize; const fn bar() -> Foo { || 0usize } const BAZR: Foo = bar(); +//[min_tait]~^ ERROR not permitted here -fn main() {} +#[rustc_error] +fn main() {} //[full_tait]~ ERROR diff --git a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr index fe3b739dd0b..70d049ffa76 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-53678-generator-and-const-fn.rs:6:32 + --> $DIR/issue-53678-generator-and-const-fn.rs:4:32 | LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] | ^^^^^^^^^^^^^^^^^^^^^^ @@ -8,12 +8,18 @@ LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trai = note: see issue #63065 for more information warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-53678-generator-and-const-fn.rs:6:56 + --> $DIR/issue-53678-generator-and-const-fn.rs:4:56 | LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] | ^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #63063 for more information -warning: 2 warnings emitted +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-53678-generator-and-const-fn.rs:23:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr new file mode 100644 index 00000000000..a3dea45a6a5 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-53678-generator-and-const-fn.rs:20:36 + | +LL | const FOO: GenOnce = const_generator(10, 100); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs index 35001eb70a0..bf607d29ce4 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs @@ -1,6 +1,4 @@ -// check-pass - -#![feature(const_impl_trait, generators, generator_trait)] +#![feature(const_impl_trait, generators, generator_trait, rustc_attrs)] // revisions: min_tait full_tait #![feature(min_type_alias_impl_trait)] #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] @@ -19,6 +17,7 @@ const fn const_generator(yielding: Y, returning: R) -> GenOnce { } } -const FOO: GenOnce = const_generator(10, 100); +const FOO: GenOnce = const_generator(10, 100); //[min_tait]~ ERROR not permitted here -fn main() {} +#[rustc_error] +fn main() {} //[full_tait]~ ERROR diff --git a/src/test/ui/type-alias-impl-trait/issue-60371.rs b/src/test/ui/type-alias-impl-trait/issue-60371.rs index 14d21418ae8..4ac7f9423ff 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60371.rs +++ b/src/test/ui/type-alias-impl-trait/issue-60371.rs @@ -12,6 +12,7 @@ impl Bug for &() { //~^^ ERROR could not find defining uses const FUN: fn() -> Self::Item = || (); + //~^ ERROR type alias impl trait is not permitted here } fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-60371.stderr b/src/test/ui/type-alias-impl-trait/issue-60371.stderr index 461b8517ca4..255d381bf06 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60371.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-60371.stderr @@ -7,6 +7,15 @@ LL | type Item = impl Bug; = note: see issue #63063 for more information = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-60371.rs:14:37 + | +LL | const FUN: fn() -> Self::Item = || (); + | ^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + error[E0277]: the trait bound `(): Bug` is not satisfied --> $DIR/issue-60371.rs:10:17 | @@ -22,7 +31,7 @@ error: could not find defining uses LL | type Item = impl Bug; | ^^^^^^^^ -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0277, E0658. For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr index 31f7a77818c..5edf73c8ced 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-60407.rs:5:32 + --> $DIR/issue-60407.rs:3:32 | LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^ @@ -8,12 +8,18 @@ LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_binding = note: see issue #63063 for more information warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-60407.rs:5:55 + --> $DIR/issue-60407.rs:3:55 | LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #63065 for more information -warning: 2 warnings emitted +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-60407.rs:12:1 + | +LL | fn main() { + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr new file mode 100644 index 00000000000..edb8141c1b1 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr @@ -0,0 +1,24 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-60407.rs:9:39 + | +LL | static mut TEST: Option = None; + | ^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/issue-60407.rs:16:1 + | +LL | fn foo() -> Debuggable { + | ^^^^^^^^^^^^^^^^^^^^^^ expected `[type error]`, got `u32` + | +note: previous use here + --> $DIR/issue-60407.rs:9:1 + | +LL | static mut TEST: Option = None; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-60407.rs b/src/test/ui/type-alias-impl-trait/issue-60407.rs index e2a2fb838b9..afcbf313cc8 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60407.rs +++ b/src/test/ui/type-alias-impl-trait/issue-60407.rs @@ -1,19 +1,18 @@ -// check-pass - // revisions: min_tait full_tait -#![feature(min_type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait, rustc_attrs)] #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] //[full_tait]~^ WARN incomplete //[full_tait]~| WARN incomplete type Debuggable = impl core::fmt::Debug; -static mut TEST: Option = None; +static mut TEST: Option = None; //[min_tait]~ ERROR not permitted here -fn main() { +#[rustc_error] +fn main() { //[full_tait]~ ERROR unsafe { TEST = Some(foo()) } } -fn foo() -> Debuggable { +fn foo() -> Debuggable { //[min_tait]~ ERROR concrete type differs 0u32 } diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr index 3ecca1270a9..bdf414d0bad 100644 --- a/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr @@ -1,3 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-63279.rs:11:11 + | +LL | || -> Closure { || () } + | ^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + error[E0271]: type mismatch resolving `<[closure@$DIR/issue-63279.rs:11:5: 11:28] as FnOnce<()>>::Output == ()` --> $DIR/issue-63279.rs:8:16 | @@ -7,6 +16,7 @@ LL | type Closure = impl FnOnce(); = note: expected opaque type `impl FnOnce<()>` found unit type `()` -error: aborting due to previous error +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0271`. +Some errors have detailed explanations: E0271, E0658. +For more information about an error, try `rustc --explain E0271`. diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.rs b/src/test/ui/type-alias-impl-trait/issue-63279.rs index 3b0bddf8f7b..086715626bc 100644 --- a/src/test/ui/type-alias-impl-trait/issue-63279.rs +++ b/src/test/ui/type-alias-impl-trait/issue-63279.rs @@ -8,7 +8,7 @@ type Closure = impl FnOnce(); //~ ERROR: type mismatch resolving fn c() -> Closure { - || -> Closure { || () } + || -> Closure { || () } //[min_tait]~ ERROR: not permitted here } fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr index 8a51c14a008..cf668fc6e06 100644 --- a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:6:32 + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:5:32 | LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^ @@ -8,12 +8,18 @@ LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_binding = note: see issue #63063 for more information warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:6:55 + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:5:55 | LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #63065 for more information -warning: 2 warnings emitted +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:19:1 + | +LL | fn main() { + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr new file mode 100644 index 00000000000..5b6c4b5cda1 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr @@ -0,0 +1,21 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:20:13 + | +LL | take(|| {}); + | ^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:22:13 + | +LL | take(|| {}); + | ^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs index 09709639c7b..b7f05bd83ed 100644 --- a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs +++ b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs @@ -1,5 +1,4 @@ // compile-flags: -Zsave-analysis -// check-pass // revisions: min_tait full_tait #![feature(min_type_alias_impl_trait, rustc_attrs)] @@ -16,7 +15,10 @@ type T = impl Sized; fn take(_: fn() -> T) {} -fn main() { +#[rustc_error] +fn main() { //[full_tait]~ ERROR fatal error triggered by #[rustc_error] take(|| {}); + //[min_tait]~^ ERROR not permitted here take(|| {}); + //[min_tait]~^ ERROR not permitted here } diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr index faddecb2176..40949c84d23 100644 --- a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr @@ -1,17 +1,25 @@ warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes --> $DIR/no_inferrable_concrete_type.rs:6:32 | -LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] | ^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(incomplete_features)]` on by default = note: see issue #63063 for more information +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/no_inferrable_concrete_type.rs:6:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + error: could not find defining uses - --> $DIR/no_inferrable_concrete_type.rs:9:12 + --> $DIR/no_inferrable_concrete_type.rs:10:12 | LL | type Foo = impl Copy; | ^^^^^^^^^ -error: aborting due to previous error; 1 warning emitted +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr index 3194bd76107..d69e4cccdf0 100644 --- a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr @@ -1,8 +1,18 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/no_inferrable_concrete_type.rs:16:12 + | +LL | let _: Foo = std::mem::transmute(0u8); + | ^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + error: could not find defining uses - --> $DIR/no_inferrable_concrete_type.rs:9:12 + --> $DIR/no_inferrable_concrete_type.rs:10:12 | LL | type Foo = impl Copy; | ^^^^^^^^^ -error: aborting due to previous error +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs index 4fdaa033fb0..8ff588ef278 100644 --- a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs +++ b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs @@ -3,8 +3,9 @@ // revisions: min_tait full_tait #![feature(min_type_alias_impl_trait)] -#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] //[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Foo = impl Copy; //~ could not find defining uses @@ -12,5 +13,5 @@ type Foo = impl Copy; //~ could not find defining uses fn bar(x: Foo) -> Foo { x } fn main() { - let _: Foo = std::mem::transmute(0u8); + let _: Foo = std::mem::transmute(0u8); //[min_tait]~ ERROR not permitted here } diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr index f1ac45ba5db..e962b23a587 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr @@ -1,8 +1,12 @@ -error: `impl Send` cannot be used in patterns - --> $DIR/structural-match-no-leak.rs:19:9 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/structural-match-no-leak.rs:15:24 | -LL | LEAK_FREE => (), - | ^^^^^^^^^ +LL | const LEAK_FREE: Bar = leak_free(); + | ^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable error: aborting due to previous error +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs index 34d9663223b..d0bae30f996 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs @@ -12,12 +12,12 @@ type Bar = impl Send; const fn leak_free() -> Bar { 7i32 } -const LEAK_FREE: Bar = leak_free(); +const LEAK_FREE: Bar = leak_free(); //[min_tait]~ ERROR not permitted here fn leak_free_test() { match todo!() { LEAK_FREE => (), - //~^ `impl Send` cannot be used in patterns + //[full_tait]~^ `impl Send` cannot be used in patterns _ => (), } } diff --git a/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr index 4202d0fff43..b94e06e6d0e 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr @@ -1,17 +1,25 @@ warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/structural-match.rs:4:36 + --> $DIR/structural-match.rs:4:32 | -LL | #![cfg_attr(not(min_tait), feature(type_alias_impl_trait, min_type_alias_impl_trait))] - | ^^^^^^^^^^^^^^^^^^^^^ +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ | = note: `#[warn(incomplete_features)]` on by default = note: see issue #63063 for more information +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/structural-match.rs:4:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + error: `impl Send` cannot be used in patterns - --> $DIR/structural-match.rs:19:9 + --> $DIR/structural-match.rs:20:9 | LL | VALUE => (), | ^^^^^ -error: aborting due to previous error; 1 warning emitted +error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr index f63b1fb23df..36c49a954bd 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr +++ b/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr @@ -1,8 +1,12 @@ -error: `impl Send` cannot be used in patterns - --> $DIR/structural-match.rs:19:9 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/structural-match.rs:16:20 | -LL | VALUE => (), - | ^^^^^ +LL | const VALUE: Foo = value(); + | ^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable error: aborting due to previous error +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/structural-match.rs b/src/test/ui/type-alias-impl-trait/structural-match.rs index ceab13ba487..daf914cc494 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match.rs +++ b/src/test/ui/type-alias-impl-trait/structural-match.rs @@ -1,8 +1,9 @@ #![feature(const_impl_trait)] // revisions: min_tait full_tait -#![cfg_attr(min_tait, feature(min_type_alias_impl_trait))] -#![cfg_attr(not(min_tait), feature(type_alias_impl_trait, min_type_alias_impl_trait))] +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] //[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Foo = impl Send; @@ -12,12 +13,12 @@ struct A; const fn value() -> Foo { A } -const VALUE: Foo = value(); +const VALUE: Foo = value(); //[min_tait]~ ERROR not permitted here fn test() { match todo!() { VALUE => (), - //~^ `impl Send` cannot be used in patterns + //[full_tait]~^ `impl Send` cannot be used in patterns _ => (), } }