makepad/libs/relax/compiler/tests/conform_crash.rs
Admin b22a714840 makepad run: the Rust JIT (libs/relax) and makepad-remote
The JIT that runs makepad apps from source: lexer, front end, type checker,
lazy borrow checker (Gandalf; `--check-first` opts in), codegen, session and
warm/cold caches keyed by compiler stamp, provided crates bound late,
startup images, live patching. User-facing name is `makepad run` (binary
`makepad`, MAKEPAD_RUN_* env, ~/.makepad-run); libs/relax stays the internal
library name. `makepad check` reports rustc-style diagnostics with rustc
error codes and checks a whole workspace (`--workspace`). Runs on macOS,
Linux, Windows and Android. makepad-remote: one tool schema for apps and the
WM (app/1): grabs, captures, traces, frame profiles and tweaks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 12:26:21 +02:00

98 lines
3.6 KiB
Rust

// rustc tests/ui CRASH groups (frontend): reduced repros, each named after its suite file
use std::cell::Cell;
use std::rc::Rc;
// binding/match-ref-unsized: `let ref a = *"abc"` borrows the place (let's initializer is a
// place expression context)
#[test]
fn ref_binding_of_unsized_place() {
let ref a = *"abcdef";
assert_eq!(a, "abcdef");
let s: &str = "xy";
let ref d = *s;
assert_eq!(d.len(), 2);
}
// unsized-locals/box-fnonce: `&s as &str` is a coercion cast (deref coercion)
#[test]
fn coercion_cast_deref() {
fn call_it<T>(f: Box<dyn FnOnce() -> T>) -> T { f() }
let s = "hello".to_owned();
assert_eq!(&call_it(Box::new(|| s)) as &str, "hello");
let t = String::from("ab");
assert_eq!((&t as &str).len(), 2);
}
// macros/assert-ne-macro-unsized: `*l != *r` on slices is PartialEq; `&vec![..][..]` extends
// the Vec temporary (lifetime extension through the indexed operand)
#[test]
fn unsized_compare_and_index_extension() {
let l: &[i32] = &[6, 6, 6];
let r: &[i32] = &[1, 2, 3];
assert!(*l != *r);
assert!(!(*l == *r));
let y = &vec![1, 2, 3][..];
assert_eq!(y, &[1, 2, 3]);
assert_ne!([6, 6, 6][..], vec![1, 2, 3][..]);
assert!(*"ab" == *"ab");
}
// consts/control-flow/short-circuit-let: a diverging `&&` / `||` operand
#[test]
fn lazy_op_diverging_operand() {
fn truthy() -> bool { let x = true || return false; x }
fn falsy() -> bool { let x = true && return false; x }
assert!(truthy() && !falsy());
}
// deref/dereferenceable-type-behavior-22992: `*x` on a Deref type in a value context, and
// the probe's by-value step on `&&X` / autoref step on `&&A`
#[test]
fn explicit_deref_and_probe_steps() {
struct X { val: i32 }
impl std::ops::Deref for X { type Target = i32; fn deref(&self) -> &i32 { &self.val } }
trait M { fn m(self) -> u32; }
impl M for i32 { fn m(self) -> u32 { 1 } }
impl M for X { fn m(self) -> u32 { 2 } }
impl<'a> M for &'a X { fn m(self) -> u32 { 3 } }
trait RefM { fn refm(&self) -> u32; }
impl RefM for X { fn refm(&self) -> u32 { 10 } }
impl<'a> RefM for &'a X { fn refm(&self) -> u32 { 11 } }
impl<'a, 'b> RefM for &'a &'b X { fn refm(&self) -> u32 { 12 } }
#[derive(Clone, Copy)]
struct A;
impl M for A { fn m(self) -> u32 { 20 } }
impl<'a, 'b, 'c> M for &'a &'b &'c A { fn m(self) -> u32 { 21 } }
assert_eq!((*X { val: 42 }).m(), 1);
let x = X { val: 7 };
assert_eq!(*x + 1, 8);
assert_eq!((&X { val: 1 }).m(), 3);
assert_eq!((&&X { val: 1 }).refm(), 11);
assert_eq!((&&&X { val: 1 }).refm(), 12);
assert_eq!((&A).m(), 20);
assert_eq!((&&A).m(), 21);
}
// moves/match-move-same-binding-15571, closures/2229 move_closure: a derived Copy needs its
// type params Copy (Option<Box<T>> is not Copy), pattern moves and nested move closures
// consume captures, closures called through `&mut` live in memory
#[test]
fn closure_captures_by_value() {
let c = Rc::new(Cell::new(0));
struct D(Rc<Cell<u32>>);
impl Drop for D { fn drop(&mut self) { self.0.set(self.0.get() + 1) } }
let foo: Option<Box<D>> = Some(Box::new(D(c.clone())));
let f = move || { match foo { None => {}, Some(x) => drop(x) } };
f();
assert_eq!(c.get(), 1);
let mut s = (String::from("s"), 1u8);
let mut g = move || { s.0 = "x".into(); s.0.len() };
assert_eq!(g(), 1);
assert_eq!(g(), 1);
let mut t = (String::from("a"), 0u8);
let outer = || { let mut inner = move || { t.0.push('b'); t.0.len() }; inner() };
assert_eq!(outer(), 2);
let o: Option<Box<u8>> = Some(Box::new(3));
let h = move || o;
assert_eq!(*h().unwrap(), 3);
}