Index: libcxx/benchmarks/CMakeLists.txt =================================================================== --- libcxx/benchmarks/CMakeLists.txt +++ libcxx/benchmarks/CMakeLists.txt @@ -192,6 +192,7 @@ std_format_spec_string_unicode.bench.cpp string.bench.cpp stringstream.bench.cpp + system_error.bench.cpp to_chars.bench.cpp unordered_set_operations.bench.cpp util_smartptr.bench.cpp Index: libcxx/benchmarks/system_error.bench.cpp =================================================================== --- /dev/null +++ libcxx/benchmarks/system_error.bench.cpp @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include +#include + +#include "Utilities.h" +#include "benchmark/benchmark.h" + +static void BM_SystemErrorWithMessage(benchmark::State& state) { + for (auto _ : state) { + std::error_code ec{}; + benchmark::DoNotOptimize(std::system_error{ec, ""}); + } +} +BENCHMARK(BM_SystemErrorWithMessage); + +static void BM_SystemErrorWithoutMessage(benchmark::State& state) { + for (auto _ : state) { + std::error_code ec{}; + benchmark::DoNotOptimize(std::system_error{ec}); + } +} +BENCHMARK(BM_SystemErrorWithoutMessage); + +BENCHMARK_MAIN(); Index: libcxx/include/__system_error/system_error.h =================================================================== --- libcxx/include/__system_error/system_error.h +++ libcxx/include/__system_error/system_error.h @@ -39,6 +39,7 @@ private: static string __init(const error_code&, string); + static string __init(const error_code&); }; _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_system_error(int __ev, const char* __what_arg); Index: libcxx/src/system_error.cpp =================================================================== --- libcxx/src/system_error.cpp +++ libcxx/src/system_error.cpp @@ -243,6 +243,16 @@ return what_arg; } +string +system_error::__init(const error_code& ec) +{ + if (ec) + { + return ec.message(); + } + return string(); +} + system_error::system_error(error_code ec, const string& what_arg) : runtime_error(__init(ec, what_arg)), __ec_(ec) @@ -256,7 +266,7 @@ } system_error::system_error(error_code ec) - : runtime_error(__init(ec, "")), + : runtime_error(__init(ec)), __ec_(ec) { } @@ -274,7 +284,7 @@ } system_error::system_error(int ev, const error_category& ecat) - : runtime_error(__init(error_code(ev, ecat), "")), + : runtime_error(__init(error_code(ev, ecat))), __ec_(error_code(ev, ecat)) { }