From b17bcc02b69f92a57ed7a0f94eb2cab2647fa47b Mon Sep 17 00:00:00 2001 From: Slanterns Date: Sun, 16 Jun 2024 06:33:35 +0800 Subject: [PATCH] add codegen test for `Error::provide` --- tests/codegen/error-provide.rs | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tests/codegen/error-provide.rs diff --git a/tests/codegen/error-provide.rs b/tests/codegen/error-provide.rs new file mode 100644 index 0000000000000..63548b566cf83 --- /dev/null +++ b/tests/codegen/error-provide.rs @@ -0,0 +1,46 @@ +//@ compile-flags: -O +#![crate_type = "lib"] +#![feature(error_generic_member_access)] +use std::error::Request; +use std::fmt; + +#[derive(Debug)] +struct MyBacktrace1 {} + +#[derive(Debug)] +struct MyBacktrace2 {} + +#[derive(Debug)] +struct MyBacktrace3 {} + +#[derive(Debug)] +struct MyError { + backtrace1: MyBacktrace1, + backtrace2: MyBacktrace2, + backtrace3: MyBacktrace3, + other: MyBacktrace3, +} + +impl fmt::Display for MyError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Example Error") + } +} + +impl std::error::Error for MyError { + // CHECK-LABEL: @provide + #[no_mangle] + fn provide<'a>(&'a self, request: &mut Request<'a>) { + // LLVM should be able to optimize multiple .provide_* calls into a switch table and eliminate redundant ones, + // rather than compare one-by-one. + + // CHECK: switch {{i32|i64}} %{{.*}}, label %{{.*}} [ + // CHECK-COUNT-3: {{i32|i64}} {{.*}}, label %{{.*}} + // CHECK-NEXT: ] + request + .provide_ref::(&self.backtrace1) + .provide_ref::(&self.other) + .provide_ref::(&self.backtrace2) + .provide_ref::(&self.backtrace3); + } +}