Reorder conditions in uses-allocator construction helper
authorJonathan Wakely <jwakely@redhat.com>
Tue, 24 Jul 2018 13:03:25 +0000 (14:03 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 24 Jul 2018 13:03:25 +0000 (14:03 +0100)
The erased_type condition is only true for code using the Library
Fundamentals TS, so assume it's less common and only check it after
checking for convertibility.

This does mean for types using erased_type the more expensive
convertibility check is done first, but such types are rare.

* include/bits/uses_allocator.h (__is_erased_or_convertible): Reorder
conditions. Add comments.
* testsuite/20_util/uses_allocator/69293_neg.cc: Adjust dg-error line.
* testsuite/20_util/uses_allocator/cons_neg.cc: Likewise.
* testsuite/20_util/scoped_allocator/69293_neg.cc: Likewise.

From-SVN: r262945

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/uses_allocator.h
libstdc++-v3/testsuite/20_util/scoped_allocator/69293_neg.cc
libstdc++-v3/testsuite/20_util/uses_allocator/69293_neg.cc
libstdc++-v3/testsuite/20_util/uses_allocator/cons_neg.cc

index ede29a49749771140e1680edddb5fdf132d8ff6f..dc8dfdac7fddf1d30bf5208948700d2f7c395fd3 100644 (file)
@@ -1,5 +1,15 @@
 2018-07-24  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/bits/uses_allocator.h (__is_erased_or_convertible): Reorder
+       conditions. Add comments.
+       * testsuite/20_util/uses_allocator/69293_neg.cc: Adjust dg-error line.
+       * testsuite/20_util/uses_allocator/cons_neg.cc: Likewise.
+       * testsuite/20_util/scoped_allocator/69293_neg.cc: Likewise.
+
+       * include/bits/uses_allocator.h (__is_erased_or_convertible): Remove.
+       (__uses_allocator_helper): Check conditions directly instead of
+       using __is_erased_or_convertible.
+
        * include/experimental/memory_resource: Adjust comments and
        whitespace.
        (__resource_adaptor_imp): Add second template parameter for type of
index 820a2a598942d7855f9fa54e295a499becb21e43..3ef2830bebc1b336476665aebc3d89459555b629 100644 (file)
@@ -36,11 +36,15 @@ namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
+  // This is used for std::experimental::erased_type from Library Fundamentals.
   struct __erased_type { };
 
+  // This also supports the "type-erased allocator" protocol from the
+  // Library Fundamentals TS, where allocator_type is erased_type.
+  // The second condition will always be false for types not using the TS.
   template<typename _Alloc, typename _Tp>
     using __is_erased_or_convertible
-      = __or_<is_same<_Tp, __erased_type>, is_convertible<_Alloc, _Tp>>;
+      = __or_<is_convertible<_Alloc, _Tp>, is_same<_Tp, __erased_type>>;
 
   /// [allocator.tag]
   struct allocator_arg_t { explicit allocator_arg_t() = default; };
index 621ff47c7a363b5b5a1b926610a3dca7089a4175..168079fd5f936fea0a1957d5716cc6e3bab7cda1 100644 (file)
@@ -46,5 +46,5 @@ test01()
   scoped_alloc sa;
   auto p = sa.allocate(1);
   sa.construct(p);  // this is required to be ill-formed
-  // { dg-error "static assertion failed" "" { target *-*-* } 90 }
+  // { dg-error "static assertion failed" "" { target *-*-* } 94 }
 }
index 348ed41a7bce382800dc7afb5925c02839815e14..eaf432491c673cd3ab36529fb9df383b319285a7 100644 (file)
@@ -44,5 +44,5 @@ test01()
 {
   alloc_type a;
   std::tuple<X> t(std::allocator_arg, a); // this is required to be ill-formed
-  // { dg-error "static assertion failed" "" { target *-*-* } 90 }
+  // { dg-error "static assertion failed" "" { target *-*-* } 94 }
 }
index 8894e389cec7090cce399c9b52d7aa62afd52228..bb8c38d1e49ae88a122ee8a7e3b608170aa6a8d2 100644 (file)
@@ -43,4 +43,4 @@ void test01()
 
   tuple<Type> t(allocator_arg, a, 1);
 }
-// { dg-error "static assertion failed" "" { target *-*-* } 90 }
+// { dg-error "static assertion failed" "" { target *-*-* } 94 }