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