1a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Copyright (c) 2006, Google Inc.
2a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// All rights reserved.
3a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson//
4a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Redistribution and use in source and binary forms, with or without
5a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// modification, are permitted provided that the following conditions are
6a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// met:
7a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson//
8a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson//     * Redistributions of source code must retain the above copyright
9a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// notice, this list of conditions and the following disclaimer.
10a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson//     * Redistributions in binary form must reproduce the above
11a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// copyright notice, this list of conditions and the following disclaimer
12a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// in the documentation and/or other materials provided with the
13a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// distribution.
14a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson//     * Neither the name of Google Inc. nor the names of its
15a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// contributors may be used to endorse or promote products derived from
16a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// this software without specific prior written permission.
17a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson//
18a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
30a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ----
31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Author: Matt Austern
32a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/stubs/type_traits.h>
34a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
35a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <stdlib.h>   // for exit()
36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <stdio.h>
37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <string>
38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <vector>
39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/testing/googletest.h>
41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <gtest/gtest.h>
42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontypedef int int32;
44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// IBM AIX typedefs `int64` in `sys/inttypes.h`, included transitively above.
45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _AIX
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontypedef long int64;
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif
48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing std::string;
50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing std::vector;
51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing std::pair;
52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// This assertion produces errors like "error: invalid use of
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// incomplete type 'struct <unnamed>::AssertTypesEq<const int, int>'"
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// when it fails.
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<typename T, typename U> struct AssertTypesEq;
58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<typename T> struct AssertTypesEq<T, T> {};
59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define COMPILE_ASSERT_TYPES_EQ(T, U) static_cast<void>(AssertTypesEq<T, U>())
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A user-defined POD type.
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstruct A {
63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int n_;
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A user-defined non-POD type with a trivial copy constructor.
67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass B {
68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  explicit B(int n) : n_(n) { }
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private:
71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int n_;
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial copy constructor.
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare C to have a trivial copy constructor
76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_copy.
77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass C {
78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  explicit C(int n) : n_(n) { }
80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private:
81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int n_;
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google {
85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf {
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal {
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_copy<C> : true_type { };
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace internal
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace protobuf
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace google
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial assignment operator.
93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare C to have a trivial assignment operator
94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_assign.
95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass D {
96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  explicit D(int n) : n_(n) { }
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private:
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int n_;
100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google {
103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf {
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal {
105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_assign<D> : true_type { };
106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace internal
107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace protobuf
108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace google
109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial constructor.
111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare E to have a trivial constructor
112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_constructor.
113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass E {
114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int n_;
116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google {
119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf {
120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal {
121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_constructor<E> : true_type { };
122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace internal
123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace protobuf
124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace google
125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Another user-defined non-POD type with a trivial destructor.
127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// We will explicitly declare E to have a trivial destructor
128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// by specializing has_trivial_destructor.
129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass F {
130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  explicit F(int n) : n_(n) { }
132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private:
133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int n_;
134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google {
137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf {
138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal {
139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsontemplate<> struct has_trivial_destructor<F> : true_type { };
140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace internal
141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace protobuf
142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace google
143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonenum G {};
145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonunion H {};
147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass I {
149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  operator int() const;
151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass J {
154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson private:
155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  operator int() const;
156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google {
159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf {
160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace internal {
161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace {
162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A base class and a derived class that inherits from it, used for
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// testing conversion type traits.
165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass Base {
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  virtual ~Base() { }
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass Derived : public Base {
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson};
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsInteger) {
174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_integral is true for all integer types.
175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<bool>::value);
176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<char>::value);
177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<unsigned char>::value);
178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<signed char>::value);
179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<wchar_t>::value);
180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<int>::value);
181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<unsigned int>::value);
182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<short>::value);
183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<unsigned short>::value);
184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<long>::value);
185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<unsigned long>::value);
186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_integral is false for a few non-integer types.
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<void>::value);
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<float>::value);
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<string>::value);
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<int*>::value);
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<A>::value);
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_integral<pair<int, int> >::value));
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that cv-qualified integral types are still integral, and
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // cv-qualified non-integral types are still non-integral.
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<const char>::value);
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<volatile bool>::value);
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_integral<const volatile unsigned int>::value);
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<const float>::value);
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<int* volatile>::value);
202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_integral<const volatile string>::value);
203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsFloating) {
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_floating_point is true for all floating-point types.
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_floating_point<float>::value);
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_floating_point<double>::value);
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_floating_point<long double>::value);
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_floating_point is false for a few non-float types.
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<void>::value);
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<long>::value);
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<string>::value);
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<float*>::value);
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<A>::value);
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_floating_point<pair<int, int> >::value));
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that cv-qualified floating point types are still floating, and
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // cv-qualified non-floating types are still non-floating.
221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_floating_point<const float>::value);
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_floating_point<volatile double>::value);
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_floating_point<const volatile long double>::value);
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<const int>::value);
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<volatile string>::value);
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_floating_point<const volatile char>::value);
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsPointer) {
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_pointer is true for some pointer types.
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<int*>::value);
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<void*>::value);
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<string*>::value);
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<const void*>::value);
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<volatile float* const*>::value);
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_pointer is false for some non-pointer types.
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<void>::value);
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<float&>::value);
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<long>::value);
241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<vector<int*> >::value);
242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<int[5]>::value);
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // A function pointer is a pointer, but a function type, or a function
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // reference type, is not.
246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<int (*)(int x)>::value);
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<void(char x)>::value);
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<double (&)(string x)>::value);
249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_pointer<T> is true for some cv-qualified pointer types,
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // and false for some cv-qualified non-pointer types.
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<int* const>::value);
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<const void* volatile>::value);
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pointer<char** const volatile>::value);
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<const int>::value);
256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<volatile vector<int*> >::value);
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pointer<const volatile double>::value);
258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsEnum) {
261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// is_enum isn't supported on MSVC or gcc 3.x
262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_enum is true for enum types.
264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_enum<G>::value);
265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_enum<const G>::value);
266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_enum<volatile G>::value);
267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_enum<const volatile G>::value);
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that is_enum is false for a few non-enum types.
270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<void>::value);
271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<G&>::value);
272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<G[1]>::value);
273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<const G[1]>::value);
274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<G[]>::value);
275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<int>::value);
276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<float>::value);
277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<A>::value);
278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<A*>::value);
279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<const A>::value);
280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<H>::value);
281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<I>::value);
282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<J>::value);
283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<void()>::value);
284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<void(*)()>::value);
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<int A::*>::value);
286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_enum<void (A::*)()>::value);
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsReference) {
291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verifies that is_reference is true for all reference types.
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  typedef float& RefFloat;
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<float&>::value);
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<const int&>::value);
295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<const int*&>::value);
296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<int (&)(bool)>::value);
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<RefFloat>::value);
298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<const RefFloat>::value);
299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<volatile RefFloat>::value);
300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_reference<const volatile RefFloat>::value);
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verifies that is_reference is false for all non-reference types.
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<float>::value);
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<const float>::value);
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<volatile float>::value);
307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<const volatile float>::value);
308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<const int*>::value);
309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<int()>::value);
310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_reference<void(*)(const char&)>::value);
311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestAddReference) {
314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int&, add_reference<int>::type);
315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const int&, add_reference<const int>::type);
316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(volatile int&,
317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          add_reference<volatile int>::type);
318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const volatile int&,
319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          add_reference<const volatile int>::type);
320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int&, add_reference<int&>::type);
321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const int&, add_reference<const int&>::type);
322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(volatile int&,
323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          add_reference<volatile int&>::type);
324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const volatile int&,
325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          add_reference<const volatile int&>::type);
326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsPod) {
329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that arithmetic types and pointers are marked as PODs.
330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<bool>::value);
331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<char>::value);
332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<unsigned char>::value);
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<signed char>::value);
334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<wchar_t>::value);
335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<int>::value);
336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<unsigned int>::value);
337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<short>::value);
338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<unsigned short>::value);
339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<long>::value);
340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<unsigned long>::value);
341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<float>::value);
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<double>::value);
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<long double>::value);
344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<string*>::value);
345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<A*>::value);
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<const B*>::value);
347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<C**>::value);
348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<const int>::value);
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<char* volatile>::value);
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<const volatile double>::value);
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3)
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<G>::value);
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<const G>::value);
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<volatile G>::value);
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(is_pod<const volatile G>::value);
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that some non-POD types are not marked as PODs.
359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<void>::value);
360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<string>::value);
361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_pod<pair<int, int> >::value));
362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<A>::value);
363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<B>::value);
364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<C>::value);
365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<const string>::value);
366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<volatile A>::value);
367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(is_pod<const volatile B>::value);
368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialConstructor) {
371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that arithmetic types and pointers have trivial constructors.
372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<bool>::value);
373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<char>::value);
374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<unsigned char>::value);
375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<signed char>::value);
376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<wchar_t>::value);
377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<int>::value);
378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<unsigned int>::value);
379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<short>::value);
380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<unsigned short>::value);
381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<long>::value);
382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<unsigned long>::value);
383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<float>::value);
384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<double>::value);
385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<long double>::value);
386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<string*>::value);
387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<A*>::value);
388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<const B*>::value);
389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<C**>::value);
390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs and arrays of such types have trivial
392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // constructors.
393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  typedef int int10[10];
394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((has_trivial_constructor<pair<int, char*> >::value));
395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<int10>::value);
396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs of types without trivial constructors
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // are not marked as trivial.
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_constructor<pair<int, string> >::value));
400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_constructor<pair<string, int> >::value));
401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that types without trivial constructors are
403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // correctly marked as such.
404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_constructor<string>::value);
405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_constructor<vector<int> >::value);
406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that E, which we have declared to have a trivial
408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // constructor, is correctly marked as such.
409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_constructor<E>::value);
410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialCopy) {
413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that arithmetic types and pointers have trivial copy
414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // constructors.
415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<bool>::value);
416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<char>::value);
417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<unsigned char>::value);
418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<signed char>::value);
419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<wchar_t>::value);
420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<int>::value);
421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<unsigned int>::value);
422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<short>::value);
423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<unsigned short>::value);
424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<long>::value);
425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<unsigned long>::value);
426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<float>::value);
427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<double>::value);
428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<long double>::value);
429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<string*>::value);
430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<A*>::value);
431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<const B*>::value);
432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<C**>::value);
433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs and arrays of such types have trivial
435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // copy constructors.
436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  typedef int int10[10];
437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((has_trivial_copy<pair<int, char*> >::value));
438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<int10>::value);
439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs of types without trivial copy constructors
441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // are not marked as trivial.
442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_copy<pair<int, string> >::value));
443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_copy<pair<string, int> >::value));
444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that types without trivial copy constructors are
446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // correctly marked as such.
447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_copy<string>::value);
448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_copy<vector<int> >::value);
449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that C, which we have declared to have a trivial
451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // copy constructor, is correctly marked as such.
452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_copy<C>::value);
453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialAssign) {
456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that arithmetic types and pointers have trivial assignment
457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // operators.
458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<bool>::value);
459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<char>::value);
460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<unsigned char>::value);
461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<signed char>::value);
462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<wchar_t>::value);
463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<int>::value);
464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<unsigned int>::value);
465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<short>::value);
466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<unsigned short>::value);
467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<long>::value);
468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<unsigned long>::value);
469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<float>::value);
470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<double>::value);
471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<long double>::value);
472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<string*>::value);
473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<A*>::value);
474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<const B*>::value);
475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<C**>::value);
476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs and arrays of such types have trivial
478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // assignment operators.
479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  typedef int int10[10];
480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((has_trivial_assign<pair<int, char*> >::value));
481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<int10>::value);
482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs of types without trivial assignment operators
484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // are not marked as trivial.
485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_assign<pair<int, string> >::value));
486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_assign<pair<string, int> >::value));
487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that types without trivial assignment operators are
489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // correctly marked as such.
490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_assign<string>::value);
491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_assign<vector<int> >::value);
492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that D, which we have declared to have a trivial
494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // assignment operator, is correctly marked as such.
495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_assign<D>::value);
496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestHasTrivialDestructor) {
499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that arithmetic types and pointers have trivial destructors.
500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<bool>::value);
501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<char>::value);
502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<unsigned char>::value);
503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<signed char>::value);
504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<wchar_t>::value);
505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<int>::value);
506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<unsigned int>::value);
507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<short>::value);
508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<unsigned short>::value);
509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<long>::value);
510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<unsigned long>::value);
511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<float>::value);
512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<double>::value);
513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<long double>::value);
514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<string*>::value);
515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<A*>::value);
516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<const B*>::value);
517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<C**>::value);
518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs and arrays of such types have trivial
520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // destructors.
521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  typedef int int10[10];
522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((has_trivial_destructor<pair<int, char*> >::value));
523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<int10>::value);
524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that pairs of types without trivial destructors
526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // are not marked as trivial.
527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_destructor<pair<int, string> >::value));
528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((has_trivial_destructor<pair<string, int> >::value));
529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that types without trivial destructors are
531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // correctly marked as such.
532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_destructor<string>::value);
533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE(has_trivial_destructor<vector<int> >::value);
534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Verify that F, which we have declared to have a trivial
536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // destructor, is correctly marked as such.
537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE(has_trivial_destructor<F>::value);
538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Tests remove_pointer.
541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemovePointer) {
542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int>::type);
543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int*>::type);
544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const int, remove_pointer<const int*>::type);
545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int* const>::type);
546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_pointer<int* volatile>::type);
547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveConst) {
550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_const<int>::type);
551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_const<const int>::type);
552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int *, remove_const<int * const>::type);
553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TR1 examples.
554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const int *, remove_const<const int *>::type);
555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(volatile int,
556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          remove_const<const volatile int>::type);
557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveVolatile) {
560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_volatile<int>::type);
561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_volatile<volatile int>::type);
562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int *, remove_volatile<int * volatile>::type);
563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TR1 examples.
564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(volatile int *,
565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          remove_volatile<volatile int *>::type);
566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const int,
567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          remove_volatile<const volatile int>::type);
568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveCV) {
571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_cv<int>::type);
572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_cv<volatile int>::type);
573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_cv<const int>::type);
574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int *, remove_cv<int * const volatile>::type);
575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TR1 examples.
576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const volatile int *,
577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          remove_cv<const volatile int *>::type);
578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int,
579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          remove_cv<const volatile int>::type);
580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestRemoveReference) {
583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_reference<int>::type);
584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int, remove_reference<int&>::type);
585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(const int, remove_reference<const int&>::type);
586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  COMPILE_ASSERT_TYPES_EQ(int*, remove_reference<int * &>::type);
587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestIsSame) {
590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_same<int32, int32>::value));
591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<int32, int64>::value));
592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<int64, int32>::value));
593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<int, const int>::value));
594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_same<void, void>::value));
596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<void, int>::value));
597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<int, void>::value));
598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_same<int*, int*>::value));
600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_same<void*, void*>::value));
601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<int*, void*>::value));
602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<void*, int*>::value));
603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<void*, const void*>::value));
604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<void*, void* const>::value));
605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_same<Base*, Base*>::value));
607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_same<Derived*, Derived*>::value));
608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<Base*, Derived*>::value));
609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_same<Derived*, Base*>::value));
610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(TypeTraitsTest, TestConvertible) {
613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#if !(defined(__GNUC__) && __GNUC__ <= 3)
614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_convertible<int, int>::value));
615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_convertible<int, long>::value));
616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_convertible<long, int>::value));
617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_convertible<int*, void*>::value));
619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_convertible<void*, int*>::value));
620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_convertible<Derived*, Base*>::value));
622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_convertible<Base*, Derived*>::value));
623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_TRUE((is_convertible<Derived*, const Base*>::value));
624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  EXPECT_FALSE((is_convertible<const Derived*, Base*>::value));
625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif
626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // anonymous namespace
629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace internal
630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace protobuf
631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace google
632