35 lines · cpp
1// RUN: %clang_cc1 -std=c++17 -O0 %s -emit-llvm -o /dev/null -verify -triple %itanium_abi_triple2// RUN: %clang_cc1 -std=c++17 -O0 %s -emit-llvm -o /dev/null -verify -triple %ms_abi_triple3 4// Minimal reproducer for PR42665.5// expected-no-diagnostics6 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 35