--- /dev/null
+#include <darwintest.h>
+#include <darwintest_utils.h>
+#include <stdio.h>
+#include <assert.h>
+#include <typeinfo>
+
+#if 0
+# define OSPTR_LOG T_LOG
+#elif 0
+# define OSPTR_LOG printf
+#else
+# define OSPTR_LOG(x...) do { } while(0)
+#endif
+
+T_GLOBAL_META(
+ T_META_NAMESPACE("osptr"),
+ T_META_CHECK_LEAKS(false),
+ T_META_RUN_CONCURRENTLY(true)
+ );
+
+class OSMetaClassBase
+{
+public:
+ virtual void
+ retain() const
+ {
+ }
+ virtual void
+ release() const
+ {
+ }
+ virtual void
+ taggedRetain(void *tag) const
+ {
+ }
+ virtual void
+ taggedRelease(void *tag) const
+ {
+ }
+
+ static void *type_id;
+};
+
+void *OSMetaClassBase::type_id;
+
+#define OSTypeAlloc(T) new T
+#define OSTypeID(T) T::type_id
+
+#include <libkern/c++/OSPtr.h>
+
+class Base : public OSMetaClassBase {
+public:
+ Base() : OSMetaClassBase()
+ {
+ }
+};
+
+class Derived : public Base {
+public:
+ Derived() : Base()
+ {
+ }
+};
+
+typedef OSPtr<Base> BasePtr;
+typedef OSPtr<Derived> DerivedPtr;
+
+T_DECL(dumb_osptr, "Dumb OSPtrs work")
+{
+ BasePtr x = nullptr;
+ T_ASSERT_EQ_PTR(x, nullptr, NULL);
+ T_ASSERT_TRUE(typeid(BasePtr) == typeid(Base *), NULL);
+ T_ASSERT_TRUE(typeid(DerivedPtr) == typeid(Derived *), NULL);
+
+ OSTaggedPtr<Base, Base> y = nullptr;
+ OSTaggedPtr<Derived, Base> z = nullptr;
+ T_ASSERT_EQ_PTR(y, nullptr, NULL);
+ T_ASSERT_TRUE(typeid(y) == typeid(Base *), NULL);
+ T_ASSERT_TRUE(typeid(z) == typeid(Derived *), NULL);
+}