@@ -191,6 +191,14 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
191191 TypeName (const TypeName&) = delete; \
192192 TypeName& operator =(const TypeName&) = delete
193193
194+ #ifdef BENCHMARK_HAS_CXX17
195+ #define BENCHMARK_UNUSED [[maybe_unused]]
196+ #elif defined(__GNUC__) || defined(__clang__)
197+ #define BENCHMARK_UNUSED __attribute__ ((unused))
198+ #else
199+ #define BENCHMARK_UNUSED
200+ #endif
201+
194202// Used to annotate functions, methods and classes so they
195203// are not optimized by the compiler. Useful for tests
196204// where you expect loops to stay in place churning cycles
@@ -303,6 +311,18 @@ BENCHMARK(BM_test)->Unit(benchmark::kMillisecond);
303311#endif // _MSC_VER_
304312
305313namespace benchmark {
314+
315+ namespace internal {
316+ #if (__cplusplus < 201402L || (defined(_MSC_VER) && _MSVC_LANG < 201402L))
317+ template <typename T, typename ... Args>
318+ std::unique_ptr<T> make_unique (Args&&... args) {
319+ return std::unique_ptr<T>(new T (std::forward<Args>(args)...));
320+ }
321+ #else
322+ using ::std::make_unique;
323+ #endif
324+ } // namespace internal
325+
306326class BenchmarkReporter ;
307327class State ;
308328
@@ -472,7 +492,7 @@ BENCHMARK_EXPORT Benchmark* RegisterBenchmarkInternal(
472492
473493// Ensure that the standard streams are properly initialized in every TU.
474494BENCHMARK_EXPORT int InitializeStreams ();
475- [[maybe_unused]] static int stream_init_anchor = InitializeStreams();
495+ BENCHMARK_UNUSED static int stream_init_anchor = InitializeStreams();
476496
477497} // namespace internal
478498
@@ -1026,7 +1046,7 @@ inline BENCHMARK_ALWAYS_INLINE bool State::KeepRunningInternal(IterationCount n,
10261046}
10271047
10281048struct State ::StateIterator {
1029- struct [[maybe_unused]] Value {};
1049+ struct BENCHMARK_UNUSED Value {};
10301050 typedef std::forward_iterator_tag iterator_category;
10311051 typedef Value value_type;
10321052 typedef Value reference;
@@ -1371,27 +1391,24 @@ class LambdaBenchmark : public Benchmark {
13711391inline internal::Benchmark* RegisterBenchmark (const std::string& name,
13721392 internal::Function* fn) {
13731393 return internal::RegisterBenchmarkInternal (
1374- std ::make_unique<internal::FunctionBenchmark>(name, fn));
1394+ benchmark::internal ::make_unique<internal::FunctionBenchmark>(name, fn));
13751395}
13761396
13771397template <class Lambda >
13781398internal::Benchmark* RegisterBenchmark (const std::string& name, Lambda&& fn) {
13791399 using BenchType =
13801400 internal::LambdaBenchmark<typename std::decay<Lambda>::type>;
13811401 return internal::RegisterBenchmarkInternal (
1382- std::make_unique<BenchType>(name, std::forward<Lambda>(fn)));
1402+ benchmark::internal::make_unique<BenchType>(name,
1403+ std::forward<Lambda>(fn)));
13831404}
13841405
1385- #if (!defined(BENCHMARK_GCC_VERSION) || BENCHMARK_GCC_VERSION >= 409)
13861406template <class Lambda , class ... Args>
13871407internal::Benchmark* RegisterBenchmark (const std::string& name, Lambda&& fn,
13881408 Args&&... args) {
13891409 return benchmark::RegisterBenchmark (
13901410 name, [=](benchmark::State& st) { fn (st, args...); });
13911411}
1392- #else
1393- #define BENCHMARK_HAS_NO_VARIADIC_REGISTER_BENCHMARK
1394- #endif
13951412
13961413// The base class for all fixture tests.
13971414class Fixture : public internal ::Benchmark {
@@ -1442,13 +1459,14 @@ class Fixture : public internal::Benchmark {
14421459#define BENCHMARK_PRIVATE_DECLARE (n ) \
14431460 /* NOLINTNEXTLINE(misc-use-anonymous-namespace) */ \
14441461 static ::benchmark::internal::Benchmark const * const BENCHMARK_PRIVATE_NAME ( \
1445- n) [[maybe_unused]]
1462+ n) BENCHMARK_UNUSED
14461463
14471464#define BENCHMARK (...) \
14481465 BENCHMARK_PRIVATE_DECLARE (_benchmark_) = \
14491466 (::benchmark::internal::RegisterBenchmarkInternal( \
1450- std::make_unique<::benchmark::internal::FunctionBenchmark>( \
1451- #__VA_ARGS__, __VA_ARGS__)))
1467+ benchmark::internal::make_unique< \
1468+ ::benchmark::internal::FunctionBenchmark>(#__VA_ARGS__, \
1469+ __VA_ARGS__)))
14521470
14531471// Old-style macros
14541472#define BENCHMARK_WITH_ARG (n, a ) BENCHMARK(n)->Arg ((a))
@@ -1469,11 +1487,12 @@ class Fixture : public internal::Benchmark {
14691487// }
14701488// /* Registers a benchmark named "BM_takes_args/int_string_test` */
14711489// BENCHMARK_CAPTURE(BM_takes_args, int_string_test, 42, std::string("abc"));
1472- #define BENCHMARK_CAPTURE (func, test_case_name, ...) \
1473- BENCHMARK_PRIVATE_DECLARE (_benchmark_) = \
1474- (::benchmark::internal::RegisterBenchmarkInternal( \
1475- std::make_unique<::benchmark::internal::FunctionBenchmark>( \
1476- #func " /" #test_case_name, \
1490+ #define BENCHMARK_CAPTURE (func, test_case_name, ...) \
1491+ BENCHMARK_PRIVATE_DECLARE (_benchmark_) = \
1492+ (::benchmark::internal::RegisterBenchmarkInternal( \
1493+ benchmark::internal::make_unique< \
1494+ ::benchmark::internal::FunctionBenchmark>( \
1495+ #func " /" #test_case_name, \
14771496 [](::benchmark::State& st) { func (st, __VA_ARGS__); })))
14781497
14791498// This will register a benchmark for a templatized function. For example:
@@ -1484,22 +1503,24 @@ class Fixture : public internal::Benchmark {
14841503// BENCHMARK_TEMPLATE(BM_Foo, 1);
14851504//
14861505// will register BM_Foo<1> as a benchmark.
1487- #define BENCHMARK_TEMPLATE1 (n, a ) \
1488- BENCHMARK_PRIVATE_DECLARE (n) = \
1489- (::benchmark::internal::RegisterBenchmarkInternal( \
1490- std::make_unique<::benchmark::internal::FunctionBenchmark>( \
1491- #n " <" #a " >" , n<a>)))
1492-
1493- #define BENCHMARK_TEMPLATE2 (n, a, b ) \
1494- BENCHMARK_PRIVATE_DECLARE (n) = \
1495- (::benchmark::internal::RegisterBenchmarkInternal( \
1496- std::make_unique<::benchmark::internal::FunctionBenchmark>( \
1497- #n " <" #a " ," #b " >" , n<a, b>)))
1498-
1499- #define BENCHMARK_TEMPLATE (n, ...) \
1500- BENCHMARK_PRIVATE_DECLARE (n) = \
1501- (::benchmark::internal::RegisterBenchmarkInternal( \
1502- std::make_unique<::benchmark::internal::FunctionBenchmark>( \
1506+ #define BENCHMARK_TEMPLATE1 (n, a ) \
1507+ BENCHMARK_PRIVATE_DECLARE (n) = \
1508+ (::benchmark::internal::RegisterBenchmarkInternal( \
1509+ benchmark::internal::make_unique< \
1510+ ::benchmark::internal::FunctionBenchmark>(#n " <" #a " >" , n<a>)))
1511+
1512+ #define BENCHMARK_TEMPLATE2 (n, a, b ) \
1513+ BENCHMARK_PRIVATE_DECLARE (n) = \
1514+ (::benchmark::internal::RegisterBenchmarkInternal( \
1515+ benchmark::internal::make_unique< \
1516+ ::benchmark::internal::FunctionBenchmark>(#n " <" #a " ," #b " >" , \
1517+ n<a, b>)))
1518+
1519+ #define BENCHMARK_TEMPLATE (n, ...) \
1520+ BENCHMARK_PRIVATE_DECLARE (n) = \
1521+ (::benchmark::internal::RegisterBenchmarkInternal( \
1522+ benchmark::internal::make_unique< \
1523+ ::benchmark::internal::FunctionBenchmark>( \
15031524 #n " <" #__VA_ARGS__ " >" , n<__VA_ARGS__>)))
15041525
15051526// This will register a benchmark for a templatized function,
@@ -1517,12 +1538,13 @@ class Fixture : public internal::Benchmark {
15171538#define BENCHMARK_TEMPLATE1_CAPTURE (func, a, test_case_name, ...) \
15181539 BENCHMARK_CAPTURE (func<a>, test_case_name, __VA_ARGS__)
15191540
1520- #define BENCHMARK_TEMPLATE2_CAPTURE (func, a, b, test_case_name, ...) \
1521- BENCHMARK_PRIVATE_DECLARE (func) = \
1522- (::benchmark::internal::RegisterBenchmarkInternal( \
1523- std::make_unique<::benchmark::internal::FunctionBenchmark>( \
1524- #func " <" #a " ," #b " >" \
1525- " /" #test_case_name, \
1541+ #define BENCHMARK_TEMPLATE2_CAPTURE (func, a, b, test_case_name, ...) \
1542+ BENCHMARK_PRIVATE_DECLARE (func) = \
1543+ (::benchmark::internal::RegisterBenchmarkInternal( \
1544+ benchmark::internal::make_unique< \
1545+ ::benchmark::internal::FunctionBenchmark>( \
1546+ #func " <" #a " ," #b " >" \
1547+ " /" #test_case_name, \
15261548 [](::benchmark::State& st) { func<a, b>(st, __VA_ARGS__); })))
15271549
15281550#define BENCHMARK_PRIVATE_DECLARE_F (BaseClass, Method ) \
@@ -1591,7 +1613,7 @@ class Fixture : public internal::Benchmark {
15911613#define BENCHMARK_PRIVATE_REGISTER_F (TestName ) \
15921614 BENCHMARK_PRIVATE_DECLARE (TestName) = \
15931615 (::benchmark::internal::RegisterBenchmarkInternal( \
1594- std ::make_unique<TestName>()))
1616+ benchmark::internal ::make_unique<TestName>()))
15951617
15961618// This macro will define and register a benchmark within a fixture class.
15971619#define BENCHMARK_F (BaseClass, Method ) \
0 commit comments