mirror of https://github.com/rust-lang/rust.git
156 lines
4.9 KiB
Rust
156 lines
4.9 KiB
Rust
//@ only-cdb
|
|
//@ compile-flags:-g
|
|
|
|
// === CDB TESTS ===================================================================================
|
|
// Generic functions cause ambigious breakpoints.
|
|
// cdb-command:dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints = true;
|
|
// cdb-command:bp `closures.rs:57`
|
|
// cdb-command:g
|
|
// cdb-command:dx add_closure
|
|
// cdb-check:add_closure [Type: closures::main::closure_env$0]
|
|
// cdb-check: [+0x[...]] _ref__base_value : 0x[...] : 42 [Type: int *]
|
|
// cdb-command:dx increment
|
|
// cdb-check:increment [Type: closures::main::closure_env$1]
|
|
// cdb-check: [+0x[...]] _ref__count : 0x[...] : 2 [Type: int *]
|
|
// cdb-command:dx consume_closure
|
|
// cdb-check:consume_closure [Type: closures::main::closure_env$2]
|
|
// cdb-check: [+0x[...]] x : [...] [Type: alloc::string::String]
|
|
// cdb-check: [+0x[...]] _ref__base_value : 0x[...] : 42 [Type: int *]
|
|
// cdb-command:dx simple_closure
|
|
// cdb-checksimple_closure [Type: closures::main::closure_env$5]
|
|
// cdb-check: [+0x[...]] _ref__base_value : 0x[...] : 42 [Type: int *]
|
|
// cdb-command:g
|
|
// cdb-command:dx first_closure
|
|
// cdb-check:first_closure [Type: closures::main::closure_env$6]
|
|
// cdb-check: [+0x[...]] _ref__variable : 0x[...] : 1 [Type: int *]
|
|
// cdb-check: [+0x[...]] _ref__constant : 0x[...] : 2 [Type: int *]
|
|
// cdb-check: [+0x[...]] _ref__a_struct : 0x[...] [Type: closures::Struct *]
|
|
// cdb-check: [+0x[...]] _ref__struct_ref : 0x[...] [Type: closures::Struct * *]
|
|
// cdb-check: [+0x[...]] _ref__owned_value : 0x[...] [Type: int * *]
|
|
// cdb-command:g
|
|
// cdb-command:dx many_param_closure
|
|
// cdb-check:many_param_closure [Type: closures::main::closure_env$7]
|
|
// cdb-check: [+0x[...]] _ref__base_value : 0x[...] : 42 [Type: int *]
|
|
// cdb-command:g
|
|
// cdb-command:dv
|
|
// cdb-command:dx generic_closure
|
|
// cdb-check:generic_closure [Type: closures::generic_func::closure_env$0<i32>]
|
|
// cdb-check: [+0x[...]] _ref__x : 0x[...] : 42 [Type: int *]
|
|
// cdb-command:g
|
|
// cdb-command:dx generic_closure
|
|
// cdb-check:generic_closure [Type: closures::generic_func::closure_env$0<ref$<str$> >]
|
|
// cdb-check: [+0x000] _ref__x : 0x[...] : "base_value" [Type: ref$<str$> *]
|
|
// cdb-command:g
|
|
// cdb-command:dx second_closure
|
|
// cdb-check:second_closure [Type: closures::main::closure_env$8]
|
|
// cdb-check: [+0x[...]] _ref__variable : 0x[...] : 2 [Type: int *]
|
|
// cdb-check: [+0x[...]] _ref__constant : 0x[...] : 2 [Type: int *]
|
|
// cdb-check: [+0x[...]] _ref__a_struct : 0x[...] [Type: closures::Struct *]
|
|
// cdb-check: [+0x[...]] _ref__struct_ref : 0x[...] [Type: closures::Struct * *]
|
|
// cdb-check: [+0x[...]] _ref__owned_value : 0x[...] [Type: int * *]
|
|
|
|
#[inline(never)]
|
|
fn generic_func<Tfunc: std::fmt::Debug>(x: Tfunc) {
|
|
let generic_closure = |a: i32| {
|
|
println!("{:?} {}", x, a);
|
|
};
|
|
|
|
_zzz(); // #break
|
|
|
|
// rustc really wants to inline this closure, so we use black_box instead of calling it
|
|
std::hint::black_box(generic_closure);
|
|
}
|
|
|
|
struct Struct {
|
|
a: isize,
|
|
b: f64,
|
|
c: usize,
|
|
}
|
|
|
|
fn main() {
|
|
let base_value: i32 = 42;
|
|
let mut count: i32 = 0;
|
|
|
|
let add_closure = |a: i32, b: i32| a + b + base_value;
|
|
|
|
add_closure(40, 2);
|
|
|
|
let mut increment = || {
|
|
count += 1;
|
|
};
|
|
|
|
increment(); // count: 1
|
|
increment(); // count: 2
|
|
|
|
let x = String::from("hello");
|
|
|
|
// Define a closure that consumes the captured variable `x`
|
|
let consume_closure = move || {
|
|
drop(x);
|
|
base_value + 1
|
|
};
|
|
|
|
consume_closure();
|
|
|
|
let paramless_closure = || 42_i32;
|
|
|
|
let void_closure = |a: i32| {
|
|
println!("Closure with arg: {:?}", a);
|
|
};
|
|
|
|
let simple_closure = || {
|
|
let incremented_value = base_value + 1;
|
|
incremented_value
|
|
};
|
|
|
|
let result = /*42; */ add_closure(40, 2);
|
|
println!("Result: {:?}", result);
|
|
void_closure(result);
|
|
let result = simple_closure();
|
|
println!("Result: {:?}", result);
|
|
|
|
let mut variable: i32 = 1;
|
|
let constant: i32 = 2;
|
|
|
|
let a_struct = Struct { a: -3, b: 4.5, c: 5 };
|
|
|
|
_zzz(); // #break
|
|
|
|
let struct_ref = &a_struct;
|
|
let owned_value: Box<i32> = Box::new(6);
|
|
|
|
{
|
|
let mut first_closure = || {
|
|
variable = constant + a_struct.a as i32 + struct_ref.a as i32 + *owned_value;
|
|
};
|
|
|
|
_zzz(); // #break
|
|
|
|
first_closure();
|
|
}
|
|
|
|
let many_param_closure =
|
|
|a: i32, b: f64, c: usize, d: Struct| base_value + a + b as i32 + c as i32 + d.c as i32;
|
|
|
|
_zzz(); // #break
|
|
|
|
many_param_closure(1, 2.0, 3, Struct { a: 4, b: 5.0, c: 6 });
|
|
|
|
generic_func(42);
|
|
generic_func("base_value");
|
|
|
|
{
|
|
let mut second_closure = || {
|
|
variable = constant + a_struct.a as i32 + struct_ref.a as i32 + *owned_value;
|
|
};
|
|
|
|
_zzz(); // #break
|
|
|
|
second_closure();
|
|
}
|
|
}
|
|
|
|
fn _zzz() {
|
|
()
|
|
}
|