mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 11:07:42 +00:00
Auto merge of #87400 - JohnTitor:rollup-zbwyuxi, r=JohnTitor
Rollup of 8 pull requests Successful merges: - #87034 (DOC: fix hypothetical Rust code in `step_by()` docstring) - #87298 (memorialize Anna Harren in the bastion of the turbofish) - #87332 (Don't hide fields of enum struct variants) - #87362 (Make `x.py d` an alias for `x.py doc`) - #87372 (Move calls to test_main into one function) - #87373 (Extend HIR WF checking to fields) - #87376 (Change rustdoc logo to use the full container size) - #87383 (Add regression tests for the impl_trait_in_bindings ICEs) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
0443424954
@ -523,8 +523,7 @@ fn check_type_defn<'tcx, F>(
|
|||||||
fcx.register_wf_obligation(
|
fcx.register_wf_obligation(
|
||||||
field.ty.into(),
|
field.ty.into(),
|
||||||
field.span,
|
field.span,
|
||||||
// We don't have an HIR id for the field
|
ObligationCauseCode::WellFormed(Some(WellFormedLoc::Ty(field.def_id))),
|
||||||
ObligationCauseCode::WellFormed(None),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1467,6 +1466,7 @@ struct AdtVariant<'tcx> {
|
|||||||
|
|
||||||
struct AdtField<'tcx> {
|
struct AdtField<'tcx> {
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
|
def_id: LocalDefId,
|
||||||
span: Span,
|
span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1477,11 +1477,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
.fields()
|
.fields()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|field| {
|
.map(|field| {
|
||||||
let field_ty = self.tcx.type_of(self.tcx.hir().local_def_id(field.hir_id));
|
let def_id = self.tcx.hir().local_def_id(field.hir_id);
|
||||||
|
let field_ty = self.tcx.type_of(def_id);
|
||||||
let field_ty = self.normalize_associated_types_in(field.ty.span, field_ty);
|
let field_ty = self.normalize_associated_types_in(field.ty.span, field_ty);
|
||||||
let field_ty = self.resolve_vars_if_possible(field_ty);
|
let field_ty = self.resolve_vars_if_possible(field_ty);
|
||||||
debug!("non_enum_variant: type of field {:?} is {:?}", field, field_ty);
|
debug!("non_enum_variant: type of field {:?} is {:?}", field, field_ty);
|
||||||
AdtField { ty: field_ty, span: field.ty.span }
|
AdtField { ty: field_ty, span: field.ty.span, def_id }
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
AdtVariant { fields, explicit_discr: None }
|
AdtVariant { fields, explicit_discr: None }
|
||||||
|
@ -25,7 +25,7 @@ fn diagnostic_hir_wf_check<'tcx>(
|
|||||||
WellFormedLoc::Ty(def_id) => def_id,
|
WellFormedLoc::Ty(def_id) => def_id,
|
||||||
WellFormedLoc::Param { function, param_idx: _ } => function,
|
WellFormedLoc::Param { function, param_idx: _ } => function,
|
||||||
};
|
};
|
||||||
let hir_id = HirId::make_owner(def_id);
|
let hir_id = hir.local_def_id_to_hir_id(def_id);
|
||||||
|
|
||||||
// HIR wfcheck should only ever happen as part of improving an existing error
|
// HIR wfcheck should only ever happen as part of improving an existing error
|
||||||
tcx.sess
|
tcx.sess
|
||||||
@ -140,6 +140,7 @@ fn diagnostic_hir_wf_check<'tcx>(
|
|||||||
}
|
}
|
||||||
ref item => bug!("Unexpected item {:?}", item),
|
ref item => bug!("Unexpected item {:?}", item),
|
||||||
},
|
},
|
||||||
|
hir::Node::Field(field) => Some(field.ty),
|
||||||
ref node => bug!("Unexpected node {:?}", node),
|
ref node => bug!("Unexpected node {:?}", node),
|
||||||
},
|
},
|
||||||
WellFormedLoc::Param { function: _, param_idx } => {
|
WellFormedLoc::Param { function: _, param_idx } => {
|
||||||
|
@ -333,21 +333,22 @@ pub trait Iterator {
|
|||||||
/// regardless of the step given.
|
/// regardless of the step given.
|
||||||
///
|
///
|
||||||
/// Note 2: The time at which ignored elements are pulled is not fixed.
|
/// Note 2: The time at which ignored elements are pulled is not fixed.
|
||||||
/// `StepBy` behaves like the sequence `next(), nth(step-1), nth(step-1), …`,
|
/// `StepBy` behaves like the sequence `self.next()`, `self.nth(step-1)`,
|
||||||
/// but is also free to behave like the sequence
|
/// `self.nth(step-1)`, …, but is also free to behave like the sequence
|
||||||
/// `advance_n_and_return_first(step), advance_n_and_return_first(step), …`
|
/// `advance_n_and_return_first(&mut self, step)`,
|
||||||
|
/// `advance_n_and_return_first(&mut self, step)`, …
|
||||||
/// Which way is used may change for some iterators for performance reasons.
|
/// Which way is used may change for some iterators for performance reasons.
|
||||||
/// The second way will advance the iterator earlier and may consume more items.
|
/// The second way will advance the iterator earlier and may consume more items.
|
||||||
///
|
///
|
||||||
/// `advance_n_and_return_first` is the equivalent of:
|
/// `advance_n_and_return_first` is the equivalent of:
|
||||||
/// ```
|
/// ```
|
||||||
/// fn advance_n_and_return_first<I>(iter: &mut I, total_step: usize) -> Option<I::Item>
|
/// fn advance_n_and_return_first<I>(iter: &mut I, n: usize) -> Option<I::Item>
|
||||||
/// where
|
/// where
|
||||||
/// I: Iterator,
|
/// I: Iterator,
|
||||||
/// {
|
/// {
|
||||||
/// let next = iter.next();
|
/// let next = iter.next();
|
||||||
/// if total_step > 1 {
|
/// if n > 1 {
|
||||||
/// iter.nth(total_step-2);
|
/// iter.nth(n - 2);
|
||||||
/// }
|
/// }
|
||||||
/// next
|
/// next
|
||||||
/// }
|
/// }
|
||||||
|
@ -152,7 +152,7 @@ Subcommands:
|
|||||||
fmt Run rustfmt
|
fmt Run rustfmt
|
||||||
test, t Build and run some test suites
|
test, t Build and run some test suites
|
||||||
bench Build and run some benchmarks
|
bench Build and run some benchmarks
|
||||||
doc Build documentation
|
doc, d Build documentation
|
||||||
clean Clean out build directories
|
clean Clean out build directories
|
||||||
dist Build distribution artifacts
|
dist Build distribution artifacts
|
||||||
install Install distribution artifacts
|
install Install distribution artifacts
|
||||||
@ -244,6 +244,7 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`",
|
|||||||
|| (s == "t")
|
|| (s == "t")
|
||||||
|| (s == "bench")
|
|| (s == "bench")
|
||||||
|| (s == "doc")
|
|| (s == "doc")
|
||||||
|
|| (s == "d")
|
||||||
|| (s == "clean")
|
|| (s == "clean")
|
||||||
|| (s == "dist")
|
|| (s == "dist")
|
||||||
|| (s == "install")
|
|| (s == "install")
|
||||||
@ -312,7 +313,7 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`",
|
|||||||
"clippy" => {
|
"clippy" => {
|
||||||
opts.optflag("", "fix", "automatically apply lint suggestions");
|
opts.optflag("", "fix", "automatically apply lint suggestions");
|
||||||
}
|
}
|
||||||
"doc" => {
|
"doc" | "d" => {
|
||||||
opts.optflag("", "open", "open the docs in a browser");
|
opts.optflag("", "open", "open the docs in a browser");
|
||||||
}
|
}
|
||||||
"clean" => {
|
"clean" => {
|
||||||
@ -487,7 +488,7 @@ Arguments:
|
|||||||
./x.py test --stage 1",
|
./x.py test --stage 1",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
"doc" => {
|
"doc" | "d" => {
|
||||||
subcommand_help.push_str(
|
subcommand_help.push_str(
|
||||||
"\n
|
"\n
|
||||||
Arguments:
|
Arguments:
|
||||||
@ -573,7 +574,7 @@ Arguments:
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
"bench" => Subcommand::Bench { paths, test_args: matches.opt_strs("test-args") },
|
"bench" => Subcommand::Bench { paths, test_args: matches.opt_strs("test-args") },
|
||||||
"doc" => Subcommand::Doc { paths, open: matches.opt_present("open") },
|
"doc" | "d" => Subcommand::Doc { paths, open: matches.opt_present("open") },
|
||||||
"clean" => {
|
"clean" => {
|
||||||
if !paths.is_empty() {
|
if !paths.is_empty() {
|
||||||
println!("\nclean does not take a path argument\n");
|
println!("\nclean does not take a path argument\n");
|
||||||
|
@ -105,7 +105,7 @@ crate fn run(options: Options) -> Result<(), ErrorReported> {
|
|||||||
registry: rustc_driver::diagnostics_registry(),
|
registry: rustc_driver::diagnostics_registry(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut test_args = options.test_args.clone();
|
let test_args = options.test_args.clone();
|
||||||
let display_warnings = options.display_warnings;
|
let display_warnings = options.display_warnings;
|
||||||
let nocapture = options.nocapture;
|
let nocapture = options.nocapture;
|
||||||
let externs = options.externs.clone();
|
let externs = options.externs.clone();
|
||||||
@ -166,12 +166,7 @@ crate fn run(options: Options) -> Result<(), ErrorReported> {
|
|||||||
Err(ErrorReported) => return Err(ErrorReported),
|
Err(ErrorReported) => return Err(ErrorReported),
|
||||||
};
|
};
|
||||||
|
|
||||||
test_args.insert(0, "rustdoctest".to_string());
|
run_tests(test_args, nocapture, display_warnings, tests);
|
||||||
if nocapture {
|
|
||||||
test_args.push("--nocapture".to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
test::test_main(&test_args, tests, Some(test::Options::new().display_output(display_warnings)));
|
|
||||||
|
|
||||||
// Collect and warn about unused externs, but only if we've gotten
|
// Collect and warn about unused externs, but only if we've gotten
|
||||||
// reports for each doctest
|
// reports for each doctest
|
||||||
@ -214,6 +209,19 @@ crate fn run(options: Options) -> Result<(), ErrorReported> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
crate fn run_tests(
|
||||||
|
mut test_args: Vec<String>,
|
||||||
|
nocapture: bool,
|
||||||
|
display_warnings: bool,
|
||||||
|
tests: Vec<test::TestDescAndFn>,
|
||||||
|
) {
|
||||||
|
test_args.insert(0, "rustdoctest".to_string());
|
||||||
|
if nocapture {
|
||||||
|
test_args.push("--nocapture".to_string());
|
||||||
|
}
|
||||||
|
test::test_main(&test_args, tests, Some(test::Options::new().display_output(display_warnings)));
|
||||||
|
}
|
||||||
|
|
||||||
// Look for `#![doc(test(no_crate_inject))]`, used by crates in the std facade.
|
// Look for `#![doc(test(no_crate_inject))]`, used by crates in the std facade.
|
||||||
fn scrape_test_config(attrs: &[ast::Attribute]) -> TestOptions {
|
fn scrape_test_config(attrs: &[ast::Attribute]) -> TestOptions {
|
||||||
use rustc_ast_pretty::pprust;
|
use rustc_ast_pretty::pprust;
|
||||||
|
@ -1029,14 +1029,12 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
|||||||
|
|
||||||
use crate::clean::Variant;
|
use crate::clean::Variant;
|
||||||
if let clean::VariantItem(Variant::Struct(ref s)) = *variant.kind {
|
if let clean::VariantItem(Variant::Struct(ref s)) = *variant.kind {
|
||||||
let count_fields = s.fields.len();
|
|
||||||
toggle_open(w, format_args!("{} field{}", count_fields, pluralize(count_fields)));
|
|
||||||
let variant_id = cx.derive_id(format!(
|
let variant_id = cx.derive_id(format!(
|
||||||
"{}.{}.fields",
|
"{}.{}.fields",
|
||||||
ItemType::Variant,
|
ItemType::Variant,
|
||||||
variant.name.as_ref().unwrap()
|
variant.name.as_ref().unwrap()
|
||||||
));
|
));
|
||||||
write!(w, "<div class=\"autohide sub-variant\" id=\"{id}\">", id = variant_id);
|
write!(w, "<div class=\"sub-variant\" id=\"{id}\">", id = variant_id);
|
||||||
write!(
|
write!(
|
||||||
w,
|
w,
|
||||||
"<h3>Fields of <b>{name}</b></h3><div>",
|
"<h3>Fields of <b>{name}</b></h3><div>",
|
||||||
@ -1064,7 +1062,6 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
w.write_str("</div></div>");
|
w.write_str("</div></div>");
|
||||||
toggle_close(w);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -329,6 +329,7 @@ nav.sub {
|
|||||||
.logo-container > img {
|
.logo-container > img {
|
||||||
max-width: 100px;
|
max-width: 100px;
|
||||||
max-height: 100px;
|
max-height: 100px;
|
||||||
|
height: 100%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
@ -1072,7 +1073,7 @@ a.test-arrow:hover{
|
|||||||
padding-top: 1px;
|
padding-top: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#main > details > .sub-variant > h3 {
|
#main .sub-variant > h3 {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
margin-left: 25px;
|
margin-left: 25px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
|
@ -115,7 +115,7 @@ crate fn render<P: AsRef<Path>>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Runs any tests/code examples in the markdown file `input`.
|
/// Runs any tests/code examples in the markdown file `input`.
|
||||||
crate fn test(mut options: Options) -> Result<(), String> {
|
crate fn test(options: Options) -> Result<(), String> {
|
||||||
let input_str = read_to_string(&options.input)
|
let input_str = read_to_string(&options.input)
|
||||||
.map_err(|err| format!("{}: {}", options.input.display(), err))?;
|
.map_err(|err| format!("{}: {}", options.input.display(), err))?;
|
||||||
let mut opts = TestOptions::default();
|
let mut opts = TestOptions::default();
|
||||||
@ -135,14 +135,11 @@ crate fn test(mut options: Options) -> Result<(), String> {
|
|||||||
|
|
||||||
find_testable_code(&input_str, &mut collector, codes, options.enable_per_target_ignores, None);
|
find_testable_code(&input_str, &mut collector, codes, options.enable_per_target_ignores, None);
|
||||||
|
|
||||||
options.test_args.insert(0, "rustdoctest".to_string());
|
crate::doctest::run_tests(
|
||||||
if options.nocapture {
|
options.test_args,
|
||||||
options.test_args.push("--nocapture".to_string());
|
options.nocapture,
|
||||||
}
|
options.display_warnings,
|
||||||
test::test_main(
|
|
||||||
&options.test_args,
|
|
||||||
collector.tests,
|
collector.tests,
|
||||||
Some(test::Options::new().display_output(options.display_warnings)),
|
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -62,8 +62,7 @@ pub struct PrivStruct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @has 'toggle_item_contents/enum.Enum.html'
|
// @has 'toggle_item_contents/enum.Enum.html'
|
||||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
// @!has - '//details[@class="rustdoc-toggle type-contents-toggle"]'
|
||||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show 2 fields'
|
|
||||||
pub enum Enum {
|
pub enum Enum {
|
||||||
A, B, C,
|
A, B, C,
|
||||||
D {
|
D {
|
||||||
@ -73,8 +72,7 @@ pub enum Enum {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// @has 'toggle_item_contents/enum.EnumStructVariant.html'
|
// @has 'toggle_item_contents/enum.EnumStructVariant.html'
|
||||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
// @!has - '//details[@class="rustdoc-toggle type-contents-toggle"]'
|
||||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show 1 field'
|
|
||||||
pub enum EnumStructVariant {
|
pub enum EnumStructVariant {
|
||||||
A, B, C,
|
A, B, C,
|
||||||
D {
|
D {
|
||||||
|
@ -25,9 +25,12 @@
|
|||||||
//
|
//
|
||||||
// My heart aches in sorrow, for I know I am defeated. Let this be a warning
|
// My heart aches in sorrow, for I know I am defeated. Let this be a warning
|
||||||
// to all those who come after. Here stands the bastion of the Turbofish.
|
// to all those who come after. Here stands the bastion of the Turbofish.
|
||||||
|
//
|
||||||
|
// RIP Anna Harren, Guardian Angel of the Hallowed Turbofish. <3
|
||||||
|
|
||||||
// See https://github.com/rust-lang/rust/pull/53562
|
// See https://github.com/rust-lang/rust/pull/53562
|
||||||
// and https://github.com/rust-lang/rfcs/pull/2527
|
// and https://github.com/rust-lang/rfcs/pull/2527
|
||||||
|
// and https://twitter.com/garblefart/status/1393236602856611843
|
||||||
// for context.
|
// for context.
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
7
src/test/ui/impl-trait/issues/issue-54600.rs
Normal file
7
src/test/ui/impl-trait/issues/issue-54600.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use std::fmt::Debug;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x: Option<impl Debug> = Some(44_u32);
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
println!("{:?}", x);
|
||||||
|
}
|
9
src/test/ui/impl-trait/issues/issue-54600.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-54600.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-54600.rs:4:19
|
||||||
|
|
|
||||||
|
LL | let x: Option<impl Debug> = Some(44_u32);
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
7
src/test/ui/impl-trait/issues/issue-54840.rs
Normal file
7
src/test/ui/impl-trait/issues/issue-54840.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use std::ops::Add;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let i: i32 = 0;
|
||||||
|
let j: &impl Add = &i;
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
}
|
9
src/test/ui/impl-trait/issues/issue-54840.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-54840.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-54840.rs:5:13
|
||||||
|
|
|
||||||
|
LL | let j: &impl Add = &i;
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
12
src/test/ui/impl-trait/issues/issue-58504.rs
Normal file
12
src/test/ui/impl-trait/issues/issue-58504.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#![feature(generators, generator_trait, never_type)]
|
||||||
|
|
||||||
|
use std::ops::Generator;
|
||||||
|
|
||||||
|
fn mk_gen() -> impl Generator<Return=!, Yield=()> {
|
||||||
|
|| { loop { yield; } }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let gens: [impl Generator<Return=!, Yield=()>;2] = [ mk_gen(), mk_gen() ];
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
}
|
9
src/test/ui/impl-trait/issues/issue-58504.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-58504.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-58504.rs:10:16
|
||||||
|
|
|
||||||
|
LL | let gens: [impl Generator<Return=!, Yield=()>;2] = [ mk_gen(), mk_gen() ];
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
14
src/test/ui/impl-trait/issues/issue-58956.rs
Normal file
14
src/test/ui/impl-trait/issues/issue-58956.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
trait Lam {}
|
||||||
|
|
||||||
|
pub struct B;
|
||||||
|
impl Lam for B {}
|
||||||
|
pub struct Wrap<T>(T);
|
||||||
|
|
||||||
|
const _A: impl Lam = {
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
let x: Wrap<impl Lam> = Wrap(B);
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
x.0
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {}
|
15
src/test/ui/impl-trait/issues/issue-58956.stderr
Normal file
15
src/test/ui/impl-trait/issues/issue-58956.stderr
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-58956.rs:7:11
|
||||||
|
|
|
||||||
|
LL | const _A: impl Lam = {
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-58956.rs:9:17
|
||||||
|
|
|
||||||
|
LL | let x: Wrap<impl Lam> = Wrap(B);
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
4
src/test/ui/impl-trait/issues/issue-70971.rs
Normal file
4
src/test/ui/impl-trait/issues/issue-70971.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn main() {
|
||||||
|
let x : (impl Copy,) = (true,);
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
}
|
9
src/test/ui/impl-trait/issues/issue-70971.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-70971.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-70971.rs:2:14
|
||||||
|
|
|
||||||
|
LL | let x : (impl Copy,) = (true,);
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
10
src/test/ui/impl-trait/issues/issue-79099.rs
Normal file
10
src/test/ui/impl-trait/issues/issue-79099.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
struct Bug {
|
||||||
|
V1: [(); {
|
||||||
|
let f: impl core::future::Future<Output = u8> = async { 1 };
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
//~| expected identifier
|
||||||
|
1
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
20
src/test/ui/impl-trait/issues/issue-79099.stderr
Normal file
20
src/test/ui/impl-trait/issues/issue-79099.stderr
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
error: expected identifier, found `1`
|
||||||
|
--> $DIR/issue-79099.rs:3:65
|
||||||
|
|
|
||||||
|
LL | let f: impl core::future::Future<Output = u8> = async { 1 };
|
||||||
|
| ----- ^ expected identifier
|
||||||
|
| |
|
||||||
|
| `async` blocks are only allowed in Rust 2018 or later
|
||||||
|
|
|
||||||
|
= help: set `edition = "2018"` in `Cargo.toml`
|
||||||
|
= note: for more on editions, read https://doc.rust-lang.org/edition-guide
|
||||||
|
|
||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-79099.rs:3:16
|
||||||
|
|
|
||||||
|
LL | let f: impl core::future::Future<Output = u8> = async { 1 };
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
9
src/test/ui/impl-trait/issues/issue-84919.rs
Normal file
9
src/test/ui/impl-trait/issues/issue-84919.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
trait Trait {}
|
||||||
|
impl Trait for () {}
|
||||||
|
|
||||||
|
fn foo<'a: 'a>() {
|
||||||
|
let _x: impl Trait = ();
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
9
src/test/ui/impl-trait/issues/issue-84919.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-84919.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-84919.rs:5:13
|
||||||
|
|
|
||||||
|
LL | let _x: impl Trait = ();
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
13
src/test/ui/impl-trait/issues/issue-86201.rs
Normal file
13
src/test/ui/impl-trait/issues/issue-86201.rs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#![feature(unboxed_closures)]
|
||||||
|
#![feature(min_type_alias_impl_trait)]
|
||||||
|
|
||||||
|
type FunType = impl Fn<()>;
|
||||||
|
//~^ could not find defining uses
|
||||||
|
static STATIC_FN: FunType = some_fn;
|
||||||
|
//~^ mismatched types
|
||||||
|
|
||||||
|
fn some_fn() {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _: <FunType as FnOnce<()>>::Output = STATIC_FN();
|
||||||
|
}
|
21
src/test/ui/impl-trait/issues/issue-86201.stderr
Normal file
21
src/test/ui/impl-trait/issues/issue-86201.stderr
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/issue-86201.rs:6:29
|
||||||
|
|
|
||||||
|
LL | type FunType = impl Fn<()>;
|
||||||
|
| ----------- the expected opaque type
|
||||||
|
LL |
|
||||||
|
LL | static STATIC_FN: FunType = some_fn;
|
||||||
|
| ^^^^^^^ expected opaque type, found fn item
|
||||||
|
|
|
||||||
|
= note: expected opaque type `impl Fn<()>`
|
||||||
|
found fn item `fn() {some_fn}`
|
||||||
|
|
||||||
|
error: could not find defining uses
|
||||||
|
--> $DIR/issue-86201.rs:4:16
|
||||||
|
|
|
||||||
|
LL | type FunType = impl Fn<()>;
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
8
src/test/ui/impl-trait/issues/issue-86642.rs
Normal file
8
src/test/ui/impl-trait/issues/issue-86642.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
static x: impl Fn(&str) -> Result<&str, ()> = move |source| {
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
let res = (move |source| Ok(source))(source);
|
||||||
|
let res = res.or((move |source| Ok(source))(source));
|
||||||
|
res
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {}
|
9
src/test/ui/impl-trait/issues/issue-86642.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-86642.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-86642.rs:1:11
|
||||||
|
|
|
||||||
|
LL | static x: impl Fn(&str) -> Result<&str, ()> = move |source| {
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
18
src/test/ui/impl-trait/issues/issue-87295.rs
Normal file
18
src/test/ui/impl-trait/issues/issue-87295.rs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
trait Trait {
|
||||||
|
type Output;
|
||||||
|
}
|
||||||
|
impl Trait for () {
|
||||||
|
type Output = i32;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Struct<F>(F);
|
||||||
|
impl<F> Struct<F> {
|
||||||
|
pub fn new(_: F) -> Self {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _do_not_waste: Struct<impl Trait<Output = i32>> = Struct::new(());
|
||||||
|
//~^ `impl Trait` not allowed outside of function and method return types
|
||||||
|
}
|
9
src/test/ui/impl-trait/issues/issue-87295.stderr
Normal file
9
src/test/ui/impl-trait/issues/issue-87295.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0562]: `impl Trait` not allowed outside of function and method return types
|
||||||
|
--> $DIR/issue-87295.rs:16:31
|
||||||
|
|
|
||||||
|
LL | let _do_not_waste: Struct<impl Trait<Output = i32>> = Struct::new(());
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0562`.
|
@ -1,8 +1,8 @@
|
|||||||
error[E0038]: the trait `Qiz` cannot be made into an object
|
error[E0038]: the trait `Qiz` cannot be made into an object
|
||||||
--> $DIR/issue-19380.rs:11:9
|
--> $DIR/issue-19380.rs:11:29
|
||||||
|
|
|
|
||||||
LL | foos: &'static [&'static (dyn Qiz + 'static)]
|
LL | foos: &'static [&'static (dyn Qiz + 'static)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Qiz` cannot be made into an object
|
| ^^^^^^^^^^^^^^^^^ `Qiz` cannot be made into an object
|
||||||
|
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
--> $DIR/issue-19380.rs:2:6
|
--> $DIR/issue-19380.rs:2:6
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/wf-in-fn-type-arg.rs:9:8
|
--> $DIR/wf-in-fn-type-arg.rs:9:11
|
||||||
|
|
|
|
||||||
LL | struct MustBeCopy<T:Copy> {
|
LL | struct MustBeCopy<T:Copy> {
|
||||||
| ---- required by this bound in `MustBeCopy`
|
| ---- required by this bound in `MustBeCopy`
|
||||||
...
|
...
|
||||||
LL | x: fn(MustBeCopy<T>)
|
LL | x: fn(MustBeCopy<T>)
|
||||||
| ^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
|
|
|
||||||
help: consider restricting type parameter `T`
|
help: consider restricting type parameter `T`
|
||||||
|
|
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/wf-in-fn-type-ret.rs:9:8
|
--> $DIR/wf-in-fn-type-ret.rs:9:16
|
||||||
|
|
|
|
||||||
LL | struct MustBeCopy<T:Copy> {
|
LL | struct MustBeCopy<T:Copy> {
|
||||||
| ---- required by this bound in `MustBeCopy`
|
| ---- required by this bound in `MustBeCopy`
|
||||||
...
|
...
|
||||||
LL | x: fn() -> MustBeCopy<T>
|
LL | x: fn() -> MustBeCopy<T>
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
|
|
|
||||||
help: consider restricting type parameter `T`
|
help: consider restricting type parameter `T`
|
||||||
|
|
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error[E0277]: the trait bound `T: Copy` is not satisfied
|
error[E0277]: the trait bound `T: Copy` is not satisfied
|
||||||
--> $DIR/wf-in-obj-type-trait.rs:11:8
|
--> $DIR/wf-in-obj-type-trait.rs:11:19
|
||||||
|
|
|
|
||||||
LL | struct MustBeCopy<T:Copy> {
|
LL | struct MustBeCopy<T:Copy> {
|
||||||
| ---- required by this bound in `MustBeCopy`
|
| ---- required by this bound in `MustBeCopy`
|
||||||
...
|
...
|
||||||
LL | x: dyn Object<MustBeCopy<T>>
|
LL | x: dyn Object<MustBeCopy<T>>
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
| ^^^^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
||||||
|
|
|
|
||||||
help: consider restricting type parameter `T`
|
help: consider restricting type parameter `T`
|
||||||
|
|
|
|
||||||
|
Loading…
Reference in New Issue
Block a user