diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2018-11-13 05:33:31 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2018-11-13 05:33:31 +0000 |
commit | d4fa0381e35b68fccff8070764282f07b3eb7711 (patch) | |
tree | f7097dd649694fb82fd608b7c62ebc910ffa86b6 /libcxx/test | |
parent | 245d94776f971903c0e238485c7a985c0a740dab (diff) | |
download | bcm5719-llvm-d4fa0381e35b68fccff8070764282f07b3eb7711.tar.gz bcm5719-llvm-d4fa0381e35b68fccff8070764282f07b3eb7711.zip |
Fix PR39619 - iterator_traits isn't SFINAE-friendly enough. Thanks to Eric for the report
llvm-svn: 346738
Diffstat (limited to 'libcxx/test')
-rw-r--r-- | libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.fail.cpp | 122 | ||||
-rw-r--r-- | libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp | 1 |
2 files changed, 123 insertions, 0 deletions
diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.fail.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.fail.cpp new file mode 100644 index 00000000000..02152348111 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/empty.fail.cpp @@ -0,0 +1,122 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// <iterator> + +// struct iterator_traits +// { +// }; + +#include <iterator> +#include "test_macros.h" + +struct A {}; +struct NotAnIteratorEmpty {}; + +struct NotAnIteratorNoDifference +{ +// typedef int difference_type; + typedef A value_type; + typedef A* pointer; + typedef A& reference; + typedef std::forward_iterator_tag iterator_category; +}; + +struct NotAnIteratorNoValue +{ + typedef int difference_type; +// typedef A value_type; + typedef A* pointer; + typedef A& reference; + typedef std::forward_iterator_tag iterator_category; +}; + +struct NotAnIteratorNoPointer +{ + typedef int difference_type; + typedef A value_type; +// typedef A* pointer; + typedef A& reference; + typedef std::forward_iterator_tag iterator_category; +}; + +struct NotAnIteratorNoReference +{ + typedef int difference_type; + typedef A value_type; + typedef A* pointer; +// typedef A& reference; + typedef std::forward_iterator_tag iterator_category; +}; + +struct NotAnIteratorNoCategory +{ + typedef int difference_type; + typedef A value_type; + typedef A* pointer; + typedef A& reference; +// typedef std::forward_iterator_tag iterator_category; +}; + +int main() +{ + { + typedef std::iterator_traits<NotAnIteratorEmpty> T; + typedef T::difference_type DT; // expected-error-re {{no type named 'difference_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::value_type VT; // expected-error-re {{no type named 'value_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::pointer PT; // expected-error-re {{no type named 'pointer' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::reference RT; // expected-error-re {{no type named 'reference' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::iterator_category CT; // expected-error-re {{no type named 'iterator_category' in 'std::__1::iterator_traits<{{.+}}>}} + } + + { + typedef std::iterator_traits<NotAnIteratorNoDifference> T; + typedef T::difference_type DT; // expected-error-re {{no type named 'difference_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::value_type VT; // expected-error-re {{no type named 'value_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::pointer PT; // expected-error-re {{no type named 'pointer' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::reference RT; // expected-error-re {{no type named 'reference' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::iterator_category CT; // expected-error-re {{no type named 'iterator_category' in 'std::__1::iterator_traits<{{.+}}>}} + } + + { + typedef std::iterator_traits<NotAnIteratorNoValue> T; + typedef T::difference_type DT; // expected-error-re {{no type named 'difference_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::value_type VT; // expected-error-re {{no type named 'value_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::pointer PT; // expected-error-re {{no type named 'pointer' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::reference RT; // expected-error-re {{no type named 'reference' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::iterator_category CT; // expected-error-re {{no type named 'iterator_category' in 'std::__1::iterator_traits<{{.+}}>}} + } + + { + typedef std::iterator_traits<NotAnIteratorNoPointer> T; + typedef T::difference_type DT; // expected-error-re {{no type named 'difference_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::value_type VT; // expected-error-re {{no type named 'value_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::pointer PT; // expected-error-re {{no type named 'pointer' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::reference RT; // expected-error-re {{no type named 'reference' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::iterator_category CT; // expected-error-re {{no type named 'iterator_category' in 'std::__1::iterator_traits<{{.+}}>}} + } + + { + typedef std::iterator_traits<NotAnIteratorNoReference> T; + typedef T::difference_type DT; // expected-error-re {{no type named 'difference_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::value_type VT; // expected-error-re {{no type named 'value_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::pointer PT; // expected-error-re {{no type named 'pointer' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::reference RT; // expected-error-re {{no type named 'reference' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::iterator_category CT; // expected-error-re {{no type named 'iterator_category' in 'std::__1::iterator_traits<{{.+}}>}} + } + + { + typedef std::iterator_traits<NotAnIteratorNoCategory> T; + typedef T::difference_type DT; // expected-error-re {{no type named 'difference_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::value_type VT; // expected-error-re {{no type named 'value_type' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::pointer PT; // expected-error-re {{no type named 'pointer' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::reference RT; // expected-error-re {{no type named 'reference' in 'std::__1::iterator_traits<{{.+}}>}} + typedef T::iterator_category CT; // expected-error-re {{no type named 'iterator_category' in 'std::__1::iterator_traits<{{.+}}>}} + } +} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp index 38f7c0b6b83..34f430ff3ee 100644 --- a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp @@ -39,5 +39,6 @@ int main() static_assert((std::is_same<It::difference_type, int>::value), ""); static_assert((std::is_same<It::value_type, A>::value), ""); static_assert((std::is_same<It::pointer, A*>::value), ""); + static_assert((std::is_same<It::reference, A&>::value), ""); static_assert((std::is_same<It::iterator_category, std::forward_iterator_tag>::value), ""); } |