From d75e43c37137c1df80d5fee19eee19803918bd44 Mon Sep 17 00:00:00 2001 From: Caio Date: Thu, 16 Feb 2023 11:42:35 -0300 Subject: Move tests --- src/tools/tidy/src/ui_tests.rs | 2 +- tests/ui/associated-types/issue-38821.rs | 33 +++++ tests/ui/associated-types/issue-38821.stderr | 22 +++ tests/ui/borrowck/issue-83924.fixed | 20 +++ tests/ui/borrowck/issue-83924.rs | 20 +++ tests/ui/borrowck/issue-83924.stderr | 22 +++ tests/ui/consts/issue-33903.rs | 10 ++ tests/ui/consts/issue-54582.rs | 16 ++ tests/ui/drop/issue-2735-2.rs | 27 ++++ tests/ui/drop/issue-2735-3.rs | 27 ++++ tests/ui/drop/issue-2735.rs | 22 +++ tests/ui/fmt/issue-75307.rs | 3 + tests/ui/fmt/issue-75307.stderr | 8 + tests/ui/higher-rank-trait-bounds/issue-39292.rs | 17 +++ tests/ui/issues/issue-22536-copy-mustnt-zero.rs | 28 ---- tests/ui/issues/issue-2735-2.rs | 27 ---- tests/ui/issues/issue-2735-3.rs | 27 ---- tests/ui/issues/issue-2735.rs | 22 --- tests/ui/issues/issue-27583.rs | 47 ------ tests/ui/issues/issue-33903.rs | 10 -- tests/ui/issues/issue-38821.rs | 33 ----- tests/ui/issues/issue-38821.stderr | 22 --- tests/ui/issues/issue-39292.rs | 17 --- tests/ui/issues/issue-40003.rs | 178 ----------------------- tests/ui/issues/issue-48179.rs | 38 ----- tests/ui/issues/issue-50576.rs | 6 - tests/ui/issues/issue-50576.stderr | 22 --- tests/ui/issues/issue-53712.rs | 9 -- tests/ui/issues/issue-53712.stderr | 11 -- tests/ui/issues/issue-54582.rs | 16 -- tests/ui/issues/issue-75307.rs | 3 - tests/ui/issues/issue-75307.stderr | 8 - tests/ui/issues/issue-75777.rs | 15 -- tests/ui/issues/issue-75777.stderr | 11 -- tests/ui/issues/issue-7813.rs | 4 - tests/ui/issues/issue-7813.stderr | 14 -- tests/ui/issues/issue-83924.fixed | 20 --- tests/ui/issues/issue-83924.rs | 20 --- tests/ui/issues/issue-83924.stderr | 22 --- tests/ui/loops/issue-50576.rs | 6 + tests/ui/loops/issue-50576.stderr | 22 +++ tests/ui/moves/issue-22536-copy-mustnt-zero.rs | 28 ++++ tests/ui/nll/issue-27583.rs | 47 ++++++ tests/ui/nll/issue-48179.rs | 38 +++++ tests/ui/nll/issue-75777.rs | 15 ++ tests/ui/nll/issue-75777.stderr | 11 ++ tests/ui/recursion_limit/issue-40003.rs | 178 +++++++++++++++++++++++ tests/ui/typeck/issue-53712.rs | 9 ++ tests/ui/typeck/issue-53712.stderr | 11 ++ tests/ui/typeck/issue-7813.rs | 4 + tests/ui/typeck/issue-7813.stderr | 14 ++ 51 files changed, 631 insertions(+), 631 deletions(-) create mode 100644 tests/ui/associated-types/issue-38821.rs create mode 100644 tests/ui/associated-types/issue-38821.stderr create mode 100644 tests/ui/borrowck/issue-83924.fixed create mode 100644 tests/ui/borrowck/issue-83924.rs create mode 100644 tests/ui/borrowck/issue-83924.stderr create mode 100644 tests/ui/consts/issue-33903.rs create mode 100644 tests/ui/consts/issue-54582.rs create mode 100644 tests/ui/drop/issue-2735-2.rs create mode 100644 tests/ui/drop/issue-2735-3.rs create mode 100644 tests/ui/drop/issue-2735.rs create mode 100644 tests/ui/fmt/issue-75307.rs create mode 100644 tests/ui/fmt/issue-75307.stderr create mode 100644 tests/ui/higher-rank-trait-bounds/issue-39292.rs delete mode 100644 tests/ui/issues/issue-22536-copy-mustnt-zero.rs delete mode 100644 tests/ui/issues/issue-2735-2.rs delete mode 100644 tests/ui/issues/issue-2735-3.rs delete mode 100644 tests/ui/issues/issue-2735.rs delete mode 100644 tests/ui/issues/issue-27583.rs delete mode 100644 tests/ui/issues/issue-33903.rs delete mode 100644 tests/ui/issues/issue-38821.rs delete mode 100644 tests/ui/issues/issue-38821.stderr delete mode 100644 tests/ui/issues/issue-39292.rs delete mode 100644 tests/ui/issues/issue-40003.rs delete mode 100644 tests/ui/issues/issue-48179.rs delete mode 100644 tests/ui/issues/issue-50576.rs delete mode 100644 tests/ui/issues/issue-50576.stderr delete mode 100644 tests/ui/issues/issue-53712.rs delete mode 100644 tests/ui/issues/issue-53712.stderr delete mode 100644 tests/ui/issues/issue-54582.rs delete mode 100644 tests/ui/issues/issue-75307.rs delete mode 100644 tests/ui/issues/issue-75307.stderr delete mode 100644 tests/ui/issues/issue-75777.rs delete mode 100644 tests/ui/issues/issue-75777.stderr delete mode 100644 tests/ui/issues/issue-7813.rs delete mode 100644 tests/ui/issues/issue-7813.stderr delete mode 100644 tests/ui/issues/issue-83924.fixed delete mode 100644 tests/ui/issues/issue-83924.rs delete mode 100644 tests/ui/issues/issue-83924.stderr create mode 100644 tests/ui/loops/issue-50576.rs create mode 100644 tests/ui/loops/issue-50576.stderr create mode 100644 tests/ui/moves/issue-22536-copy-mustnt-zero.rs create mode 100644 tests/ui/nll/issue-27583.rs create mode 100644 tests/ui/nll/issue-48179.rs create mode 100644 tests/ui/nll/issue-75777.rs create mode 100644 tests/ui/nll/issue-75777.stderr create mode 100644 tests/ui/recursion_limit/issue-40003.rs create mode 100644 tests/ui/typeck/issue-53712.rs create mode 100644 tests/ui/typeck/issue-53712.stderr create mode 100644 tests/ui/typeck/issue-7813.rs create mode 100644 tests/ui/typeck/issue-7813.stderr diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs index ef3abb9514f..409f7563184 100644 --- a/src/tools/tidy/src/ui_tests.rs +++ b/src/tools/tidy/src/ui_tests.rs @@ -10,7 +10,7 @@ use std::path::Path; const ENTRY_LIMIT: usize = 1000; // FIXME: The following limits should be reduced eventually. const ROOT_ENTRY_LIMIT: usize = 940; -const ISSUES_ENTRY_LIMIT: usize = 2001; +const ISSUES_ENTRY_LIMIT: usize = 1978; fn check_entries(path: &Path, bad: &mut bool) { for dir in Walk::new(&path.join("ui")) { diff --git a/tests/ui/associated-types/issue-38821.rs b/tests/ui/associated-types/issue-38821.rs new file mode 100644 index 00000000000..6753860e9ff --- /dev/null +++ b/tests/ui/associated-types/issue-38821.rs @@ -0,0 +1,33 @@ +pub struct Nullable(T); + +pub trait NotNull {} + +pub trait IntoNullable { + type Nullable; +} + +impl IntoNullable for T { + type Nullable = Nullable; +} + +impl IntoNullable for Nullable { + type Nullable = Nullable; +} + +pub trait Expression { + type SqlType; +} + +pub trait Column: Expression {} + +#[derive(Debug, Copy, Clone)] +//~^ ERROR the trait bound `::SqlType: NotNull` is not satisfied +pub enum ColumnInsertValue where + Col: Column, + Expr: Expression::Nullable>, +{ + Expression(Col, Expr), + Default(Col), +} + +fn main() {} diff --git a/tests/ui/associated-types/issue-38821.stderr b/tests/ui/associated-types/issue-38821.stderr new file mode 100644 index 00000000000..a52a9c138f1 --- /dev/null +++ b/tests/ui/associated-types/issue-38821.stderr @@ -0,0 +1,22 @@ +error[E0277]: the trait bound `::SqlType: NotNull` is not satisfied + --> $DIR/issue-38821.rs:23:17 + | +LL | #[derive(Debug, Copy, Clone)] + | ^^^^ the trait `NotNull` is not implemented for `::SqlType` + | +note: required for `::SqlType` to implement `IntoNullable` + --> $DIR/issue-38821.rs:9:18 + | +LL | impl IntoNullable for T { + | ------- ^^^^^^^^^^^^ ^ + | | + | unsatisfied trait bound introduced here + = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info) +help: consider further restricting the associated type + | +LL | Expr: Expression::Nullable>, ::SqlType: NotNull, + | +++++++++++++++++++++++++++++++++++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/borrowck/issue-83924.fixed b/tests/ui/borrowck/issue-83924.fixed new file mode 100644 index 00000000000..aa40da12b87 --- /dev/null +++ b/tests/ui/borrowck/issue-83924.fixed @@ -0,0 +1,20 @@ +// run-rustfix + +fn main() { + let mut values = vec![10, 11, 12]; + let v = &mut values; + + let mut max = 0; + + for n in &mut *v { + max = std::cmp::max(max, *n); + } + + println!("max is {}", max); + println!("Converting to percentages of maximum value..."); + for n in v { + //~^ ERROR: use of moved value: `v` [E0382] + *n = 100 * (*n) / max; + } + println!("values: {:#?}", values); +} diff --git a/tests/ui/borrowck/issue-83924.rs b/tests/ui/borrowck/issue-83924.rs new file mode 100644 index 00000000000..22b80fe2f38 --- /dev/null +++ b/tests/ui/borrowck/issue-83924.rs @@ -0,0 +1,20 @@ +// run-rustfix + +fn main() { + let mut values = vec![10, 11, 12]; + let v = &mut values; + + let mut max = 0; + + for n in v { + max = std::cmp::max(max, *n); + } + + println!("max is {}", max); + println!("Converting to percentages of maximum value..."); + for n in v { + //~^ ERROR: use of moved value: `v` [E0382] + *n = 100 * (*n) / max; + } + println!("values: {:#?}", values); +} diff --git a/tests/ui/borrowck/issue-83924.stderr b/tests/ui/borrowck/issue-83924.stderr new file mode 100644 index 00000000000..572414df2bf --- /dev/null +++ b/tests/ui/borrowck/issue-83924.stderr @@ -0,0 +1,22 @@ +error[E0382]: use of moved value: `v` + --> $DIR/issue-83924.rs:15:14 + | +LL | let v = &mut values; + | - move occurs because `v` has type `&mut Vec`, which does not implement the `Copy` trait +... +LL | for n in v { + | - `v` moved due to this implicit call to `.into_iter()` +... +LL | for n in v { + | ^ value used here after move + | +note: `into_iter` takes ownership of the receiver `self`, which moves `v` + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL +help: consider creating a fresh reborrow of `v` here + | +LL | for n in &mut *v { + | ++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0382`. diff --git a/tests/ui/consts/issue-33903.rs b/tests/ui/consts/issue-33903.rs new file mode 100644 index 00000000000..613aa121a47 --- /dev/null +++ b/tests/ui/consts/issue-33903.rs @@ -0,0 +1,10 @@ +// check-pass +#![allow(dead_code)] +// Issue 33903: +// Built-in indexing should be used even when the index is not +// trivially an integer +// Only built-in indexing can be used in constant expressions + +const FOO: i32 = [12, 34][0 + 1]; + +fn main() {} diff --git a/tests/ui/consts/issue-54582.rs b/tests/ui/consts/issue-54582.rs new file mode 100644 index 00000000000..8c50cac67f8 --- /dev/null +++ b/tests/ui/consts/issue-54582.rs @@ -0,0 +1,16 @@ +// run-pass + +pub trait Stage: Sync {} + +pub enum Enum { + A, + B, +} + +impl Stage for Enum {} + +pub static ARRAY: [(&dyn Stage, &str); 1] = [ + (&Enum::A, ""), +]; + +fn main() {} diff --git a/tests/ui/drop/issue-2735-2.rs b/tests/ui/drop/issue-2735-2.rs new file mode 100644 index 00000000000..70ebce9d35a --- /dev/null +++ b/tests/ui/drop/issue-2735-2.rs @@ -0,0 +1,27 @@ +// run-pass +#![allow(non_camel_case_types)] + +use std::cell::Cell; + +// This test should behave exactly like issue-2735-3 +struct defer<'a> { + b: &'a Cell, +} + +impl<'a> Drop for defer<'a> { + fn drop(&mut self) { + self.b.set(true); + } +} + +fn defer(b: &Cell) -> defer { + defer { + b: b + } +} + +pub fn main() { + let dtor_ran = &Cell::new(false); + let _ = defer(dtor_ran); + assert!(dtor_ran.get()); +} diff --git a/tests/ui/drop/issue-2735-3.rs b/tests/ui/drop/issue-2735-3.rs new file mode 100644 index 00000000000..23301537835 --- /dev/null +++ b/tests/ui/drop/issue-2735-3.rs @@ -0,0 +1,27 @@ +// run-pass +#![allow(non_camel_case_types)] + +use std::cell::Cell; + +// This test should behave exactly like issue-2735-2 +struct defer<'a> { + b: &'a Cell, +} + +impl<'a> Drop for defer<'a> { + fn drop(&mut self) { + self.b.set(true); + } +} + +fn defer(b: &Cell) -> defer { + defer { + b: b + } +} + +pub fn main() { + let dtor_ran = &Cell::new(false); + defer(dtor_ran); + assert!(dtor_ran.get()); +} diff --git a/tests/ui/drop/issue-2735.rs b/tests/ui/drop/issue-2735.rs new file mode 100644 index 00000000000..20d3949a9f9 --- /dev/null +++ b/tests/ui/drop/issue-2735.rs @@ -0,0 +1,22 @@ +// run-pass +#![allow(dead_code)] +#![allow(non_camel_case_types)] + +// pretty-expanded FIXME #23616 + +trait hax { + fn dummy(&self) { } +} +impl hax for A { } + +fn perform_hax(x: Box) -> Box { + Box::new(x) as Box +} + +fn deadcode() { + perform_hax(Box::new("deadcode".to_string())); +} + +pub fn main() { + perform_hax(Box::new(42)); +} diff --git a/tests/ui/fmt/issue-75307.rs b/tests/ui/fmt/issue-75307.rs new file mode 100644 index 00000000000..cffa6bea8ed --- /dev/null +++ b/tests/ui/fmt/issue-75307.rs @@ -0,0 +1,3 @@ +fn main() { + format!(r"{}{}{}", named_arg=1); //~ ERROR 3 positional arguments in format string, but there is 1 argument +} diff --git a/tests/ui/fmt/issue-75307.stderr b/tests/ui/fmt/issue-75307.stderr new file mode 100644 index 00000000000..c5b0b11e7d0 --- /dev/null +++ b/tests/ui/fmt/issue-75307.stderr @@ -0,0 +1,8 @@ +error: 3 positional arguments in format string, but there is 1 argument + --> $DIR/issue-75307.rs:2:15 + | +LL | format!(r"{}{}{}", named_arg=1); + | ^^^^^^ - + +error: aborting due to previous error + diff --git a/tests/ui/higher-rank-trait-bounds/issue-39292.rs b/tests/ui/higher-rank-trait-bounds/issue-39292.rs new file mode 100644 index 00000000000..968cf08916f --- /dev/null +++ b/tests/ui/higher-rank-trait-bounds/issue-39292.rs @@ -0,0 +1,17 @@ +// run-pass +// Regression test for issue #39292. The object vtable was being +// incorrectly left with a null pointer. + +trait Foo { + fn print<'a>(&'a self) where T: 'a { println!("foo"); } +} + +impl<'a> Foo<&'a ()> for () { } + +trait Bar: for<'a> Foo<&'a ()> { } + +impl Bar for () {} + +fn main() { + (&() as &dyn Bar).print(); // Segfault +} diff --git a/tests/ui/issues/issue-22536-copy-mustnt-zero.rs b/tests/ui/issues/issue-22536-copy-mustnt-zero.rs deleted file mode 100644 index 017f36484c1..00000000000 --- a/tests/ui/issues/issue-22536-copy-mustnt-zero.rs +++ /dev/null @@ -1,28 +0,0 @@ -// run-pass -// Regression test for Issue #22536: If a type implements Copy, then -// moving it must not zero the original memory. - - -trait Resources { - type Buffer: Copy; - fn foo(&self) {} -} - -struct BufferHandle { - raw: ::Buffer, -} -impl Copy for BufferHandle {} -impl Clone for BufferHandle { - fn clone(&self) -> BufferHandle { *self } -} - -enum Res {} -impl Resources for Res { - type Buffer = u32; -} - -fn main() { - let b: BufferHandle = BufferHandle { raw: 1 }; - let c = b; - assert_eq!(c.raw, b.raw) -} diff --git a/tests/ui/issues/issue-2735-2.rs b/tests/ui/issues/issue-2735-2.rs deleted file mode 100644 index 70ebce9d35a..00000000000 --- a/tests/ui/issues/issue-2735-2.rs +++ /dev/null @@ -1,27 +0,0 @@ -// run-pass -#![allow(non_camel_case_types)] - -use std::cell::Cell; - -// This test should behave exactly like issue-2735-3 -struct defer<'a> { - b: &'a Cell, -} - -impl<'a> Drop for defer<'a> { - fn drop(&mut self) { - self.b.set(true); - } -} - -fn defer(b: &Cell) -> defer { - defer { - b: b - } -} - -pub fn main() { - let dtor_ran = &Cell::new(false); - let _ = defer(dtor_ran); - assert!(dtor_ran.get()); -} diff --git a/tests/ui/issues/issue-2735-3.rs b/tests/ui/issues/issue-2735-3.rs deleted file mode 100644 index 23301537835..00000000000 --- a/tests/ui/issues/issue-2735-3.rs +++ /dev/null @@ -1,27 +0,0 @@ -// run-pass -#![allow(non_camel_case_types)] - -use std::cell::Cell; - -// This test should behave exactly like issue-2735-2 -struct defer<'a> { - b: &'a Cell, -} - -impl<'a> Drop for defer<'a> { - fn drop(&mut self) { - self.b.set(true); - } -} - -fn defer(b: &Cell) -> defer { - defer { - b: b - } -} - -pub fn main() { - let dtor_ran = &Cell::new(false); - defer(dtor_ran); - assert!(dtor_ran.get()); -} diff --git a/tests/ui/issues/issue-2735.rs b/tests/ui/issues/issue-2735.rs deleted file mode 100644 index 20d3949a9f9..00000000000 --- a/tests/ui/issues/issue-2735.rs +++ /dev/null @@ -1,22 +0,0 @@ -// run-pass -#![allow(dead_code)] -#![allow(non_camel_case_types)] - -// pretty-expanded FIXME #23616 - -trait hax { - fn dummy(&self) { } -} -impl hax for A { } - -fn perform_hax(x: Box) -> Box { - Box::new(x) as Box -} - -fn deadcode() { - perform_hax(Box::new("deadcode".to_string())); -} - -pub fn main() { - perform_hax(Box::new(42)); -} diff --git a/tests/ui/issues/issue-27583.rs b/tests/ui/issues/issue-27583.rs deleted file mode 100644 index 84c94c7c905..00000000000 --- a/tests/ui/issues/issue-27583.rs +++ /dev/null @@ -1,47 +0,0 @@ -// check-pass -// Regression test for issue #27583. Unclear how useful this will be -// going forward, since the issue in question was EXTREMELY sensitive -// to compiler internals (like the precise numbering of nodes), but -// what the hey. - -#![allow(warnings)] - -use std::cell::Cell; -use std::marker::PhantomData; - -pub trait Delegate<'tcx> { } - -pub struct InferCtxt<'a, 'tcx: 'a> { - x: PhantomData<&'a Cell<&'tcx ()>> -} - -pub struct MemCategorizationContext<'t, 'a: 't, 'tcx : 'a> { - x: &'t InferCtxt<'a, 'tcx>, -} - -pub struct ExprUseVisitor<'d, 't, 'a: 't, 'tcx:'a+'d> { - typer: &'t InferCtxt<'a, 'tcx>, - mc: MemCategorizationContext<'t, 'a, 'tcx>, - delegate: &'d mut (Delegate<'tcx>+'d), -} - -impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> { - pub fn new(delegate: &'d mut Delegate<'tcx>, - typer: &'t InferCtxt<'a, 'tcx>) - -> ExprUseVisitor<'d,'t,'a,'tcx> - { - ExprUseVisitor { - typer: typer, - mc: MemCategorizationContext::new(typer), - delegate: delegate, - } - } -} - -impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> { - pub fn new(typer: &'t InferCtxt<'a, 'tcx>) -> MemCategorizationContext<'t, 'a, 'tcx> { - MemCategorizationContext { x: typer } - } -} - -fn main() { } diff --git a/tests/ui/issues/issue-33903.rs b/tests/ui/issues/issue-33903.rs deleted file mode 100644 index 613aa121a47..00000000000 --- a/tests/ui/issues/issue-33903.rs +++ /dev/null @@ -1,10 +0,0 @@ -// check-pass -#![allow(dead_code)] -// Issue 33903: -// Built-in indexing should be used even when the index is not -// trivially an integer -// Only built-in indexing can be used in constant expressions - -const FOO: i32 = [12, 34][0 + 1]; - -fn main() {} diff --git a/tests/ui/issues/issue-38821.rs b/tests/ui/issues/issue-38821.rs deleted file mode 100644 index 6753860e9ff..00000000000 --- a/tests/ui/issues/issue-38821.rs +++ /dev/null @@ -1,33 +0,0 @@ -pub struct Nullable(T); - -pub trait NotNull {} - -pub trait IntoNullable { - type Nullable; -} - -impl IntoNullable for T { - type Nullable = Nullable; -} - -impl IntoNullable for Nullable { - type Nullable = Nullable; -} - -pub trait Expression { - type SqlType; -} - -pub trait Column: Expression {} - -#[derive(Debug, Copy, Clone)] -//~^ ERROR the trait bound `::SqlType: NotNull` is not satisfied -pub enum ColumnInsertValue where - Col: Column, - Expr: Expression::Nullable>, -{ - Expression(Col, Expr), - Default(Col), -} - -fn main() {} diff --git a/tests/ui/issues/issue-38821.stderr b/tests/ui/issues/issue-38821.stderr deleted file mode 100644 index a52a9c138f1..00000000000 --- a/tests/ui/issues/issue-38821.stderr +++ /dev/null @@ -1,22 +0,0 @@ -error[E0277]: the trait bound `::SqlType: NotNull` is not satisfied - --> $DIR/issue-38821.rs:23:17 - | -LL | #[derive(Debug, Copy, Clone)] - | ^^^^ the trait `NotNull` is not implemented for `::SqlType` - | -note: required for `::SqlType` to implement `IntoNullable` - --> $DIR/issue-38821.rs:9:18 - | -LL | impl IntoNullable for T { - | ------- ^^^^^^^^^^^^ ^ - | | - | unsatisfied trait bound introduced here - = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info) -help: consider further restricting the associated type - | -LL | Expr: Expression::Nullable>, ::SqlType: NotNull, - | +++++++++++++++++++++++++++++++++++++++ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/issues/issue-39292.rs b/tests/ui/issues/issue-39292.rs deleted file mode 100644 index 968cf08916f..00000000000 --- a/tests/ui/issues/issue-39292.rs +++ /dev/null @@ -1,17 +0,0 @@ -// run-pass -// Regression test for issue #39292. The object vtable was being -// incorrectly left with a null pointer. - -trait Foo { - fn print<'a>(&'a self) where T: 'a { println!("foo"); } -} - -impl<'a> Foo<&'a ()> for () { } - -trait Bar: for<'a> Foo<&'a ()> { } - -impl Bar for () {} - -fn main() { - (&() as &dyn Bar).print(); // Segfault -} diff --git a/tests/ui/issues/issue-40003.rs b/tests/ui/issues/issue-40003.rs deleted file mode 100644 index 5e61361f987..00000000000 --- a/tests/ui/issues/issue-40003.rs +++ /dev/null @@ -1,178 +0,0 @@ -// run-pass -#![allow(unused_must_use)] -fn main() { - if false { test(); } -} - -fn test() { - let rx = Err::, u32>(1).into_future(); - - rx.map(|l: Vec| stream::iter(l.into_iter().map(|i| Ok(i)))) - .flatten_stream() - .chunks(50) - .buffer_unordered(5); -} - -use future::{Future, IntoFuture}; -mod future { - use std::result; - - use {stream, Stream}; - - pub trait Future { - type Item; - type Error; - - fn map(self, _: F) -> Map - where F: FnOnce(Self::Item) -> U, - Self: Sized, - { - panic!() - } - - fn flatten_stream(self) -> FlattenStream - where ::Item: stream::Stream, - Self: Sized - { - panic!() - } - } - - pub trait IntoFuture { - type Future: Future; - type Item; - type Error; - fn into_future(self) -> Self::Future; - } - - impl IntoFuture for F { - type Future = F; - type Item = F::Item; - type Error = F::Error; - - fn into_future(self) -> F { - panic!() - } - } - - impl IntoFuture for result::Result { - type Future = FutureResult; - type Item = T; - type Error = E; - - fn into_future(self) -> FutureResult { - panic!() - } - } - - pub struct Map { - _a: (A, F), - } - - impl Future for Map - where A: Future, - F: FnOnce(A::Item) -> U, - { - type Item = U; - type Error = A::Error; - } - - pub struct FlattenStream { - _f: F, - } - - impl Stream for FlattenStream - where F: Future, - ::Item: Stream, - { - type Item = ::Item; - type Error = ::Error; - } - - pub struct FutureResult { - _inner: (T, E), - } - - impl Future for FutureResult { - type Item = T; - type Error = E; - } -} - -mod stream { - use IntoFuture; - - pub trait Stream { - type Item; - type Error; - - fn buffer_unordered(self, amt: usize) -> BufferUnordered - where Self::Item: IntoFuture::Error>, - Self: Sized - { - new(self, amt) - } - - fn chunks(self, _capacity: usize) -> Chunks - where Self: Sized - { - panic!() - } - } - - pub struct IterStream { - _iter: I, - } - - pub fn iter(_: J) -> IterStream - where J: IntoIterator>, - { - panic!() - } - - impl Stream for IterStream - where I: Iterator>, - { - type Item = T; - type Error = E; - } - - pub struct Chunks { - _stream: S - } - - impl Stream for Chunks - where S: Stream - { - type Item = Result::Item>, u32>; - type Error = ::Error; - } - - pub struct BufferUnordered { - _stream: S, - } - - enum Slot { - Next(#[allow(unused_tuple_struct_fields)] usize), - _Data { _a: T }, - } - - fn new(_s: S, _amt: usize) -> BufferUnordered - where S: Stream, - S::Item: IntoFuture::Error>, - { - (0..0).map(|_| { - Slot::Next::<::Future>(1) - }).collect::>(); - panic!() - } - - impl Stream for BufferUnordered - where S: Stream, - S::Item: IntoFuture::Error>, - { - type Item = ::Item; - type Error = ::Error; - } -} -use stream::Stream; diff --git a/tests/ui/issues/issue-48179.rs b/tests/ui/issues/issue-48179.rs deleted file mode 100644 index f81203dc412..00000000000 --- a/tests/ui/issues/issue-48179.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Regression test for #48132. This was failing due to problems around -// the projection caching and dropck type enumeration. - -// check-pass - -pub struct Container { - value: Option, -} - -impl Container { - pub fn new(iter: T) -> Self { - panic!() - } -} - -pub struct Wrapper<'a> { - content: &'a Content, -} - -impl<'a, 'de> Wrapper<'a> { - pub fn new(content: &'a Content) -> Self { - Wrapper { - content: content, - } - } -} - -pub struct Content; - -fn crash_it(content: Content) { - let items = vec![content]; - let map = items.iter().map(|ref o| Wrapper::new(o)); - - let mut map_visitor = Container::new(map); - -} - -fn main() {} diff --git a/tests/ui/issues/issue-50576.rs b/tests/ui/issues/issue-50576.rs deleted file mode 100644 index e0c36b8273a..00000000000 --- a/tests/ui/issues/issue-50576.rs +++ /dev/null @@ -1,6 +0,0 @@ -fn main() { - |bool: [u8; break 'L]| 0; - //~^ ERROR [E0426] - //~| ERROR [E0268] - Vec::<[u8; break]>::new(); //~ ERROR [E0268] -} diff --git a/tests/ui/issues/issue-50576.stderr b/tests/ui/issues/issue-50576.stderr deleted file mode 100644 index 4ec22fde910..00000000000 --- a/tests/ui/issues/issue-50576.stderr +++ /dev/null @@ -1,22 +0,0 @@ -error[E0426]: use of undeclared label `'L` - --> $DIR/issue-50576.rs:2:23 - | -LL | |bool: [u8; break 'L]| 0; - | ^^ undeclared label `'L` - -error[E0268]: `break` outside of a loop or labeled block - --> $DIR/issue-50576.rs:2:17 - | -LL | |bool: [u8; break 'L]| 0; - | ^^^^^^^^ cannot `break` outside of a loop or labeled block - -error[E0268]: `break` outside of a loop or labeled block - --> $DIR/issue-50576.rs:5:16 - | -LL | Vec::<[u8; break]>::new(); - | ^^^^^ cannot `break` outside of a loop or labeled block - -error: aborting due to 3 previous errors - -Some errors have detailed explanations: E0268, E0426. -For more information about an error, try `rustc --explain E0268`. diff --git a/tests/ui/issues/issue-53712.rs b/tests/ui/issues/issue-53712.rs deleted file mode 100644 index 2353904d79d..00000000000 --- a/tests/ui/issues/issue-53712.rs +++ /dev/null @@ -1,9 +0,0 @@ -// issue #53712: make the error generated by using tuple indexing on an array more specific - -fn main() { - let arr = [10, 20, 30, 40, 50]; - arr.0; - //~^ ERROR no field `0` on type `[{integer}; 5]` [E0609] - //~| HELP instead of using tuple indexing, use array indexing - //~| SUGGESTION arr[0] -} diff --git a/tests/ui/issues/issue-53712.stderr b/tests/ui/issues/issue-53712.stderr deleted file mode 100644 index db85919afcb..00000000000 --- a/tests/ui/issues/issue-53712.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error[E0609]: no field `0` on type `[{integer}; 5]` - --> $DIR/issue-53712.rs:5:9 - | -LL | arr.0; - | ----^ - | | - | help: instead of using tuple indexing, use array indexing: `arr[0]` - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0609`. diff --git a/tests/ui/issues/issue-54582.rs b/tests/ui/issues/issue-54582.rs deleted file mode 100644 index 8c50cac67f8..00000000000 --- a/tests/ui/issues/issue-54582.rs +++ /dev/null @@ -1,16 +0,0 @@ -// run-pass - -pub trait Stage: Sync {} - -pub enum Enum { - A, - B, -} - -impl Stage for Enum {} - -pub static ARRAY: [(&dyn Stage, &str); 1] = [ - (&Enum::A, ""), -]; - -fn main() {} diff --git a/tests/ui/issues/issue-75307.rs b/tests/ui/issues/issue-75307.rs deleted file mode 100644 index cffa6bea8ed..00000000000 --- a/tests/ui/issues/issue-75307.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - format!(r"{}{}{}", named_arg=1); //~ ERROR 3 positional arguments in format string, but there is 1 argument -} diff --git a/tests/ui/issues/issue-75307.stderr b/tests/ui/issues/issue-75307.stderr deleted file mode 100644 index c5b0b11e7d0..00000000000 --- a/tests/ui/issues/issue-75307.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: 3 positional arguments in format string, but there is 1 argument - --> $DIR/issue-75307.rs:2:15 - | -LL | format!(r"{}{}{}", named_arg=1); - | ^^^^^^ - - -error: aborting due to previous error - diff --git a/tests/ui/issues/issue-75777.rs b/tests/ui/issues/issue-75777.rs deleted file mode 100644 index a1e438bc617..00000000000 --- a/tests/ui/issues/issue-75777.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Regression test for #75777. -// Checks that a boxed future can be properly constructed. - -use std::future::{self, Future}; -use std::pin::Pin; - -type BoxFuture<'a, T> = Pin + 'a + Send>>; - -fn inject<'a, Env: 'a, A: 'a + Send>(v: A) -> Box BoxFuture<'a, A>> { - let fut: BoxFuture<'a, A> = Box::pin(future::ready(v)); - Box::new(move |_| fut) - //~^ ERROR: lifetime may not live long enough -} - -fn main() {} diff --git a/tests/ui/issues/issue-75777.stderr b/tests/ui/issues/issue-75777.stderr deleted file mode 100644 index 370cd72fd55..00000000000 --- a/tests/ui/issues/issue-75777.stderr +++ /dev/null @@ -1,11 +0,0 @@ -error: lifetime may not live long enough - --> $DIR/issue-75777.rs:11:5 - | -LL | fn inject<'a, Env: 'a, A: 'a + Send>(v: A) -> Box BoxFuture<'a, A>> { - | -- lifetime `'a` defined here -LL | let fut: BoxFuture<'a, A> = Box::pin(future::ready(v)); -LL | Box::new(move |_| fut) - | ^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static` - -error: aborting due to previous error - diff --git a/tests/ui/issues/issue-7813.rs b/tests/ui/issues/issue-7813.rs deleted file mode 100644 index ce549bde601..00000000000 --- a/tests/ui/issues/issue-7813.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - let v = &[]; //~ ERROR type annotations needed - let it = v.iter(); -} diff --git a/tests/ui/issues/issue-7813.stderr b/tests/ui/issues/issue-7813.stderr deleted file mode 100644 index 2a747f679a8..00000000000 --- a/tests/ui/issues/issue-7813.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error[E0282]: type annotations needed for `&[_; 0]` - --> $DIR/issue-7813.rs:2:9 - | -LL | let v = &[]; - | ^ --- type must be known at this point - | -help: consider giving `v` an explicit type, where the placeholders `_` are specified - | -LL | let v: &[_; 0] = &[]; - | +++++++++ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0282`. diff --git a/tests/ui/issues/issue-83924.fixed b/tests/ui/issues/issue-83924.fixed deleted file mode 100644 index aa40da12b87..00000000000 --- a/tests/ui/issues/issue-83924.fixed +++ /dev/null @@ -1,20 +0,0 @@ -// run-rustfix - -fn main() { - let mut values = vec![10, 11, 12]; - let v = &mut values; - - let mut max = 0; - - for n in &mut *v { - max = std::cmp::max(max, *n); - } - - println!("max is {}", max); - println!("Converting to percentages of maximum value..."); - for n in v { - //~^ ERROR: use of moved value: `v` [E0382] - *n = 100 * (*n) / max; - } - println!("values: {:#?}", values); -} diff --git a/tests/ui/issues/issue-83924.rs b/tests/ui/issues/issue-83924.rs deleted file mode 100644 index 22b80fe2f38..00000000000 --- a/tests/ui/issues/issue-83924.rs +++ /dev/null @@ -1,20 +0,0 @@ -// run-rustfix - -fn main() { - let mut values = vec![10, 11, 12]; - let v = &mut values; - - let mut max = 0; - - for n in v { - max = std::cmp::max(max, *n); - } - - println!("max is {}", max); - println!("Converting to percentages of maximum value..."); - for n in v { - //~^ ERROR: use of moved value: `v` [E0382] - *n = 100 * (*n) / max; - } - println!("values: {:#?}", values); -} diff --git a/tests/ui/issues/issue-83924.stderr b/tests/ui/issues/issue-83924.stderr deleted file mode 100644 index 572414df2bf..00000000000 --- a/tests/ui/issues/issue-83924.stderr +++ /dev/null @@ -1,22 +0,0 @@ -error[E0382]: use of moved value: `v` - --> $DIR/issue-83924.rs:15:14 - | -LL | let v = &mut values; - | - move occurs because `v` has type `&mut Vec`, which does not implement the `Copy` trait -... -LL | for n in v { - | - `v` moved due to this implicit call to `.into_iter()` -... -LL | for n in v { - | ^ value used here after move - | -note: `into_iter` takes ownership of the receiver `self`, which moves `v` - --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL -help: consider creating a fresh reborrow of `v` here - | -LL | for n in &mut *v { - | ++++++ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0382`. diff --git a/tests/ui/loops/issue-50576.rs b/tests/ui/loops/issue-50576.rs new file mode 100644 index 00000000000..e0c36b8273a --- /dev/null +++ b/tests/ui/loops/issue-50576.rs @@ -0,0 +1,6 @@ +fn main() { + |bool: [u8; break 'L]| 0; + //~^ ERROR [E0426] + //~| ERROR [E0268] + Vec::<[u8; break]>::new(); //~ ERROR [E0268] +} diff --git a/tests/ui/loops/issue-50576.stderr b/tests/ui/loops/issue-50576.stderr new file mode 100644 index 00000000000..4ec22fde910 --- /dev/null +++ b/tests/ui/loops/issue-50576.stderr @@ -0,0 +1,22 @@ +error[E0426]: use of undeclared label `'L` + --> $DIR/issue-50576.rs:2:23 + | +LL | |bool: [u8; break 'L]| 0; + | ^^ undeclared label `'L` + +error[E0268]: `break` outside of a loop or labeled block + --> $DIR/issue-50576.rs:2:17 + | +LL | |bool: [u8; break 'L]| 0; + | ^^^^^^^^ cannot `break` outside of a loop or labeled block + +error[E0268]: `break` outside of a loop or labeled block + --> $DIR/issue-50576.rs:5:16 + | +LL | Vec::<[u8; break]>::new(); + | ^^^^^ cannot `break` outside of a loop or labeled block + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0268, E0426. +For more information about an error, try `rustc --explain E0268`. diff --git a/tests/ui/moves/issue-22536-copy-mustnt-zero.rs b/tests/ui/moves/issue-22536-copy-mustnt-zero.rs new file mode 100644 index 00000000000..017f36484c1 --- /dev/null +++ b/tests/ui/moves/issue-22536-copy-mustnt-zero.rs @@ -0,0 +1,28 @@ +// run-pass +// Regression test for Issue #22536: If a type implements Copy, then +// moving it must not zero the original memory. + + +trait Resources { + type Buffer: Copy; + fn foo(&self) {} +} + +struct BufferHandle { + raw: ::Buffer, +} +impl Copy for BufferHandle {} +impl Clone for BufferHandle { + fn clone(&self) -> BufferHandle { *self } +} + +enum Res {} +impl Resources for Res { + type Buffer = u32; +} + +fn main() { + let b: BufferHandle = BufferHandle { raw: 1 }; + let c = b; + assert_eq!(c.raw, b.raw) +} diff --git a/tests/ui/nll/issue-27583.rs b/tests/ui/nll/issue-27583.rs new file mode 100644 index 00000000000..84c94c7c905 --- /dev/null +++ b/tests/ui/nll/issue-27583.rs @@ -0,0 +1,47 @@ +// check-pass +// Regression test for issue #27583. Unclear how useful this will be +// going forward, since the issue in question was EXTREMELY sensitive +// to compiler internals (like the precise numbering of nodes), but +// what the hey. + +#![allow(warnings)] + +use std::cell::Cell; +use std::marker::PhantomData; + +pub trait Delegate<'tcx> { } + +pub struct InferCtxt<'a, 'tcx: 'a> { + x: PhantomData<&'a Cell<&'tcx ()>> +} + +pub struct MemCategorizationContext<'t, 'a: 't, 'tcx : 'a> { + x: &'t InferCtxt<'a, 'tcx>, +} + +pub struct ExprUseVisitor<'d, 't, 'a: 't, 'tcx:'a+'d> { + typer: &'t InferCtxt<'a, 'tcx>, + mc: MemCategorizationContext<'t, 'a, 'tcx>, + delegate: &'d mut (Delegate<'tcx>+'d), +} + +impl<'d,'t,'a,'tcx> ExprUseVisitor<'d,'t,'a,'tcx> { + pub fn new(delegate: &'d mut Delegate<'tcx>, + typer: &'t InferCtxt<'a, 'tcx>) + -> ExprUseVisitor<'d,'t,'a,'tcx> + { + ExprUseVisitor { + typer: typer, + mc: MemCategorizationContext::new(typer), + delegate: delegate, + } + } +} + +impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> { + pub fn new(typer: &'t InferCtxt<'a, 'tcx>) -> MemCategorizationContext<'t, 'a, 'tcx> { + MemCategorizationContext { x: typer } + } +} + +fn main() { } diff --git a/tests/ui/nll/issue-48179.rs b/tests/ui/nll/issue-48179.rs new file mode 100644 index 00000000000..f81203dc412 --- /dev/null +++ b/tests/ui/nll/issue-48179.rs @@ -0,0 +1,38 @@ +// Regression test for #48132. This was failing due to problems around +// the projection caching and dropck type enumeration. + +// check-pass + +pub struct Container { + value: Option, +} + +impl Container { + pub fn new(iter: T) -> Self { + panic!() + } +} + +pub struct Wrapper<'a> { + content: &'a Content, +} + +impl<'a, 'de> Wrapper<'a> { + pub fn new(content: &'a Content) -> Self { + Wrapper { + content: content, + } + } +} + +pub struct Content; + +fn crash_it(content: Content) { + let items = vec![content]; + let map = items.iter().map(|ref o| Wrapper::new(o)); + + let mut map_visitor = Container::new(map); + +} + +fn main() {} diff --git a/tests/ui/nll/issue-75777.rs b/tests/ui/nll/issue-75777.rs new file mode 100644 index 00000000000..a1e438bc617 --- /dev/null +++ b/tests/ui/nll/issue-75777.rs @@ -0,0 +1,15 @@ +// Regression test for #75777. +// Checks that a boxed future can be properly constructed. + +use std::future::{self, Future}; +use std::pin::Pin; + +type BoxFuture<'a, T> = Pin + 'a + Send>>; + +fn inject<'a, Env: 'a, A: 'a + Send>(v: A) -> Box BoxFuture<'a, A>> { + let fut: BoxFuture<'a, A> = Box::pin(future::ready(v)); + Box::new(move |_| fut) + //~^ ERROR: lifetime may not live long enough +} + +fn main() {} diff --git a/tests/ui/nll/issue-75777.stderr b/tests/ui/nll/issue-75777.stderr new file mode 100644 index 00000000000..370cd72fd55 --- /dev/null +++ b/tests/ui/nll/issue-75777.stderr @@ -0,0 +1,11 @@ +error: lifetime may not live long enough + --> $DIR/issue-75777.rs:11:5 + | +LL | fn inject<'a, Env: 'a, A: 'a + Send>(v: A) -> Box BoxFuture<'a, A>> { + | -- lifetime `'a` defined here +LL | let fut: BoxFuture<'a, A> = Box::pin(future::ready(v)); +LL | Box::new(move |_| fut) + | ^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static` + +error: aborting due to previous error + diff --git a/tests/ui/recursion_limit/issue-40003.rs b/tests/ui/recursion_limit/issue-40003.rs new file mode 100644 index 00000000000..5e61361f987 --- /dev/null +++ b/tests/ui/recursion_limit/issue-40003.rs @@ -0,0 +1,178 @@ +// run-pass +#![allow(unused_must_use)] +fn main() { + if false { test(); } +} + +fn test() { + let rx = Err::, u32>(1).into_future(); + + rx.map(|l: Vec| stream::iter(l.into_iter().map(|i| Ok(i)))) + .flatten_stream() + .chunks(50) + .buffer_unordered(5); +} + +use future::{Future, IntoFuture}; +mod future { + use std::result; + + use {stream, Stream}; + + pub trait Future { + type Item; + type Error; + + fn map(self, _: F) -> Map + where F: FnOnce(Self::Item) -> U, + Self: Sized, + { + panic!() + } + + fn flatten_stream(self) -> FlattenStream + where ::Item: stream::Stream, + Self: Sized + { + panic!() + } + } + + pub trait IntoFuture { + type Future: Future; + type Item; + type Error; + fn into_future(self) -> Self::Future; + } + + impl IntoFuture for F { + type Future = F; + type Item = F::Item; + type Error = F::Error; + + fn into_future(self) -> F { + panic!() + } + } + + impl IntoFuture for result::Result { + type Future = FutureResult; + type Item = T; + type Error = E; + + fn into_future(self) -> FutureResult { + panic!() + } + } + + pub struct Map { + _a: (A, F), + } + + impl Future for Map + where A: Future, + F: FnOnce(A::Item) -> U, + { + type Item = U; + type Error = A::Error; + } + + pub struct FlattenStream { + _f: F, + } + + impl Stream for FlattenStream + where F: Future, + ::Item: Stream, + { + type Item = ::Item; + type Error = ::Error; + } + + pub struct FutureResult { + _inner: (T, E), + } + + impl Future for FutureResult { + type Item = T; + type Error = E; + } +} + +mod stream { + use IntoFuture; + + pub trait Stream { + type Item; + type Error; + + fn buffer_unordered(self, amt: usize) -> BufferUnordered + where Self::Item: IntoFuture::Error>, + Self: Sized + { + new(self, amt) + } + + fn chunks(self, _capacity: usize) -> Chunks + where Self: Sized + { + panic!() + } + } + + pub struct IterStream { + _iter: I, + } + + pub fn iter(_: J) -> IterStream + where J: IntoIterator>, + { + panic!() + } + + impl Stream for IterStream + where I: Iterator>, + { + type Item = T; + type Error = E; + } + + pub struct Chunks { + _stream: S + } + + impl Stream for Chunks + where S: Stream + { + type Item = Result::Item>, u32>; + type Error = ::Error; + } + + pub struct BufferUnordered { + _stream: S, + } + + enum Slot { + Next(#[allow(unused_tuple_struct_fields)] usize), + _Data { _a: T }, + } + + fn new(_s: S, _amt: usize) -> BufferUnordered + where S: Stream, + S::Item: IntoFuture::Error>, + { + (0..0).map(|_| { + Slot::Next::<::Future>(1) + }).collect::>(); + panic!() + } + + impl Stream for BufferUnordered + where S: Stream, + S::Item: IntoFuture::Error>, + { + type Item = ::Item; + type Error = ::Error; + } +} +use stream::Stream; diff --git a/tests/ui/typeck/issue-53712.rs b/tests/ui/typeck/issue-53712.rs new file mode 100644 index 00000000000..2353904d79d --- /dev/null +++ b/tests/ui/typeck/issue-53712.rs @@ -0,0 +1,9 @@ +// issue #53712: make the error generated by using tuple indexing on an array more specific + +fn main() { + let arr = [10, 20, 30, 40, 50]; + arr.0; + //~^ ERROR no field `0` on type `[{integer}; 5]` [E0609] + //~| HELP instead of using tuple indexing, use array indexing + //~| SUGGESTION arr[0] +} diff --git a/tests/ui/typeck/issue-53712.stderr b/tests/ui/typeck/issue-53712.stderr new file mode 100644 index 00000000000..db85919afcb --- /dev/null +++ b/tests/ui/typeck/issue-53712.stderr @@ -0,0 +1,11 @@ +error[E0609]: no field `0` on type `[{integer}; 5]` + --> $DIR/issue-53712.rs:5:9 + | +LL | arr.0; + | ----^ + | | + | help: instead of using tuple indexing, use array indexing: `arr[0]` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0609`. diff --git a/tests/ui/typeck/issue-7813.rs b/tests/ui/typeck/issue-7813.rs new file mode 100644 index 00000000000..ce549bde601 --- /dev/null +++ b/tests/ui/typeck/issue-7813.rs @@ -0,0 +1,4 @@ +fn main() { + let v = &[]; //~ ERROR type annotations needed + let it = v.iter(); +} diff --git a/tests/ui/typeck/issue-7813.stderr b/tests/ui/typeck/issue-7813.stderr new file mode 100644 index 00000000000..2a747f679a8 --- /dev/null +++ b/tests/ui/typeck/issue-7813.stderr @@ -0,0 +1,14 @@ +error[E0282]: type annotations needed for `&[_; 0]` + --> $DIR/issue-7813.rs:2:9 + | +LL | let v = &[]; + | ^ --- type must be known at this point + | +help: consider giving `v` an explicit type, where the placeholders `_` are specified + | +LL | let v: &[_; 0] = &[]; + | +++++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0282`. -- cgit 1.4.1-3-g733a5