value.pass.cpp revision 7175a079211ec78c8232d9d55fa4c1f9eeae803d
11b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//===----------------------------------------------------------------------===//
21b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//
31b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//                     The LLVM Compiler Infrastructure
41b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//
51b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// This file is dual licensed under the MIT and the University of Illinois Open
61b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// Source Licenses. See LICENSE.TXT for details.
71b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//
81b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk//===----------------------------------------------------------------------===//
91b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
101b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// UNSUPPORTED: c++98, c++03, c++11
111b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
121b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk// <experimental/any>
137d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk
147d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// template <class Value> any(Value &&)
157d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk
167d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// Test construction from a value.
177d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// Concerns:
187d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// ---------
197d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// 1. The value is properly move/copied depending on the value category.
207d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk// 2. Both small and large values are properly handled.
211b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
221b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
231b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#include <experimental/any>
241b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#include <cassert>
251b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
261b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#include "any_helpers.h"
277d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk#include "count_new.hpp"
287d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk#include "test_macros.h"
297d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk
307d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burkusing std::experimental::any;
317d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burkusing std::experimental::any_cast;
327d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk
337d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burktemplate <class Type>
343cc1bdbc6efdb268be16e7184709eeb4ecf9b944Phil Burkvoid test_copy_value_throws()
351b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk{
361b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#if !defined(TEST_HAS_NO_EXCEPTIONS)
371b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    assert(Type::count == 0);
381b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    {
391b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        Type const t(42);
407eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood        assert(Type::count == 1);
411b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        try {
421b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            any const a2(t);
431b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            assert(false);
441b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        } catch (my_any_exception const &) {
451b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            // do nothing
461b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        } catch (...) {
471b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            assert(false);
481b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        }
491b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::count == 1);
501b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(t.value == 42);
511b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    }
521b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    assert(Type::count == 0);
531b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#endif
541b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk}
551b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
561b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burkvoid test_move_value_throws()
571b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk{
581b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk#if !defined(TEST_HAS_NO_EXCEPTIONS)
591b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    assert(throws_on_move::count == 0);
601b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    {
611b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        throws_on_move v;
621b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(throws_on_move::count == 1);
631b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        try {
641b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            any const a(std::move(v));
651b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            assert(false);
661b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        } catch (my_any_exception const &) {
671b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk            // do nothing
681b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        } catch (...) {
697d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk            assert(false);
707d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk        }
717d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk        assert(throws_on_move::count == 1);
727d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk    }
737d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk    assert(throws_on_move::count == 0);
747d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk#endif
757d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk}
767d2065ed4fcb6326b12ceba1384441977e35e4ddPhil Burk
771b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burktemplate <class Type>
7844d535aaf2a06115de5255f2787c4f7a4db949cePhil Burkvoid test_copy_move_value() {
7944d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk    // constructing from a small type should perform no allocations.
8044d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk    DisableAllocationGuard g(isSmallType<Type>()); ((void)g);
8144d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk    assert(Type::count == 0);
8244d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk    Type::reset();
8344d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk    {
8444d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk        Type t(42);
8544d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk        assert(Type::count == 1);
8644d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk
8744d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk        any a(t);
8844d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk
8944d535aaf2a06115de5255f2787c4f7a4db949cePhil Burk        assert(Type::count == 2);
901b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::copied == 1);
911b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::moved == 0);
921b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assertContains<Type>(a, 42);
931b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    }
941b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    assert(Type::count == 0);
951b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    Type::reset();
961b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    {
971b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        Type t(42);
981b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::count == 1);
991b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
1001b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        any a(std::move(t));
1011b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
1021b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::count == 2);
1031b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::copied == 0);
1041b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assert(Type::moved == 1);
1051b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk        assertContains<Type>(a, 42);
1061b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    }
1077eb441cb4abcd3230a4d243469c5044f49e707c8Mike Lockwood}
1081b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
1091b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk
1101b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burkint main() {
1111b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    test_copy_move_value<small>();
1121b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    test_copy_move_value<large>();
1131b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    test_copy_value_throws<small_throws_on_copy>();
1141b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    test_copy_value_throws<large_throws_on_copy>();
1151b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk    test_move_value_throws();
1161b83e3f75e3bd96ed564ec4b95a8d69caabc0f5fPhil Burk}