1a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant//===----------------------------------------------------------------------===//
2a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant//
3a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant//                     The LLVM Compiler Infrastructure
4a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant//
5a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
7a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant//
8a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant//===----------------------------------------------------------------------===//
9a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant
10a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant// test get_unexpected
11a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant
12a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant#include <exception>
13a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant#include <cassert>
14a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant#include <cstdlib>
15a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant
16a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnantvoid f1() {}
17a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnantvoid f2() {}
18a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant
19a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnantvoid f3()
20a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant{
21a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    std::exit(0);
22a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant}
23a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant
24a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnantint main()
25a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant{
26a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant
27a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    std::unexpected_handler old = std::get_unexpected();
28a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    // verify there is a previous unexpected handler
29a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    assert(old);
30a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    std::set_unexpected(f1);
31a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    assert(std::get_unexpected() == f1);
32a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    // verify f1 was replace with f2
33a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    std::set_unexpected(f2);
34a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    assert(std::get_unexpected() == f2);
35a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    // verify calling original unexpected handler calls terminate
36a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    std::set_terminate(f3);
37a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    (*old)();
38a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant    assert(0);
39a445151f4a1a9abf852cd7b84d6328687bb3294cHoward Hinnant}
40