//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This is a dummy feature that prevents this test from running by default.
// REQUIRES: template-cost-testing
// The table below compares the compile time and object size for each of the
// variants listed in the RUN script.
//
// Impl Compile Time Object Size
// -------------------------------------------
// std::_IsSame: 689.634 ms 356 K
// std::is_same: 8,129.180 ms 560 K
//
// RUN: %{cxx} %{flags} %{compile_flags} -c %s -o %S/orig.o -ggdb -ggnu-pubnames -ftemplate-depth=5000 -ftime-trace -std=c++17
// RUN: %{cxx} %{flags} %{compile_flags} -c %s -o %S/new.o -ggdb -ggnu-pubnames -ftemplate-depth=5000 -ftime-trace -std=c++17 -DTEST_NEW
#include <type_traits>
#include <cassert>
#include "test_macros.h"
#include "template_cost_testing.h"
template <int N> struct Arg { enum { value = 1 }; };
#ifdef TEST_NEW
#define IS_SAME std::_IsSame
#else
#define IS_SAME std::is_same
#endif
#define TEST_CASE_NOP() IS_SAME < Arg< __COUNTER__ >, Arg < __COUNTER__ > >::value,
#define TEST_CASE_TYPE() IS_SAME < Arg< __COUNTER__ >, Arg < __COUNTER__ > >,
int sink(...);
int x = sink(
REPEAT_10000(TEST_CASE_NOP)
REPEAT_10000(TEST_CASE_NOP) 42
);
void Foo( REPEAT_1000(TEST_CASE_TYPE) int) { }
static_assert(__COUNTER__ > 10000, "");
void escape() {
sink(&x);
sink(&Foo);
}