#include <iostream>
class input_iterator_tag{};
class forward_iterator_tag : public input_iterator_tag {};
class bidirectional_iterator_tag : public forward_iterator_tag {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};
struct It{
char data[10];
};
template<typename _It>
struct wrapper : public _It{};
struct main_It : public wrapper<It>{};
class Base{
public:
struct iterator : public main_It{};
};
class Container
{
public:
struct iterator : public Base::iterator{};
};
template<typename _InputIterator1>
void __find_end (const wrapper<_InputIterator1> &_first1,
input_iterator_tag*, input_iterator_tag*)
{
printf("input_iterator_tag\r\n");
}
template<typename _BidirectionalIterator1>
void __find_end (const wrapper<_BidirectionalIterator1> &_first1,
bidirectional_iterator_tag*, bidirectional_iterator_tag*)
{
printf("bidirectional_iterator_tag\r\n");
}
template<typename _RandomAccessIterator1>
void __find_end (const wrapper<_RandomAccessIterator1> &_first1,
random_access_iterator_tag*, random_access_iterator_tag*)
{
printf("random_access_iterator_tag\r\n");
}
void OnStart()
{
bidirectional_iterator_tag* bidirectional_tag = NULL;
random_access_iterator_tag* random_access_tag = NULL;
Container::iterator container;
__find_end(container, (bidirectional_iterator_tag*)NULL, (bidirectional_iterator_tag*)NULL); // BUG: input_iterator_tag //expected value: bidirectional_iterator_tag
__find_end(container, (random_access_iterator_tag*)NULL, (random_access_iterator_tag*)NULL); // BUG: bidirectional_iterator_tag //expected value: random_access_iterator_tag
__find_end(container, bidirectional_tag, bidirectional_tag); // BUG: input_iterator_tag //expected value: bidirectional_iterator_tag
__find_end(container, random_access_tag, random_access_tag); // BUG: bidirectional_iterator_tag //expected value: random_access_iterator_tag
}
int main(){
OnStart();
return 0;
}