Don't use std::is_trivially_destructable.

It returns false for incomplete types (or is undefined prior to C++14),
so other instantiations can get confused. Instead, require an explicit
kAllowUniquePtr toggle.

I tried using sizeof(T) to SFINAE-detect an incomplete type but ran into
MSVC issues, I think
https://connect.microsoft.com/VisualStudio/feedback/details/820390/vc-sizeof-doesnt-work-as-expected-in-sfinae-context
Though it seems this also may cause ODR violations if different
compilation units disagree on whether a type is complete. This is all a
mess, so just do the boring thing.

Bug: 132
Change-Id: I6f2d47499f16e75f62629c76f43a5329e91c6daf
Reviewed-on: https://boringssl-review.googlesource.com/18464
Reviewed-by: Steven Valdez <svaldez@google.com>
Commit-Queue: Steven Valdez <svaldez@google.com>
diff --git a/ssl/internal.h b/ssl/internal.h
index 8736720..bd1d112 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -201,13 +201,11 @@
   }
 }
 
-/* Register all types with non-trivial destructors with |UniquePtr|. Types with
- * trivial destructors may be C structs which require a |BORINGSSL_MAKE_DELETER|
- * registration. */
+/* All types with kAllowUniquePtr set may be used with UniquePtr. Other types
+ * may be C structs which require a |BORINGSSL_MAKE_DELETER| registration. */
 namespace internal {
 template <typename T>
-struct DeleterImpl<T, typename std::enable_if<
-                          !std::is_trivially_destructible<T>::value>::type> {
+struct DeleterImpl<T, typename std::enable_if<T::kAllowUniquePtr>::type> {
   static void Free(T *t) { Delete(t); }
 };
 }
@@ -223,7 +221,7 @@
 #define HAS_VIRTUAL_DESTRUCTOR
 #define PURE_VIRTUAL = 0
 #else
-/* HAS_VIRTUAL_DESTRUCTOR should be declared in any base class which defines a
+/* HAS_VIRTUAL_DESTRUCTOR should be declared in any base clas ~s which defines a
  * virtual destructor. This avoids a dependency on |_ZdlPv| and prevents the
  * class from being used with |delete|. */
 #define HAS_VIRTUAL_DESTRUCTOR \
@@ -470,6 +468,8 @@
  public:
   SSLAEADContext(uint16_t version, const SSL_CIPHER *cipher);
   ~SSLAEADContext();
+  static constexpr bool kAllowUniquePtr = true;
+
   SSLAEADContext(const SSLAEADContext &&) = delete;
   SSLAEADContext &operator=(const SSLAEADContext &&) = delete;
 
@@ -771,6 +771,7 @@
 class SSLKeyShare {
  public:
   virtual ~SSLKeyShare() {}
+  static constexpr bool kAllowUniquePtr = true;
   HAS_VIRTUAL_DESTRUCTOR
 
   /* Create returns a SSLKeyShare instance for use with group |group_id| or
@@ -1072,6 +1073,7 @@
 struct SSL_HANDSHAKE {
   explicit SSL_HANDSHAKE(SSL *ssl);
   ~SSL_HANDSHAKE();
+  static constexpr bool kAllowUniquePtr = true;
 
   /* ssl is a non-owning pointer to the parent |SSL| object. */
   SSL *ssl;