mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 05:10:25 +08:00
Core issue 934
Core issue 934 * call.c (reference_binding): Implement binding to { }. (initialize_reference): Binding temporary to non-const && is fine. * decl.c (grok_reference_init): Remove error for CONSTRUCTOR. From-SVN: r149873
This commit is contained in:
parent
d0b7964a48
commit
bd1f11bec9
@ -1,3 +1,10 @@
|
||||
2009-07-21 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Core issue 934
|
||||
* call.c (reference_binding): Implement binding to { }.
|
||||
(initialize_reference): Binding temporary to non-const && is fine.
|
||||
* decl.c (grok_reference_init): Remove error for CONSTRUCTOR.
|
||||
|
||||
2009-07-17 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR c/40401
|
||||
|
@ -1221,7 +1221,21 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
|
||||
lvalue_p = clk_ordinary;
|
||||
from = TREE_TYPE (from);
|
||||
}
|
||||
else if (expr)
|
||||
|
||||
if (expr && BRACE_ENCLOSED_INITIALIZER_P (expr))
|
||||
{
|
||||
maybe_warn_cpp0x ("extended initializer lists");
|
||||
conv = implicit_conversion (to, from, expr, c_cast_p,
|
||||
flags);
|
||||
if (!CLASS_TYPE_P (to)
|
||||
&& CONSTRUCTOR_NELTS (expr) == 1)
|
||||
{
|
||||
expr = CONSTRUCTOR_ELT (expr, 0)->value;
|
||||
from = TREE_TYPE (expr);
|
||||
}
|
||||
}
|
||||
|
||||
if (lvalue_p == clk_none && expr)
|
||||
lvalue_p = real_lvalue_p (expr);
|
||||
|
||||
tfrom = from;
|
||||
@ -1363,8 +1377,9 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
|
||||
if (!(flags & LOOKUP_COPY_PARM))
|
||||
flags |= LOOKUP_ONLYCONVERTING;
|
||||
|
||||
conv = implicit_conversion (to, from, expr, c_cast_p,
|
||||
flags);
|
||||
if (!conv)
|
||||
conv = implicit_conversion (to, from, expr, c_cast_p,
|
||||
flags);
|
||||
if (!conv)
|
||||
return NULL;
|
||||
|
||||
@ -7541,6 +7556,7 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
|
||||
if (!conv || conv->bad_p)
|
||||
{
|
||||
if (!(TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST)
|
||||
&& !TYPE_REF_IS_RVALUE (type)
|
||||
&& !real_lvalue_p (expr))
|
||||
error ("invalid initialization of non-const reference of "
|
||||
"type %qT from a temporary of type %qT",
|
||||
|
@ -4370,13 +4370,6 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup)
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
if (TREE_CODE (init) == CONSTRUCTOR)
|
||||
{
|
||||
error ("ISO C++ forbids use of initializer list to "
|
||||
"initialize reference %qD", decl);
|
||||
return NULL_TREE;
|
||||
}
|
||||
|
||||
if (TREE_CODE (init) == TREE_LIST)
|
||||
init = build_x_compound_expr_from_list (init, "initializer");
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2009-07-21 Jason Merrill <jason@redhat.com>
|
||||
|
||||
Core issue 934
|
||||
* g++.dg/cpp0x/initlist22.C: New.
|
||||
|
||||
2009-07-21 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* gcc.target/i386/vectorize8.c: New test.
|
||||
|
24
gcc/testsuite/g++.dg/cpp0x/initlist22.C
Normal file
24
gcc/testsuite/g++.dg/cpp0x/initlist22.C
Normal file
@ -0,0 +1,24 @@
|
||||
// Core issue 934
|
||||
// { dg-options "-std=c++0x" }
|
||||
|
||||
int i;
|
||||
|
||||
int& r1{ i }; // OK, direct binding
|
||||
int&& r2{ i }; // OK, direct binding
|
||||
|
||||
int& r3{ }; // { dg-error "" } reference to temporary
|
||||
int&& r4{ }; // OK, reference to temporary
|
||||
|
||||
struct A { int i; } a;
|
||||
|
||||
A& r5 { i }; // { dg-error "" } reference to temporary
|
||||
A&& r6 { i }; // OK, aggregate initialization of temporary
|
||||
A& r7 { a }; // { dg-error "" } invalid aggregate initializer for A
|
||||
A&& r8 { a }; // { dg-error "" } invalid aggregate initializer for A
|
||||
|
||||
struct B { B(int); int i; } b(0);
|
||||
|
||||
B& r9 { i }; // { dg-error "" } reference to temporary
|
||||
B&& r10 { i }; // OK, make temporary with B(int) constructor
|
||||
B& r11 { b }; // { dg-error "" } reference to temporary
|
||||
B&& r12 { b }; // OK, make temporary with copy constructor
|
@ -2,4 +2,4 @@
|
||||
// GROUPS passed initialization
|
||||
struct CharList { int i; };
|
||||
|
||||
const CharList& terminals = { 1 };// { dg-error "" } .*
|
||||
const CharList& terminals = { 1 }; // { dg-error "initializer lists" } c++0x
|
||||
|
Loading…
x
Reference in New Issue
Block a user