summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/testsuite/20_util/function_objects
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2012-11-28 01:42:25 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2012-11-28 01:42:25 +0000
commitef723edc44deec25ab1711c73d4ae805fdb67b22 (patch)
tree85df2595035418bf7e5213ee9c7120e2805366ba /libstdc++-v3/testsuite/20_util/function_objects
parent70e63130beb949cae93507b773acd8c0056e3914 (diff)
downloadppe42-gcc-ef723edc44deec25ab1711c73d4ae805fdb67b22.tar.gz
ppe42-gcc-ef723edc44deec25ab1711c73d4ae805fdb67b22.zip
* include/std/functional (_Mem_fn): Constrain function call operators
to avoid ambiguities. Use perfect forwarding. * testsuite/20_util/function_objects/mem_fn/55463.cc: Additional tests. * testsuite/20_util/function_objects/mem_fn/forward.cc: New. * testsuite/20_util/bind/ref_neg.cc: Adjust dg-error line numbers. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193879 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/testsuite/20_util/function_objects')
-rw-r--r--libstdc++-v3/testsuite/20_util/function_objects/mem_fn/55463.cc42
-rw-r--r--libstdc++-v3/testsuite/20_util/function_objects/mem_fn/forward.cc62
2 files changed, 98 insertions, 6 deletions
diff --git a/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/55463.cc b/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/55463.cc
index 5adce1b7cca..ac11852bc0b 100644
--- a/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/55463.cc
+++ b/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/55463.cc
@@ -32,7 +32,12 @@ struct X
int data;
};
+struct Y : X { };
+
using CX = const X;
+using CY = const Y;
+
+using X_ptr = X*;
struct smart_ptr
{
@@ -41,38 +46,63 @@ struct smart_ptr
std::reference_wrapper<X> ref();
std::reference_wrapper<const X> cref();
+std::reference_wrapper<Y> yref();
void test01()
{
int& i1 = std::mem_fn( &X::func )( X() );
- int& i2 = std::mem_fn( &X::func )( smart_ptr() );
+ int& i2 = std::mem_fn( &X::func )( Y() );
int& i3 = std::mem_fn( &X::func )( ref() );
+ int& i4 = std::mem_fn( &X::func )( yref() );
+ int& i5 = std::mem_fn( &X::func )( X_ptr() );
+ int& i6 = std::mem_fn( &X::func )( smart_ptr() );
char& c1 = std::mem_fn( &X::func_c )( X() );
char& c2 = std::mem_fn( &X::func_c )( CX() );
- char& c3 = std::mem_fn( &X::func_c )( smart_ptr() );
+ char& c3 = std::mem_fn( &X::func_c )( Y() );
char& c4 = std::mem_fn( &X::func_c )( ref() );
char& c5 = std::mem_fn( &X::func_c )( cref() );
+ char& c6 = std::mem_fn( &X::func_c )( yref() );
+ char& c7 = std::mem_fn( &X::func_c )( X_ptr() );
+ char& c8 = std::mem_fn( &X::func_c )( smart_ptr() );
short& s1 = std::mem_fn( &X::func_v )( X() );
- short& s2 = std::mem_fn( &X::func_v )( smart_ptr() );
+ short& s2 = std::mem_fn( &X::func_v )( Y() );
short& s3 = std::mem_fn( &X::func_v )( ref() );
+ short& s4 = std::mem_fn( &X::func_v )( yref() );
+ short& s5 = std::mem_fn( &X::func_v )( X_ptr() );
+ short& s6 = std::mem_fn( &X::func_v )( smart_ptr() );
double& d1 = std::mem_fn( &X::func_cv )( X() );
double& d2 = std::mem_fn( &X::func_cv )( CX() );
- double& d3 = std::mem_fn( &X::func_cv )( smart_ptr() );
+ double& d3 = std::mem_fn( &X::func_cv )( Y() );
double& d4 = std::mem_fn( &X::func_cv )( ref() );
double& d5 = std::mem_fn( &X::func_cv )( cref() );
+ double& d6 = std::mem_fn( &X::func_cv )( yref() );
+ double& d7 = std::mem_fn( &X::func_cv )( X_ptr() );
+ double& d8 = std::mem_fn( &X::func_cv )( smart_ptr() );
// [expr.mptr.oper]
// The result of a .* expression whose second operand is a pointer to a
// data member is of the same value category (3.10) as its first operand.
int&& rval = std::mem_fn( &X::data )( X() );
const int&& crval = std::mem_fn( &X::data )( CX() );
-
- int& sval = std::mem_fn( &X::data )( smart_ptr() );
+ int&& yrval = std::mem_fn( &X::data )( Y() );
+ const int&& ycrval = std::mem_fn( &X::data )( CY() );
int& val = std::mem_fn( &X::data )( ref() );
const int& cval = std::mem_fn( &X::data )( cref() );
+ int& yval = std::mem_fn( &X::data )( yref() );
+
+ int& pval = std::mem_fn( &X::data )( X_ptr() );
+ int& sval = std::mem_fn( &X::data )( smart_ptr() );
}
+void test02()
+{
+ std::reference_wrapper<X> r = ref();
+ X& x1 = std::mem_fn( &std::reference_wrapper<X>::get )( r );
+ const std::reference_wrapper<X> cr = ref();
+ const X& x3 = std::mem_fn( &std::reference_wrapper<X>::get )( cr );
+ X& x2 = std::mem_fn( &std::reference_wrapper<X>::get )( ref() );
+}
diff --git a/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/forward.cc b/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/forward.cc
new file mode 100644
index 00000000000..a231bf6858c
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/function_objects/mem_fn/forward.cc
@@ -0,0 +1,62 @@
+// { dg-options "-std=gnu++11" }
+
+// Copyright (C) 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <functional>
+#include <testsuite_hooks.h>
+
+struct Counter
+{
+ Counter() = default;
+ Counter(const Counter&) { ++count; }
+
+ static int count;
+};
+
+int Counter::count = 0;
+
+struct X
+{
+ int func(Counter, int i) { return i; }
+ char func_c(Counter, char c) const { return c; }
+ short func_v(Counter, short s) volatile { return s; }
+ double func_cv(Counter, double d) const volatile { return d; }
+};
+
+void test01()
+{
+ Counter c;
+ X x;
+
+ std::mem_fn( &X::func )( x, c, 0 );
+ VERIFY( Counter::count == 1 );
+
+ std::mem_fn( &X::func_c )( x, c, 0 );
+ VERIFY( Counter::count == 2 );
+
+ std::mem_fn( &X::func_v )( x, c, 0 );
+ VERIFY( Counter::count == 3 );
+
+ std::mem_fn( &X::func_cv )( x, c, 0 );
+ VERIFY( Counter::count == 4 );
+}
+
+int main()
+{
+ test01();
+}
OpenPOWER on IntegriCloud