diff mbox

[C++14] Implement N3657: heterogeneous lookup in associative containers.

Message ID 20150126111903.GX3360@redhat.com
State New
Headers show

Commit Message

Jonathan Wakely Jan. 26, 2015, 11:19 a.m. UTC
On 24/01/15 22:46 +0000, Jonathan Wakely wrote:
>On 24/01/15 23:03 +0100, François Dumont wrote:
>>types. I am also surprised that it is not using enable_if, IMHO it 
>>makes the code clearer.
>
>It doesn't work though.
>
>>@@ -1155,9 +1150,8 @@
>>	  return _S_iter(__y);
>>	}
>>
>>-      template<typename _Kt,
>>-	       typename _Req = typename __is_transparent<_Compare, _Kt>::type>
>>-	iterator
>>+      template<typename _Kt>
>>+	enable_if_t<__has_is_transparent<_Compare>::value, iterator>
>>	_M_find_tr(const _Kt& __k)
>
>This doesn't work.
>
>Consider:
>
> #include <set>
>
> struct I
> {
>   int i;
>   operator int() const { return i; }
> };
>
> int main()
> {
>   std::set<int> s;
>   I i = { };
>   s.find(i);
> }
>
>(I will add something like this to the testsuite.)

Done with this patch, tested x86_64-linux and committed to trunk.
diff mbox

Patch

commit ba331e783334feb20f30f1b92a93d8c9d8f895be
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Mon Jan 26 10:43:16 2015 +0000

    	* testsuite/23_containers/set/operations/2.cc: Add test for
    	non-transparent comparison function.

diff --git a/libstdc++-v3/testsuite/23_containers/set/operations/2.cc b/libstdc++-v3/testsuite/23_containers/set/operations/2.cc
index 752bc7d..84ddd1f 100644
--- a/libstdc++-v3/testsuite/23_containers/set/operations/2.cc
+++ b/libstdc++-v3/testsuite/23_containers/set/operations/2.cc
@@ -128,6 +128,22 @@  test05()
   VERIFY( Cmp::count == 0);
 }
 
+void
+test06()
+{
+  // https://gcc.gnu.org/ml/libstdc++/2015-01/msg00176.html
+  // Verify the new function template overloads do not cause problems
+  // when the comparison function is not transparent.
+  struct I
+  {
+    int i;
+    operator int() const { return i; }
+  };
+
+  std::set<int> s;
+  I i = { };
+  s.find(i);
+}
 
 int
 main()
@@ -137,4 +153,5 @@  main()
   test03();
   test04();
   test05();
+  test06();
 }