1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <functional> 10 11 // class function<R(ArgTypes...)> 12 13 // function& operator=(function &&); 14 15 // This test runs in C++03, but we have deprecated using std::function in C++03. 16 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX03_FUNCTION 17 18 #include <functional> 19 #include <cassert> 20 21 #include "test_macros.h" 22 23 struct A 24 { 25 static std::function<void()> global; 26 static bool cancel; 27 ~AA28 ~A() { 29 DoNotOptimize(cancel); 30 if (cancel) 31 global = std::function<void()>(nullptr); 32 } operator ()A33 void operator()() {} 34 }; 35 36 std::function<void()> A::global; 37 bool A::cancel = false; 38 main(int,char **)39int main(int, char**) 40 { 41 A::global = A(); 42 RTTI_ASSERT(A::global.target<A>()); 43 44 // Check that we don't recurse in A::~A(). 45 A::cancel = true; 46 A::global = std::function<void()>(nullptr); 47 RTTI_ASSERT(!A::global.target<A>()); 48 49 return 0; 50 } 51