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
This commit is contained in:
Jason Merrill 2011-04-11 18:00:06 -04:00 committed by Jason Merrill
parent 1e6d1da02d
commit b24290fb5b
7 changed files with 44 additions and 3 deletions

View File

@ -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

View File

@ -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;

View File

@ -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. */

View File

@ -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

View File

@ -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()>());
}

View File

@ -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

View File

@ -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)) );