1ee226c05af9e0187098f43fb71465a581487af9bDan Austin//===----------------------------------------------------------------------===//
2ee226c05af9e0187098f43fb71465a581487af9bDan Austin//
3ee226c05af9e0187098f43fb71465a581487af9bDan Austin//                     The LLVM Compiler Infrastructure
4ee226c05af9e0187098f43fb71465a581487af9bDan Austin//
5ee226c05af9e0187098f43fb71465a581487af9bDan Austin// This file is dual licensed under the MIT and the University of Illinois Open
6ee226c05af9e0187098f43fb71465a581487af9bDan Austin// Source Licenses. See LICENSE.TXT for details.
7ee226c05af9e0187098f43fb71465a581487af9bDan Austin//
8ee226c05af9e0187098f43fb71465a581487af9bDan Austin//===----------------------------------------------------------------------===//
9ee226c05af9e0187098f43fb71465a581487af9bDan Austin
10ee226c05af9e0187098f43fb71465a581487af9bDan Austin// type_traits
11ee226c05af9e0187098f43fb71465a581487af9bDan Austin
12ee226c05af9e0187098f43fb71465a581487af9bDan Austin// is_rvalue_reference
13ee226c05af9e0187098f43fb71465a581487af9bDan Austin
14ee226c05af9e0187098f43fb71465a581487af9bDan Austin// UNSUPPORTED: c++98, c++03
15ee226c05af9e0187098f43fb71465a581487af9bDan Austin
16ee226c05af9e0187098f43fb71465a581487af9bDan Austin#include <type_traits>
17ee226c05af9e0187098f43fb71465a581487af9bDan Austin#include <cstddef>        // for std::nullptr_t
18ee226c05af9e0187098f43fb71465a581487af9bDan Austin#include "test_macros.h"
19ee226c05af9e0187098f43fb71465a581487af9bDan Austin
20ee226c05af9e0187098f43fb71465a581487af9bDan Austintemplate <class T>
21ee226c05af9e0187098f43fb71465a581487af9bDan Austinvoid test_is_rvalue_reference()
22ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
23ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference<T>::value, "");
24ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference<const T>::value, "");
25ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference<volatile T>::value, "");
26ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference<const volatile T>::value, "");
27ee226c05af9e0187098f43fb71465a581487af9bDan Austin#if TEST_STD_VER > 14
28ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference_v<T>, "");
29ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference_v<const T>, "");
30ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference_v<volatile T>, "");
31ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert( std::is_rvalue_reference_v<const volatile T>, "");
32ee226c05af9e0187098f43fb71465a581487af9bDan Austin#endif
33ee226c05af9e0187098f43fb71465a581487af9bDan Austin}
34ee226c05af9e0187098f43fb71465a581487af9bDan Austin
35ee226c05af9e0187098f43fb71465a581487af9bDan Austintemplate <class T>
36ee226c05af9e0187098f43fb71465a581487af9bDan Austinvoid test_is_not_rvalue_reference()
37ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
38ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference<T>::value, "");
39ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference<const T>::value, "");
40ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference<volatile T>::value, "");
41ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference<const volatile T>::value, "");
42ee226c05af9e0187098f43fb71465a581487af9bDan Austin#if TEST_STD_VER > 14
43ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference_v<T>, "");
44ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference_v<const T>, "");
45ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference_v<volatile T>, "");
46ee226c05af9e0187098f43fb71465a581487af9bDan Austin    static_assert(!std::is_rvalue_reference_v<const volatile T>, "");
47ee226c05af9e0187098f43fb71465a581487af9bDan Austin#endif
48ee226c05af9e0187098f43fb71465a581487af9bDan Austin}
49ee226c05af9e0187098f43fb71465a581487af9bDan Austin
50ee226c05af9e0187098f43fb71465a581487af9bDan Austinclass Empty
51ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
52ee226c05af9e0187098f43fb71465a581487af9bDan Austin};
53ee226c05af9e0187098f43fb71465a581487af9bDan Austin
54ee226c05af9e0187098f43fb71465a581487af9bDan Austinclass NotEmpty
55ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
56ee226c05af9e0187098f43fb71465a581487af9bDan Austin    virtual ~NotEmpty();
57ee226c05af9e0187098f43fb71465a581487af9bDan Austin};
58ee226c05af9e0187098f43fb71465a581487af9bDan Austin
59ee226c05af9e0187098f43fb71465a581487af9bDan Austinunion Union {};
60ee226c05af9e0187098f43fb71465a581487af9bDan Austin
61ee226c05af9e0187098f43fb71465a581487af9bDan Austinstruct bit_zero
62ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
63ee226c05af9e0187098f43fb71465a581487af9bDan Austin    int :  0;
64ee226c05af9e0187098f43fb71465a581487af9bDan Austin};
65ee226c05af9e0187098f43fb71465a581487af9bDan Austin
66ee226c05af9e0187098f43fb71465a581487af9bDan Austinclass Abstract
67ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
68ee226c05af9e0187098f43fb71465a581487af9bDan Austin    virtual ~Abstract() = 0;
69ee226c05af9e0187098f43fb71465a581487af9bDan Austin};
70ee226c05af9e0187098f43fb71465a581487af9bDan Austin
71ee226c05af9e0187098f43fb71465a581487af9bDan Austinenum Enum {zero, one};
72ee226c05af9e0187098f43fb71465a581487af9bDan Austinstruct incomplete_type;
73ee226c05af9e0187098f43fb71465a581487af9bDan Austin
74ee226c05af9e0187098f43fb71465a581487af9bDan Austintypedef void (*FunctionPtr)();
75ee226c05af9e0187098f43fb71465a581487af9bDan Austin
76ee226c05af9e0187098f43fb71465a581487af9bDan Austinint main()
77ee226c05af9e0187098f43fb71465a581487af9bDan Austin{
78ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_rvalue_reference<int&&>();
79ee226c05af9e0187098f43fb71465a581487af9bDan Austin
80ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<std::nullptr_t>();
81ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<void>();
82ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<int>();
83ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<int*>();
84ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<int&>();
85ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<double>();
86ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<const int*>();
87ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<char[3]>();
88ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<char[]>();
89ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<Union>();
90ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<Enum>();
91ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<FunctionPtr>();
92ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<Empty>();
93ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<bit_zero>();
94ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<NotEmpty>();
95ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<Abstract>();
96ee226c05af9e0187098f43fb71465a581487af9bDan Austin    test_is_not_rvalue_reference<incomplete_type>();
97ee226c05af9e0187098f43fb71465a581487af9bDan Austin}
98