mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
cleaned up some tests
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
//! Check that `#[reexport_test_harness_main]` correctly reexports the test harness entry point
|
||||
//! and allows it to be called from within the code.
|
||||
|
||||
//@ run-pass
|
||||
//@ compile-flags:--test
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
//@ run-pass
|
||||
// Issue #2040
|
||||
//! Check that taking the address of a stack variable with `&`
|
||||
//! yields a stable and comparable pointer.
|
||||
//!
|
||||
//! Regression test for <https://github.com/rust-lang/rust/issues/2040>.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
pub fn main() {
|
||||
let foo: isize = 1;
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
//! Check that compile errors are formatted in the "short" style
|
||||
//! when `--error-format=short` is used.
|
||||
|
||||
//@ compile-flags: --error-format=short
|
||||
|
||||
fn foo(_: u32) {}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
$DIR/short-error-format.rs:6:9: error[E0308]: mismatched types: expected `u32`, found `String`
|
||||
$DIR/short-error-format.rs:8:7: error[E0599]: no method named `salut` found for type `u32` in the current scope: method not found in `u32`
|
||||
$DIR/error-format-short.rs:9:9: error[E0308]: mismatched types: expected `u32`, found `String`
|
||||
$DIR/error-format-short.rs:11:7: error[E0599]: no method named `salut` found for type `u32` in the current scope: method not found in `u32`
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
//! Check that types not implementing `Copy` are moved, not copied, during assignment
|
||||
//! operations, and their `Drop` implementation is called exactly once when the
|
||||
//! value goes out of scope.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
#![allow(non_camel_case_types)]
|
||||
@@ -15,9 +19,7 @@ fn drop(&mut self) {
|
||||
}
|
||||
|
||||
fn r(i: &Cell<isize>) -> r<'_> {
|
||||
r {
|
||||
i: i
|
||||
}
|
||||
r { i }
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
|
||||
@@ -1,31 +1,37 @@
|
||||
//! Check that the `Drop` implementation is called when a value goes out of scope.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
#![allow(non_camel_case_types)]
|
||||
use std::cell::Cell;
|
||||
|
||||
struct shrinky_pointer<'a> {
|
||||
i: &'a Cell<isize>,
|
||||
i: &'a Cell<isize>,
|
||||
}
|
||||
|
||||
impl<'a> Drop for shrinky_pointer<'a> {
|
||||
fn drop(&mut self) {
|
||||
println!("Hello!"); self.i.set(self.i.get() - 1);
|
||||
println!("Hello!");
|
||||
self.i.set(self.i.get() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> shrinky_pointer<'a> {
|
||||
pub fn look_at(&self) -> isize { return self.i.get(); }
|
||||
pub fn look_at(&self) -> isize {
|
||||
return self.i.get();
|
||||
}
|
||||
}
|
||||
|
||||
fn shrinky_pointer(i: &Cell<isize>) -> shrinky_pointer<'_> {
|
||||
shrinky_pointer {
|
||||
i: i
|
||||
}
|
||||
shrinky_pointer { i }
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let my_total = &Cell::new(10);
|
||||
{ let pt = shrinky_pointer(my_total); assert_eq!(pt.look_at(), 10); }
|
||||
{
|
||||
let pt = shrinky_pointer(my_total);
|
||||
assert_eq!(pt.look_at(), 10);
|
||||
}
|
||||
println!("my_total = {}", my_total.get());
|
||||
assert_eq!(my_total.get(), 9);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
//! Check for compilation errors when a trait is used with an incorrect number of generic arguments.
|
||||
|
||||
fn main() {
|
||||
trait Seq { }
|
||||
trait Seq {}
|
||||
|
||||
impl<T> Seq<T> for Vec<T> {
|
||||
//~^ ERROR trait takes 0 generic arguments but 1 generic argument
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0107]: trait takes 0 generic arguments but 1 generic argument was supplied
|
||||
--> $DIR/seq-args.rs:4:13
|
||||
--> $DIR/trait-incorrect-generic-args.rs:6:13
|
||||
|
|
||||
LL | impl<T> Seq<T> for Vec<T> {
|
||||
| ^^^--- help: remove the unnecessary generics
|
||||
@@ -7,13 +7,13 @@ LL | impl<T> Seq<T> for Vec<T> {
|
||||
| expected 0 generic arguments
|
||||
|
|
||||
note: trait defined here, with 0 generic parameters
|
||||
--> $DIR/seq-args.rs:2:11
|
||||
--> $DIR/trait-incorrect-generic-args.rs:4:11
|
||||
|
|
||||
LL | trait Seq { }
|
||||
LL | trait Seq {}
|
||||
| ^^^
|
||||
|
||||
error[E0107]: trait takes 0 generic arguments but 1 generic argument was supplied
|
||||
--> $DIR/seq-args.rs:9:10
|
||||
--> $DIR/trait-incorrect-generic-args.rs:11:10
|
||||
|
|
||||
LL | impl Seq<bool> for u32 {
|
||||
| ^^^------ help: remove the unnecessary generics
|
||||
@@ -21,9 +21,9 @@ LL | impl Seq<bool> for u32 {
|
||||
| expected 0 generic arguments
|
||||
|
|
||||
note: trait defined here, with 0 generic parameters
|
||||
--> $DIR/seq-args.rs:2:11
|
||||
--> $DIR/trait-incorrect-generic-args.rs:4:11
|
||||
|
|
||||
LL | trait Seq { }
|
||||
LL | trait Seq {}
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
//! Check that writes to standard output are blocking, avoiding interleaving
|
||||
//! even with concurrent writes from multiple threads.
|
||||
|
||||
//@ run-pass
|
||||
//@ needs-subprocess
|
||||
|
||||
use std::env;
|
||||
use std::io::prelude::*;
|
||||
use std::process::Command;
|
||||
use std::thread;
|
||||
use std::{env, thread};
|
||||
|
||||
const THREADS: usize = 20;
|
||||
const WRITES: usize = 100;
|
||||
@@ -33,14 +35,16 @@ fn parent() {
|
||||
}
|
||||
|
||||
fn child() {
|
||||
let threads = (0..THREADS).map(|_| {
|
||||
thread::spawn(|| {
|
||||
let buf = [b'a'; WRITE_SIZE];
|
||||
for _ in 0..WRITES {
|
||||
write_all(&buf);
|
||||
}
|
||||
let threads = (0..THREADS)
|
||||
.map(|_| {
|
||||
thread::spawn(|| {
|
||||
let buf = [b'a'; WRITE_SIZE];
|
||||
for _ in 0..WRITES {
|
||||
write_all(&buf);
|
||||
}
|
||||
})
|
||||
})
|
||||
}).collect::<Vec<_>>();
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
for thread in threads {
|
||||
thread.join().unwrap();
|
||||
@@ -63,8 +67,8 @@ fn write_all(buf: &[u8]) {
|
||||
fn write_all(buf: &[u8]) {
|
||||
use std::fs::File;
|
||||
use std::mem;
|
||||
use std::os::windows::raw::*;
|
||||
use std::os::windows::prelude::*;
|
||||
use std::os::windows::raw::*;
|
||||
|
||||
const STD_OUTPUT_HANDLE: u32 = (-11i32) as u32;
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
//! Check that a primitive type can be shadowed by a user-defined type, and the primitive type
|
||||
//! can still be referenced using its fully qualified path (e.g., `core::primitive::bool`).
|
||||
|
||||
//@ check-pass
|
||||
|
||||
mod bar {
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//! Check that a local `use` declaration can shadow a re-exported item within the same module.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
#![allow(unused_imports)]
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
struct Baz { q: Option<Foo> }
|
||||
//~^ ERROR recursive types `Baz` and `Foo` have infinite size
|
||||
struct Foo { q: Option<Baz> }
|
||||
//! Check for compilation errors when recursive types are defined in a way
|
||||
//! that leads to an infinite size.
|
||||
|
||||
impl Foo { fn bar(&self) {} }
|
||||
struct Baz {
|
||||
//~^ ERROR recursive types `Baz` and `Foo` have infinite size
|
||||
q: Option<Foo>,
|
||||
}
|
||||
struct Foo {
|
||||
q: Option<Baz>,
|
||||
}
|
||||
|
||||
impl Foo {
|
||||
fn bar(&self) {}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
error[E0072]: recursive types `Baz` and `Foo` have infinite size
|
||||
--> $DIR/sized-cycle-note.rs:1:1
|
||||
--> $DIR/recursive-type-infinite-size.rs:4:1
|
||||
|
|
||||
LL | struct Baz { q: Option<Foo> }
|
||||
| ^^^^^^^^^^ --- recursive without indirection
|
||||
LL | struct Baz {
|
||||
| ^^^^^^^^^^
|
||||
LL |
|
||||
LL | struct Foo { q: Option<Baz> }
|
||||
| ^^^^^^^^^^ --- recursive without indirection
|
||||
LL | q: Option<Foo>,
|
||||
| --- recursive without indirection
|
||||
LL | }
|
||||
LL | struct Foo {
|
||||
| ^^^^^^^^^^
|
||||
LL | q: Option<Baz>,
|
||||
| --- recursive without indirection
|
||||
|
|
||||
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to break the cycle
|
||||
|
|
||||
LL ~ struct Baz { q: Option<Box<Foo>> }
|
||||
LL |
|
||||
LL ~ struct Foo { q: Option<Box<Baz>> }
|
||||
LL ~ q: Option<Box<Foo>>,
|
||||
LL | }
|
||||
LL | struct Foo {
|
||||
LL ~ q: Option<Box<Baz>>,
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
//! Check that `Box<T>` is `Sized`, even when `T` is a dynamically sized type.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
#![allow(dead_code)]
|
||||
// Possibly-dynamic size of typaram should be cleared at pointer boundary.
|
||||
|
||||
|
||||
|
||||
fn bar<T: Sized>() { }
|
||||
fn foo<T>() { bar::<Box<T>>() }
|
||||
pub fn main() { }
|
||||
fn bar<T: Sized>() {}
|
||||
fn foo<T>() {
|
||||
bar::<Box<T>>()
|
||||
}
|
||||
pub fn main() {}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
//! Check that a reference to a potentially unsized type (`&T`) is itself considered `Sized`.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
#![allow(dead_code)]
|
||||
// Possibly-dynamic size of typaram should be cleared at pointer boundary.
|
||||
|
||||
|
||||
fn bar<T: Sized>() { }
|
||||
fn foo<T>() { bar::<&T>() }
|
||||
pub fn main() { }
|
||||
fn bar<T: Sized>() {}
|
||||
fn foo<T>() {
|
||||
bar::<&T>()
|
||||
}
|
||||
pub fn main() {}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
// Issue #8380
|
||||
//! Check that atomic types from `std::sync::atomic` are not `Copy`
|
||||
//! and cannot be moved out of a shared reference.
|
||||
//!
|
||||
//! Regression test for <https://github.com/rust-lang/rust/issues/8380>.
|
||||
|
||||
|
||||
use std::sync::atomic::*;
|
||||
use std::ptr;
|
||||
use std::sync::atomic::*;
|
||||
|
||||
fn main() {
|
||||
let x = AtomicBool::new(false);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
error[E0507]: cannot move out of a shared reference
|
||||
--> $DIR/std-uncopyable-atomics.rs:9:13
|
||||
--> $DIR/atomic-types-not-copyable.rs:11:13
|
||||
|
|
||||
LL | let x = *&x;
|
||||
| ^^^ move occurs because value has type `std::sync::atomic::AtomicBool`, which does not implement the `Copy` trait
|
||||
@@ -11,7 +11,7 @@ LL + let x = &x;
|
||||
|
|
||||
|
||||
error[E0507]: cannot move out of a shared reference
|
||||
--> $DIR/std-uncopyable-atomics.rs:11:13
|
||||
--> $DIR/atomic-types-not-copyable.rs:13:13
|
||||
|
|
||||
LL | let x = *&x;
|
||||
| ^^^ move occurs because value has type `std::sync::atomic::AtomicIsize`, which does not implement the `Copy` trait
|
||||
@@ -23,7 +23,7 @@ LL + let x = &x;
|
||||
|
|
||||
|
||||
error[E0507]: cannot move out of a shared reference
|
||||
--> $DIR/std-uncopyable-atomics.rs:13:13
|
||||
--> $DIR/atomic-types-not-copyable.rs:15:13
|
||||
|
|
||||
LL | let x = *&x;
|
||||
| ^^^ move occurs because value has type `std::sync::atomic::AtomicUsize`, which does not implement the `Copy` trait
|
||||
@@ -35,7 +35,7 @@ LL + let x = &x;
|
||||
|
|
||||
|
||||
error[E0507]: cannot move out of a shared reference
|
||||
--> $DIR/std-uncopyable-atomics.rs:15:13
|
||||
--> $DIR/atomic-types-not-copyable.rs:17:13
|
||||
|
|
||||
LL | let x = *&x;
|
||||
| ^^^ move occurs because value has type `std::sync::atomic::AtomicPtr<usize>`, which does not implement the `Copy` trait
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
//! Check that `cfg!(target_feature = "...")` correctly detects available CPU features,
|
||||
//! specifically `sse2` on x86/x86_64 platforms, and correctly reports absent features.
|
||||
|
||||
//@ run-pass
|
||||
|
||||
#![allow(stable_features)]
|
||||
@@ -10,17 +13,23 @@ fn main() {
|
||||
Ok(s) => {
|
||||
// Skip this tests on i586-unknown-linux-gnu where sse2 is disabled
|
||||
if s.contains("i586") {
|
||||
return
|
||||
return;
|
||||
}
|
||||
}
|
||||
Err(_) => return,
|
||||
}
|
||||
if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
|
||||
assert!(cfg!(target_feature = "sse2"),
|
||||
"SSE2 was not detected as available on an x86 platform");
|
||||
assert!(
|
||||
cfg!(target_feature = "sse2"),
|
||||
"SSE2 was not detected as available on an x86 platform"
|
||||
);
|
||||
}
|
||||
// check a negative case too -- certainly not enabled by default
|
||||
#[expect(unexpected_cfgs)]
|
||||
{ assert!(cfg!(not(target_feature = "ferris_wheel")),
|
||||
"🎡 shouldn't be detected as available by default on any platform") };
|
||||
{
|
||||
assert!(
|
||||
cfg!(not(target_feature = "ferris_wheel")),
|
||||
"🎡 shouldn't be detected as available by default on any platform"
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
//! Check that `String` and `&str` can be converted into `Box<dyn Error>` and
|
||||
//! `Box<dyn Error + Send + Sync>` trait objects
|
||||
|
||||
//@ run-pass
|
||||
// Ensure that both `Box<dyn Error + Send + Sync>` and `Box<dyn Error>` can be
|
||||
// obtained from `String`.
|
||||
|
||||
use std::error::Error;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user