| // Function names are formatted differently in old versions of GDB |
| //@ min-gdb-version: 10.1 |
| |
| //@ compile-flags:-g |
| |
| // === GDB TESTS =================================================================================== |
| |
| // Top-level function |
| // gdb-command:info functions -q function_names::main |
| // gdb-check:[...]static fn function_names::main(); |
| // gdb-command:info functions -q function_names::generic_func<* |
| // gdb-check:[...]static fn function_names::generic_func<i32>(i32) -> i32; |
| |
| // Implementations |
| // gdb-command:info functions -q function_names::.*::impl_function.* |
| // gdb-check:[...]static fn function_names::GenericStruct<i32, i32>::impl_function<i32, i32>(); |
| // gdb-check:[...]static fn function_names::Mod1::TestStruct2::impl_function(); |
| // gdb-check:[...]static fn function_names::TestStruct1::impl_function(); |
| |
| // Trait implementations |
| // gdb-command:info functions -q function_names::.*::trait_function.* |
| // gdb-check:[...]static fn function_names::Mod1::{impl#1}::trait_function(); |
| // gdb-check:[...]static fn function_names::{impl#1}::trait_function(); |
| // gdb-check:[...]static fn function_names::{impl#3}::trait_function<i32>(); |
| // gdb-check:[...]static fn function_names::{impl#5}::trait_function3<function_names::TestStruct1>(); |
| // gdb-check:[...]static fn function_names::{impl#6}::trait_function<i32, 1>(); |
| |
| // Closure |
| // gdb-command:info functions -q function_names::.*::{closure.* |
| // gdb-check:[...]static fn function_names::generic_func::{closure#0}<i32>(*mut function_names::generic_func::{closure_env#0}<i32>); |
| // gdb-check:[...]static fn function_names::main::{closure#0}(*mut function_names::main::{closure_env#0}); |
| // gdb-check:[...]static fn function_names::{impl#2}::impl_function::{closure#0}<i32, i32>(*mut function_names::{impl#2}::impl_function::{closure_env#0}<i32, i32>); |
| |
| // Coroutine |
| // Coroutines don't seem to appear in GDB's symbol table. |
| |
| // Const generic parameter |
| // gdb-command:info functions -q function_names::const_generic_fn.* |
| // gdb-check:[...]static fn function_names::const_generic_fn_bool<false>(); |
| // gdb-check:[...]static fn function_names::const_generic_fn_non_int<{CONST#a70c39591cb5f53d}>(); |
| // gdb-check:[...]static fn function_names::const_generic_fn_signed_int<-7>(); |
| // gdb-check:[...]static fn function_names::const_generic_fn_unsigned_int<14>(); |
| |
| // === CDB TESTS =================================================================================== |
| |
| // Top-level function |
| // cdb-command:x a!function_names::main |
| // cdb-check:[...] a!function_names::main (void) |
| // cdb-command:x a!function_names::generic_func<* |
| // cdb-check:[...] a!function_names::generic_func<i32> (int) |
| |
| // Implementations |
| // cdb-command:x a!function_names::*::impl_function* |
| // cdb-check:[...] a!function_names::Mod1::TestStruct2::impl_function (void) |
| // cdb-check:[...] a!function_names::TestStruct1::impl_function (void) |
| // cdb-check:[...] a!function_names::GenericStruct<i32,i32>::impl_function<i32,i32> (void) |
| |
| // Trait implementations |
| // cdb-command:x a!function_names::*::trait_function* |
| // cdb-check:[...] a!function_names::impl$3::trait_function<i32> (void) |
| // cdb-check:[...] a!function_names::impl$6::trait_function<i32,1> (void) |
| // cdb-check:[...] a!function_names::impl$1::trait_function (void) |
| // cdb-check:[...] a!function_names::impl$5::trait_function3<function_names::TestStruct1> (void) |
| // cdb-check:[...] a!function_names::Mod1::impl$1::trait_function (void) |
| |
| // Closure |
| // cdb-command:x a!function_names::*::closure* |
| // cdb-check:[...] a!function_names::impl$2::impl_function::closure$0<i32,i32> (void) |
| // cdb-check:[...] a!function_names::main::closure$0 (void) |
| // cdb-check:[...] a!function_names::generic_func::closure$0<i32> (void) |
| |
| // Coroutine |
| // cdb-command:x a!function_names::*::coroutine* |
| // cdb-check:[...] a!function_names::main::coroutine$1 (void) |
| |
| // Const generic parameter |
| // cdb-command:x a!function_names::const_generic_fn* |
| // cdb-check:[...] a!function_names::const_generic_fn_bool<false> (void) |
| |
| #![allow(unused_variables)] |
| #![feature(omit_gdb_pretty_printer_section)] |
| #![omit_gdb_pretty_printer_section] |
| #![feature(adt_const_params, coroutines, coroutine_trait, stmt_expr_attributes)] |
| #![allow(incomplete_features)] |
| |
| use std::ops::Coroutine; |
| use std::pin::Pin; |
| use Mod1::TestTrait2; |
| |
| fn main() { |
| // Implementations |
| TestStruct1::impl_function(); |
| Mod1::TestStruct2::impl_function(); |
| GenericStruct::<i32, i32>::impl_function(); |
| |
| // Trait implementations |
| TestStruct1::trait_function(); |
| Mod1::TestStruct2::trait_function(); |
| GenericStruct::<i32, i32>::trait_function(); |
| GenericStruct::<[i32; 1], f32>::trait_function(); |
| GenericStruct::<TestStruct1, usize>::trait_function3(); |
| |
| // Generic function |
| let _ = generic_func(42i32); |
| |
| // Closure |
| let closure = || TestStruct1; |
| closure(); |
| |
| // Coroutine |
| let mut coroutine = #[coroutine] |
| || { |
| yield; |
| return; |
| }; |
| Pin::new(&mut coroutine).resume(()); |
| |
| // Const generic functions |
| const_generic_fn_bool::<false>(); |
| const_generic_fn_non_int::<{ () }>(); |
| const_generic_fn_signed_int::<-7>(); |
| const_generic_fn_unsigned_int::<14>(); |
| } |
| |
| struct TestStruct1; |
| trait TestTrait1 { |
| fn trait_function(); |
| } |
| |
| // Implementation |
| impl TestStruct1 { |
| pub fn impl_function() {} |
| } |
| |
| // Implementation for a trait |
| impl TestTrait1 for TestStruct1 { |
| fn trait_function() {} |
| } |
| |
| // Implementation and implementation within a mod |
| mod Mod1 { |
| pub struct TestStruct2; |
| pub trait TestTrait2 { |
| fn trait_function(); |
| } |
| |
| impl TestStruct2 { |
| pub fn impl_function() {} |
| } |
| |
| impl TestTrait2 for TestStruct2 { |
| fn trait_function() {} |
| } |
| } |
| |
| struct GenericStruct<T1, T2>(std::marker::PhantomData<(T1, T2)>); |
| |
| // Generic implementation |
| impl<T1, T2> GenericStruct<T1, T2> { |
| pub fn impl_function() { |
| // Closure in a generic implementation |
| let closure = || TestStruct1; |
| closure(); |
| } |
| } |
| |
| // Generic trait implementation |
| impl<T> TestTrait1 for GenericStruct<T, i32> { |
| fn trait_function() {} |
| } |
| |
| // Implementation based on associated type |
| trait TestTrait3 { |
| type AssocType; |
| fn trait_function3(); |
| } |
| impl TestTrait3 for TestStruct1 { |
| type AssocType = usize; |
| fn trait_function3() {} |
| } |
| impl<T: TestTrait3> TestTrait3 for GenericStruct<T, T::AssocType> { |
| type AssocType = T::AssocType; |
| fn trait_function3() {} |
| } |
| |
| // Generic trait implementation with const generics |
| impl<T, const N: usize> TestTrait1 for GenericStruct<[T; N], f32> { |
| fn trait_function() {} |
| } |
| |
| // Generic function |
| fn generic_func<T>(value: T) -> T { |
| // Closure in a generic function |
| let closure = || TestStruct1; |
| closure(); |
| |
| value |
| } |
| |
| fn const_generic_fn_bool<const C: bool>() {} |
| fn const_generic_fn_non_int<const C: ()>() {} |
| fn const_generic_fn_signed_int<const C: i64>() {} |
| fn const_generic_fn_unsigned_int<const C: u32>() {} |