Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
cleaned up some tests
  • Loading branch information
Kivooeo committed Jun 30, 2025
commit bf5910d9bb0c5cc3e4fb1a1a9ed3d73e26793c71
33 changes: 27 additions & 6 deletions tests/ui/closures/basic-closure-syntax.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,35 @@
//@ run-pass
// Tests for the new |args| expr lambda syntax
//! Test basic closure syntax and usage with generic functions.
//!
//! This test checks that closure syntax works correctly for:
//! - Closures with parameters and return values
//! - Closures without parameters (both expression and block forms)
//! - Integration with generic functions and FnOnce trait bounds

//@ run-pass

fn f<F>(i: isize, f: F) -> isize where F: FnOnce(isize) -> isize { f(i) }
fn f<F>(i: isize, f: F) -> isize
where
F: FnOnce(isize) -> isize,
{
f(i)
}

fn g<G>(_g: G) where G: FnOnce() { }
fn g<G>(_g: G)
where
G: FnOnce(),
{
}

pub fn main() {
// Closure with parameter that returns the same value
assert_eq!(f(10, |a| a), 10);
g(||());

// Closure without parameters - expression form
g(|| ());

// Test closure reuse in generic context
assert_eq!(f(10, |a| a), 10);
g(||{});

// Closure without parameters - block form
g(|| {});
}
39 changes: 22 additions & 17 deletions tests/ui/generics/newtype-with-generics.rs
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
//@ run-pass

#![allow(non_camel_case_types)]
//! Test newtype pattern with generic parameters.
//@ run-pass

#[derive(Clone)]
struct myvec<X>(Vec<X> );
struct MyVec<T>(Vec<T>);

fn myvec_deref<X:Clone>(mv: myvec<X>) -> Vec<X> {
let myvec(v) = mv;
return v.clone();
fn extract_inner_vec<T: Clone>(wrapper: MyVec<T>) -> Vec<T> {
let MyVec(inner_vec) = wrapper;
inner_vec.clone()
}

fn myvec_elt<X>(mv: myvec<X>) -> X {
let myvec(v) = mv;
return v.into_iter().next().unwrap();
fn get_first_element<T>(wrapper: MyVec<T>) -> T {
let MyVec(inner_vec) = wrapper;
inner_vec.into_iter().next().unwrap()
}

pub fn main() {
let mv = myvec(vec![1, 2, 3]);
let mv_clone = mv.clone();
let mv_clone = myvec_deref(mv_clone);
assert_eq!(mv_clone[1], 2);
assert_eq!(myvec_elt(mv.clone()), 1);
let myvec(v) = mv;
assert_eq!(v[2], 3);
let my_vec = MyVec(vec![1, 2, 3]);
let cloned_vec = my_vec.clone();

// Test extracting inner vector
let extracted = extract_inner_vec(cloned_vec);
assert_eq!(extracted[1], 2);

// Test getting first element
assert_eq!(get_first_element(my_vec.clone()), 1);

// Test direct destructuring
let MyVec(inner) = my_vec;
assert_eq!(inner[2], 3);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mind keeping the original var names here? They're understandable enough so IMO not worth any churn.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

honestly, they might be undestandable, but we can do better, right?

myvec_elt for me is not understanable and fused spelling is not good here like myvec, just adding _ make it way better my_vec

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function names indeed aren't a very clear and those changes seemed fine. I was talking specifically about variable names; mv->my_vec and mv_clone->cloned_vec doesn't really make anything more clear, so in these cases I'd lean toward preferring the existing code to keep churn down.

All the same, 🤷‍♂️

}
8 changes: 5 additions & 3 deletions tests/ui/impl-trait/basic-trait-impl.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
//! Test basic trait implementation syntax for both simple and generic types.

//@ run-pass

use std::fmt;

struct Thingy {
x: isize,
y: isize
y: isize,
}

impl fmt::Debug for Thingy {
Expand All @@ -14,10 +16,10 @@ impl fmt::Debug for Thingy {
}

struct PolymorphicThingy<T> {
x: T
x: T,
}

impl<T:fmt::Debug> fmt::Debug for PolymorphicThingy<T> {
impl<T: fmt::Debug> fmt::Debug for PolymorphicThingy<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{:?}", self.x)
}
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/parser/unicode-escape-sequences.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
//! Test ES6-style Unicode escape sequences in string literals.
//!
//! Regression test for RFC 446 implementation.
//! See <https://github.com/rust-lang/rust/pull/19480>.

//@ run-pass

pub fn main() {
// Basic Unicode escape - snowman character
let s = "\u{2603}";
assert_eq!(s, "☃");

Expand Down
24 changes: 13 additions & 11 deletions tests/ui/structs/basic-newtype-pattern.rs
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
//! Test basic newtype pattern functionality.

//@ run-pass

#![allow(non_camel_case_types)]
#[derive(Copy, Clone)]
struct mytype(Mytype);
struct Counter(CounterData);

#[derive(Copy, Clone)]
struct Mytype {
compute: fn(mytype) -> isize,
struct CounterData {
compute: fn(Counter) -> isize,
val: isize,
}

fn compute(i: mytype) -> isize {
let mytype(m) = i;
return m.val + 20;
fn compute_value(counter: Counter) -> isize {
let Counter(data) = counter;
data.val + 20
}

pub fn main() {
let myval = mytype(Mytype{compute: compute, val: 30});
println!("{}", compute(myval));
let mytype(m) = myval;
assert_eq!((m.compute)(myval), 50);
let my_counter = Counter(CounterData { compute: compute_value, val: 30 });

// Test destructuring and function pointer call
let Counter(data) = my_counter;
assert_eq!((data.compute)(my_counter), 50);
}
14 changes: 9 additions & 5 deletions tests/ui/traits/enum-negative-send-impl.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
//! Test that enums inherit Send/!Send properties from their variants.
//!
//! Uses the unstable `negative_impls` feature to explicitly opt-out of Send.

#![feature(negative_impls)]

use std::marker::Send;

struct NoSend;
impl !Send for NoSend {}

enum Foo {
A(NoSend)
enum Container {
WithNoSend(NoSend),
}

fn bar<T: Send>(_: T) {}
fn requires_send<T: Send>(_: T) {}

fn main() {
let x = Foo::A(NoSend);
bar(x);
let container = Container::WithNoSend(NoSend);
requires_send(container);
//~^ ERROR `NoSend` cannot be sent between threads safely
}
24 changes: 12 additions & 12 deletions tests/ui/traits/enum-negative-send-impl.stderr
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
error[E0277]: `NoSend` cannot be sent between threads safely
--> $DIR/no_send-enum.rs:16:9
--> $DIR/enum-negative-send-impl.rs:20:19
|
LL | bar(x);
| --- ^ `NoSend` cannot be sent between threads safely
LL | requires_send(container);
| ------------- ^^^^^^^^^ `NoSend` cannot be sent between threads safely
| |
| required by a bound introduced by this call
|
= help: within `Foo`, the trait `Send` is not implemented for `NoSend`
note: required because it appears within the type `Foo`
--> $DIR/no_send-enum.rs:8:6
= help: within `Container`, the trait `Send` is not implemented for `NoSend`
note: required because it appears within the type `Container`
--> $DIR/enum-negative-send-impl.rs:12:6
|
LL | enum Foo {
| ^^^
note: required by a bound in `bar`
--> $DIR/no_send-enum.rs:12:11
LL | enum Container {
| ^^^^^^^^^
note: required by a bound in `requires_send`
--> $DIR/enum-negative-send-impl.rs:16:21
|
LL | fn bar<T: Send>(_: T) {}
| ^^^^ required by this bound in `bar`
LL | fn requires_send<T: Send>(_: T) {}
| ^^^^ required by this bound in `requires_send`

error: aborting due to 1 previous error

Expand Down
14 changes: 10 additions & 4 deletions tests/ui/traits/enum-negative-sync-impl.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
//! Test that enums inherit Sync/!Sync properties from their variants.
//!
//! Uses the unstable `negative_impls` feature to explicitly opt-out of Sync.

#![feature(negative_impls)]

use std::marker::Sync;

struct NoSync;
impl !Sync for NoSync {}

enum Foo { A(NoSync) }
enum Container {
WithNoSync(NoSync),
}

fn bar<T: Sync>(_: T) {}
fn requires_sync<T: Sync>(_: T) {}

fn main() {
let x = Foo::A(NoSync);
bar(x);
let container = Container::WithNoSync(NoSync);
requires_sync(container);
//~^ ERROR `NoSync` cannot be shared between threads safely [E0277]
}
24 changes: 12 additions & 12 deletions tests/ui/traits/enum-negative-sync-impl.stderr
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
error[E0277]: `NoSync` cannot be shared between threads safely
--> $DIR/no_share-enum.rs:14:9
--> $DIR/enum-negative-sync-impl.rs:20:19
|
LL | bar(x);
| --- ^ `NoSync` cannot be shared between threads safely
LL | requires_sync(container);
| ------------- ^^^^^^^^^ `NoSync` cannot be shared between threads safely
| |
| required by a bound introduced by this call
|
= help: within `Foo`, the trait `Sync` is not implemented for `NoSync`
note: required because it appears within the type `Foo`
--> $DIR/no_share-enum.rs:8:6
= help: within `Container`, the trait `Sync` is not implemented for `NoSync`
note: required because it appears within the type `Container`
--> $DIR/enum-negative-sync-impl.rs:12:6
|
LL | enum Foo { A(NoSync) }
| ^^^
note: required by a bound in `bar`
--> $DIR/no_share-enum.rs:10:11
LL | enum Container {
| ^^^^^^^^^
note: required by a bound in `requires_sync`
--> $DIR/enum-negative-sync-impl.rs:16:21
|
LL | fn bar<T: Sync>(_: T) {}
| ^^^^ required by this bound in `bar`
LL | fn requires_sync<T: Sync>(_: T) {}
| ^^^^ required by this bound in `requires_sync`

error: aborting due to 1 previous error

Expand Down
8 changes: 5 additions & 3 deletions tests/ui/traits/rc-not-send.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
//! Test that `Rc<T>` does not implement `Send`.

use std::rc::Rc;

fn bar<T: Send>(_: T) {}
fn requires_send<T: Send>(_: T) {}

fn main() {
let x = Rc::new(5);
bar(x);
let rc_value = Rc::new(5);
requires_send(rc_value);
//~^ ERROR `Rc<{integer}>` cannot be sent between threads safely
}
18 changes: 9 additions & 9 deletions tests/ui/traits/rc-not-send.stderr
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
error[E0277]: `Rc<{integer}>` cannot be sent between threads safely
--> $DIR/no_send-rc.rs:7:9
--> $DIR/rc-not-send.rs:9:19
|
LL | bar(x);
| --- ^ `Rc<{integer}>` cannot be sent between threads safely
LL | requires_send(rc_value);
| ------------- ^^^^^^^^ `Rc<{integer}>` cannot be sent between threads safely
| |
| required by a bound introduced by this call
|
= help: the trait `Send` is not implemented for `Rc<{integer}>`
note: required by a bound in `bar`
--> $DIR/no_send-rc.rs:3:11
note: required by a bound in `requires_send`
--> $DIR/rc-not-send.rs:5:21
|
LL | fn bar<T: Send>(_: T) {}
| ^^^^ required by this bound in `bar`
LL | fn requires_send<T: Send>(_: T) {}
| ^^^^ required by this bound in `requires_send`
help: consider dereferencing here
|
LL | bar(*x);
| +
LL | requires_send(*rc_value);
| +

error: aborting due to 1 previous error

Expand Down
19 changes: 13 additions & 6 deletions tests/ui/traits/struct-negative-sync-impl.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
//! Test negative Sync implementation on structs.
//!
//! Uses the unstable `negative_impls` feature to explicitly opt-out of Sync.

#![feature(negative_impls)]

use std::marker::Sync;

struct Foo { a: isize }
impl !Sync for Foo {}
struct NotSync {
value: isize,
}

impl !Sync for NotSync {}

fn bar<T: Sync>(_: T) {}
fn requires_sync<T: Sync>(_: T) {}

fn main() {
let x = Foo { a: 5 };
bar(x);
//~^ ERROR `Foo` cannot be shared between threads safely [E0277]
let not_sync = NotSync { value: 5 };
requires_sync(not_sync);
//~^ ERROR `NotSync` cannot be shared between threads safely [E0277]
}
18 changes: 9 additions & 9 deletions tests/ui/traits/struct-negative-sync-impl.stderr
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
error[E0277]: `Foo` cannot be shared between threads safely
--> $DIR/no_share-struct.rs:12:9
error[E0277]: `NotSync` cannot be shared between threads safely
--> $DIR/struct-negative-sync-impl.rs:19:19
|
LL | bar(x);
| --- ^ `Foo` cannot be shared between threads safely
LL | requires_sync(not_sync);
| ------------- ^^^^^^^^ `NotSync` cannot be shared between threads safely
| |
| required by a bound introduced by this call
|
= help: the trait `Sync` is not implemented for `Foo`
note: required by a bound in `bar`
--> $DIR/no_share-struct.rs:8:11
= help: the trait `Sync` is not implemented for `NotSync`
note: required by a bound in `requires_sync`
--> $DIR/struct-negative-sync-impl.rs:15:21
|
LL | fn bar<T: Sync>(_: T) {}
| ^^^^ required by this bound in `bar`
LL | fn requires_sync<T: Sync>(_: T) {}
| ^^^^ required by this bound in `requires_sync`

error: aborting due to 1 previous error

Expand Down
Loading