blob: 99e180171a3e645af3684572d51a5b31c4f173cb [file] [log] [blame]
Marco Antognini1b2da772019-07-22 14:47:36 +00001// RUN: %clang_cc1 -std=c++17 -O0 %s -emit-llvm -o /dev/null -verify -triple %itanium_abi_triple
2// RUN: %clang_cc1 -std=c++17 -O0 %s -emit-llvm -o /dev/null -verify -triple %ms_abi_triple
Marco Antognini88559632019-07-22 09:39:13 +00003
4// Minimal reproducer for PR42665.
Marco Antognini1b2da772019-07-22 14:47:36 +00005// expected-no-diagnostics
Marco Antognini88559632019-07-22 09:39:13 +00006
7struct Foo {
8 Foo() = default;
9 virtual ~Foo() = default;
10};
11
12template <typename Deleter>
13struct Pair {
14 Foo first;
15 Deleter second;
16};
17
18template <typename Deleter>
19Pair(Foo, Deleter) -> Pair<Deleter>;
20
21template <typename T>
22void deleter(T& t) { t.~T(); }
23
24auto make_pair() {
25 return Pair{ Foo(), deleter<Foo> };
26}
27
28void foobar() {
29 auto p = make_pair();
30 auto& f = p.first;
31 auto& d = p.second;
32 d(f); // Invoke virtual destructor of Foo through d.
33} // p's destructor is invoked.
34