rust/tests/debuginfo/function-names.rs
2024-06-05 22:25:42 +01:00

207 lines
6.9 KiB
Rust

// 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#[...]}>();
// 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)
// cdb-check:[...] a!function_names::const_generic_fn_non_int<CONST#[...]> (void)
// cdb-check:[...] a!function_names::const_generic_fn_unsigned_int<14> (void)
// cdb-check:[...] a!function_names::const_generic_fn_signed_int<-7> (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>() {}