diff options
author | Jason Merrill <jason@redhat.com> | 2011-04-11 18:00:06 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-04-11 18:00:06 -0400 |
commit | b24290fb5bfba313dc7143aa29a7b161fd501997 (patch) | |
tree | dd92eb9594d145c9a1cbd548aadb98292d461fc5 | |
parent | 1e6d1da02d97cb863bd000c90d0309ba8f630955 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/call.c | 4 | ||||
-rw-r--r-- | gcc/cp/tree.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/rv-func.C | 22 | ||||
-rw-r--r-- | libstdc++-v3/ChangeLog | 4 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/is_convertible/value.cc | 2 |
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)) ); |