#include <memory>
#include <testsuite_tr1.h>
+#include <type_traits>
using namespace __gnu_test;
+template<template<class> class SmartPtr>
void
test01()
{
- std::shared_ptr<ClassType> ptr;
- std::shared_ptr<const ClassType> ptr2 = ptr;
+ SmartPtr<ClassType> ptr;
+ SmartPtr<const ClassType> ptr2 = ptr;
#if __cpp_lib_shared_ptr_arrays >= 201611L
- std::shared_ptr<ClassType[10]> ptr_array;
- std::shared_ptr<ClassType[]> ptr_array2 = ptr_array;
- std::shared_ptr<ClassType const []> ptr_array3 = ptr_array;
+ SmartPtr<ClassType[10]> ptr_array;
+ SmartPtr<ClassType[]> ptr_array2 = ptr_array;
+ SmartPtr<ClassType const []> ptr_array3 = ptr_array;
#endif
}
+template<template<class> class SmartPtr>
void
test02()
{
- std::shared_ptr<IncompleteClass> ptr;
- std::shared_ptr<const IncompleteClass> ptr2 = ptr;
+ SmartPtr<IncompleteClass> ptr;
+ SmartPtr<const IncompleteClass> ptr2 = ptr;
#if __cpp_lib_shared_ptr_arrays >= 201611L
- std::shared_ptr<IncompleteClass[10]> ptr_array;
- std::shared_ptr<IncompleteClass[]> ptr_array2 = ptr_array;
- std::shared_ptr<IncompleteClass const []> ptr_array3 = ptr_array;
+ SmartPtr<IncompleteClass[10]> ptr_array;
+ SmartPtr<IncompleteClass[]> ptr_array2 = ptr_array;
+ SmartPtr<IncompleteClass const []> ptr_array3 = ptr_array;
#endif
}
+
+template<template<class> class SmartPtr>
+void
+test03()
+{
+ static_assert( std::is_convertible<SmartPtr<int>, SmartPtr<const int>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const int>, SmartPtr<int>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType>, SmartPtr<const ClassType>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const ClassType>, SmartPtr<ClassType>>::value);
+ static_assert( std::is_convertible<SmartPtr<IncompleteClass>, SmartPtr<const IncompleteClass>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const IncompleteClass>, SmartPtr<IncompleteClass>>::value);
+ static_assert( std::is_convertible<SmartPtr<void>, SmartPtr<const void>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const void>, SmartPtr<void>>::value);
+
+ static_assert( std::is_convertible<SmartPtr<int>, SmartPtr<void>>::value);
+ static_assert(!std::is_convertible<SmartPtr<void>, SmartPtr<int>>::value);
+ static_assert( std::is_convertible<SmartPtr<int>, SmartPtr<const void>>::value);
+ static_assert( std::is_convertible<SmartPtr<const int>, SmartPtr<const void>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const int>, SmartPtr<void>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const void>, SmartPtr<const int>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType>, SmartPtr<void>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType>, SmartPtr<const void>>::value);
+
+ static_assert(!std::is_convertible<SmartPtr<int*>, SmartPtr<const int*>>::value);
+ static_assert( std::is_convertible<SmartPtr<int*>, SmartPtr<const int* const>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const int*>, SmartPtr<int*>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const int* const>, SmartPtr<int*>>::value);
+
+ static_assert(!std::is_convertible<SmartPtr<ClassType*>, SmartPtr<const ClassType*>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType*>, SmartPtr<const ClassType* const>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const ClassType*>, SmartPtr<ClassType*>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const ClassType* const>, SmartPtr<ClassType*>>::value);
+
+ static_assert(!std::is_convertible<SmartPtr<void*>, SmartPtr<const void*>>::value);
+ static_assert( std::is_convertible<SmartPtr<void*>, SmartPtr<const void* const>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const void*>, SmartPtr<void*>>::value);
+ static_assert(!std::is_convertible<SmartPtr<const void* const>, SmartPtr<void*>>::value);
+
+#if __cpp_lib_shared_ptr_arrays >= 201611L
+ static_assert( std::is_convertible<SmartPtr<int[10]>, SmartPtr<int[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<int[]>, SmartPtr<int[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<int[10]>, SmartPtr<int const[]>>::value);
+ static_assert( std::is_convertible<SmartPtr<int[10]>, SmartPtr<int const[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<int[]>, SmartPtr<int const[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<int const[]>, SmartPtr<int[]>>::value);
+ static_assert( std::is_convertible<SmartPtr<int const[10]>, SmartPtr<int const[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<int const[]>, SmartPtr<int const[10]>>::value);
+
+ static_assert( std::is_convertible<SmartPtr<ClassType[10]>, SmartPtr<ClassType[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<ClassType[]>, SmartPtr<ClassType[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType[10]>, SmartPtr<ClassType const[]>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType[10]>, SmartPtr<ClassType const[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType[]>, SmartPtr<ClassType const[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<ClassType const[]>, SmartPtr<ClassType[]>>::value);
+ static_assert( std::is_convertible<SmartPtr<ClassType const[10]>, SmartPtr<ClassType const[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<ClassType const[]>, SmartPtr<ClassType const[10]>>::value);
+
+ static_assert( std::is_convertible<SmartPtr<IncompleteClass[10]>, SmartPtr<IncompleteClass[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<IncompleteClass[]>, SmartPtr<IncompleteClass[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<IncompleteClass[10]>, SmartPtr<IncompleteClass const[]>>::value);
+ static_assert( std::is_convertible<SmartPtr<IncompleteClass[10]>, SmartPtr<IncompleteClass const[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<IncompleteClass[]>, SmartPtr<IncompleteClass const[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<IncompleteClass const[]>, SmartPtr<IncompleteClass[]>>::value);
+ static_assert( std::is_convertible<SmartPtr<IncompleteClass const[10]>, SmartPtr<IncompleteClass const[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<IncompleteClass const[]>, SmartPtr<IncompleteClass const[10]>>::value);
+
+ static_assert( std::is_convertible<SmartPtr<int*[10]>, SmartPtr<int*[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<int*[]>, SmartPtr<int*[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<int*[10]>, SmartPtr<int* const[10]>>::value);
+ static_assert( std::is_convertible<SmartPtr<int*[10]>, SmartPtr<int* const[]>>::value);
+
+ static_assert(!std::is_convertible<SmartPtr<int*[]>, SmartPtr<void*[]>>::value);
+ static_assert(!std::is_convertible<SmartPtr<int*[]>, SmartPtr<void const *[]>>::value);
+#endif
+}
+
+int
+main()
+{
+ test01<std::shared_ptr>();
+ test01<std::weak_ptr>();
+
+ test02<std::shared_ptr>();
+ test02<std::weak_ptr>();
+
+ test03<std::shared_ptr>();
+ test03<std::weak_ptr>();
+}