blob: 1d72bb7fb607403ad542a8bc673c8c644b2cd1b2 [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03
// ITER_TRAITS(I)
// For a type I, let ITER_TRAITS(I) denote the type I if iterator_traits<I> names
// a specialization generated from the primary template. Otherwise,
// ITER_TRAITS(I) denotes iterator_traits<I>.
#include "test_macros.h"
#include <iterator>
struct MyIter : std::iterator<std::random_access_iterator_tag, char> {};
struct MyIter2 : std::iterator<std::random_access_iterator_tag, char> {};
struct MyIter3 : std::iterator<std::random_access_iterator_tag, char> {};
namespace std {
template <>
struct iterator_traits<MyIter>
: iterator_traits<std::iterator<std::random_access_iterator_tag, char> > {};
template <>
struct iterator_traits<MyIter2>
: std::iterator<std::random_access_iterator_tag, char> {};
} // namespace std
int main(int, char**) {
ASSERT_SAME_TYPE(std::_ITER_TRAITS<char*>, std::iterator_traits<char*>);
{
using ClassIter = std::reverse_iterator<char*>;
ASSERT_SAME_TYPE(std::_ITER_TRAITS<ClassIter>, ClassIter);
ASSERT_SAME_TYPE(std::_ITER_TRAITS<MyIter3>, MyIter3);
}
{
ASSERT_SAME_TYPE(std::_ITER_TRAITS<MyIter>, std::iterator_traits<MyIter>);
ASSERT_SAME_TYPE(std::_ITER_TRAITS<MyIter2>, std::iterator_traits<MyIter2>);
}
return 0;
}