[llvm-readobj] - Implement LLVM-style dumping for .stack_sizes sections.
[llvm-complete.git] / utils / benchmark / test / diagnostics_test.cc
blobdd64a336553157dfac9fc327f451030fc10a48cd
1 // Testing:
2 // State::PauseTiming()
3 // State::ResumeTiming()
4 // Test that CHECK's within these function diagnose when they are called
5 // outside of the KeepRunning() loop.
6 //
7 // NOTE: Users should NOT include or use src/check.h. This is only done in
8 // order to test library internals.
10 #include <cstdlib>
11 #include <stdexcept>
13 #include "../src/check.h"
14 #include "benchmark/benchmark.h"
16 #if defined(__GNUC__) && !defined(__EXCEPTIONS)
17 #define TEST_HAS_NO_EXCEPTIONS
18 #endif
20 void TestHandler() {
21 #ifndef TEST_HAS_NO_EXCEPTIONS
22 throw std::logic_error("");
23 #else
24 std::abort();
25 #endif
28 void try_invalid_pause_resume(benchmark::State& state) {
29 #if !defined(TEST_BENCHMARK_LIBRARY_HAS_NO_ASSERTIONS) && !defined(TEST_HAS_NO_EXCEPTIONS)
30 try {
31 state.PauseTiming();
32 std::abort();
33 } catch (std::logic_error const&) {
35 try {
36 state.ResumeTiming();
37 std::abort();
38 } catch (std::logic_error const&) {
40 #else
41 (void)state; // avoid unused warning
42 #endif
45 void BM_diagnostic_test(benchmark::State& state) {
46 static bool called_once = false;
48 if (called_once == false) try_invalid_pause_resume(state);
50 for (auto _ : state) {
51 benchmark::DoNotOptimize(state.iterations());
54 if (called_once == false) try_invalid_pause_resume(state);
56 called_once = true;
58 BENCHMARK(BM_diagnostic_test);
61 void BM_diagnostic_test_keep_running(benchmark::State& state) {
62 static bool called_once = false;
64 if (called_once == false) try_invalid_pause_resume(state);
66 while(state.KeepRunning()) {
67 benchmark::DoNotOptimize(state.iterations());
70 if (called_once == false) try_invalid_pause_resume(state);
72 called_once = true;
74 BENCHMARK(BM_diagnostic_test_keep_running);
76 int main(int argc, char* argv[]) {
77 benchmark::internal::GetAbortHandler() = &TestHandler;
78 benchmark::Initialize(&argc, argv);
79 benchmark::RunSpecifiedBenchmarks();