aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-04-11 18:00:06 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-04-11 18:00:06 -0400
commitb24290fb5bfba313dc7143aa29a7b161fd501997 (patch)
treedd92eb9594d145c9a1cbd548aadb98292d461fc5
parent1e6d1da02d97cb863bd000c90d0309ba8f630955 (diff)
downloadgcc-b24290fb5bfba313dc7143aa29a7b161fd501997.zip
gcc-b24290fb5bfba313dc7143aa29a7b161fd501997.tar.gz
gcc-b24290fb5bfba313dc7143aa29a7b161fd501997.tar.bz2
PR c++/48457, Core 1238
PR c++/48457, Core 1238 * call.c (reference_binding): Allow rvalue reference to bind to function lvalue. * tree.c (lvalue_kind): Functions are always lvalues. From-SVN: r172282
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/call.c4
-rw-r--r--gcc/cp/tree.c4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/rv-func.C22
-rw-r--r--libstdc++-v3/ChangeLog4
-rw-r--r--libstdc++-v3/testsuite/20_util/is_convertible/value.cc2
7 files changed, 44 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1b8f873..10400516 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2011-04-11 Jason Merrill <jason@redhat.com>
+
+ PR c++/48457, Core 1238
+ * call.c (reference_binding): Allow rvalue reference to bind to
+ function lvalue.
+ * tree.c (lvalue_kind): Functions are always lvalues.
+
2011-04-07 Jason Merrill <jason@redhat.com>
PR c++/48500
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 096fbbc..4d03646 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -1521,8 +1521,10 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
actually occurs. */
conv->need_temporary_p = true;
- /* Don't allow binding of lvalues to rvalue references. */
+ /* Don't allow binding of lvalues (other than function lvalues) to
+ rvalue references. */
if (is_lvalue && TYPE_REF_IS_RVALUE (rto)
+ && TREE_CODE (to) != FUNCTION_TYPE
&& !(flags & LOOKUP_PREFER_RVALUE))
conv->bad_p = true;
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 3594ae4..d6b6197 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -73,7 +73,9 @@ lvalue_kind (const_tree ref)
if (TYPE_REF_IS_RVALUE (TREE_TYPE (ref))
&& TREE_CODE (ref) != PARM_DECL
&& TREE_CODE (ref) != VAR_DECL
- && TREE_CODE (ref) != COMPONENT_REF)
+ && TREE_CODE (ref) != COMPONENT_REF
+ /* Functions are always lvalues. */
+ && TREE_CODE (TREE_TYPE (TREE_TYPE (ref))) != FUNCTION_TYPE)
return clk_rvalueref;
/* lvalue references and named rvalue references are lvalues. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dee6793..3812fef 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-04-11 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/rv-func.C: New.
+
2011-04-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* gcc.dg/torture/pr47917.c: Define _ISO_C_SOURCE=19990L for
diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-func.C b/gcc/testsuite/g++.dg/cpp0x/rv-func.C
new file mode 100644
index 0000000..db14296
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/rv-func.C
@@ -0,0 +1,22 @@
+// PR c++/48457, Core 1238
+// { dg-options -std=c++0x }
+
+template<class T>
+T&& create();
+
+template<class T, class Arg>
+void test() {
+ T t(create<Arg>());
+ (void) t;
+}
+
+void f (void (&)());
+void f (void (&&)());
+
+int main() {
+ test<void(&)(), void()>();
+ test<void(&&)(), void()>();
+ // This call should choose the lvalue reference overload.
+ // { dg-final { scan-assembler-not "_Z1fOFvvE" } }
+ f(create<void()>());
+}
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c4ed61f..5768ea6 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,7 @@
+2011-04-08 Jason Merrill <jason@redhat.com>
+
+ * testsuite/20_util/is_convertible/value.cc: Adjust.
+
2011-04-11 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/25_algorithms/inplace_merge/moveable.cc: Actually run
diff --git a/libstdc++-v3/testsuite/20_util/is_convertible/value.cc b/libstdc++-v3/testsuite/20_util/is_convertible/value.cc
index f6282a9..fc6007a 100644
--- a/libstdc++-v3/testsuite/20_util/is_convertible/value.cc
+++ b/libstdc++-v3/testsuite/20_util/is_convertible/value.cc
@@ -93,7 +93,7 @@ void test01()
const volatile int&>(false)) );
VERIFY( (test_relationship<is_convertible, volatile int,
volatile int&>(false)) );
- VERIFY( (test_relationship<is_convertible, int(int), int(&)(int)>(false)) );
+ VERIFY( (test_relationship<is_convertible, int(int), int(&)(int)>(true)) );
VERIFY( (test_relationship<is_convertible, int&, ExplicitClass>(false)) );
VERIFY( (test_relationship<is_convertible, void*, ExplicitClass>(false)) );