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:
parent
1e6d1da02d
commit
b24290fb5b
7 changed files with 44 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
22
gcc/testsuite/g++.dg/cpp0x/rv-func.C
Normal file
22
gcc/testsuite/g++.dg/cpp0x/rv-func.C
Normal 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()>());
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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)) );
|
||||
|
|
Loading…
Add table
Reference in a new issue