| // Function names are formatted differently in old versions of GDB | |
| //@ min-gdb-version: 10.1 | |
| //@ compile-flags:-g | |
| //@ disable-gdb-pretty-printers | |
| //@ ignore-backends: gcc | |
| // === 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#68cf9e429c783d36}>(); | |
| //@ 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(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>() {} |