From d180f00098c64d59b57ef8ed2823db143dfcd3b2 Mon Sep 17 00:00:00 2001 From: zakrad <49591476+zakrad@users.noreply.github.com> Date: Sat, 29 Aug 2026 14:07:14 +0330 Subject: [PATCH] Add regression test for TAIT in extern fn ICE with the new solver --- ...tait-extern-fn-next-solver-issue-156345.rs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tests/ui/lint/improper-ctypes/tait-extern-fn-next-solver-issue-156345.rs diff --git a/tests/ui/lint/improper-ctypes/tait-extern-fn-next-solver-issue-156345.rs b/tests/ui/lint/improper-ctypes/tait-extern-fn-next-solver-issue-156345.rs new file mode 100644 index 0000000000000..fd8ba56b10be6 --- /dev/null +++ b/tests/ui/lint/improper-ctypes/tait-extern-fn-next-solver-issue-156345.rs @@ -0,0 +1,42 @@ +//@ compile-flags: -Znext-solver=globally +//@ edition: 2021 +//@ check-pass + +// Regression test for . +// An `extern "C" fn` taking a type alias impl trait argument used to ICE with +// the new solver, leaving an entry in the `OpaqueTypeStorage`. Only the new +// solver was affected. + +#![feature(type_alias_impl_trait)] +#![allow(improper_ctypes_definitions)] + +struct Foo { + field: String, +} + +type Tait = impl Sized; + +#[define_opaque(Tait)] +extern "C" fn ice_cold(beverage: Tait) { + let Foo { field } = beverage; + let _ = field; +} + +// A second reproducer from the same issue, with the opaque type in return +// position behind a higher-ranked closure bound. +struct Parser(H); + +impl Parser +where + H: for<'a> Fn(&'a str) -> T, +{ + fn new(handler: H) -> Parser { + Parser(handler) + } + + extern "C" fn many<'s>() -> Parser Fn(&'a str) + 's> { + Parser::new(|_| ()) + } +} + +fn main() {}