Commit bd1f11be by Jason Merrill Committed by Jason Merrill

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
parent d0b7964a
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> 2009-07-17 Richard Guenther <rguenther@suse.de>
PR c/40401 PR c/40401
......
...@@ -1221,7 +1221,21 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags) ...@@ -1221,7 +1221,21 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
lvalue_p = clk_ordinary; lvalue_p = clk_ordinary;
from = TREE_TYPE (from); 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); lvalue_p = real_lvalue_p (expr);
tfrom = from; tfrom = from;
...@@ -1363,8 +1377,9 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags) ...@@ -1363,8 +1377,9 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
if (!(flags & LOOKUP_COPY_PARM)) if (!(flags & LOOKUP_COPY_PARM))
flags |= LOOKUP_ONLYCONVERTING; flags |= LOOKUP_ONLYCONVERTING;
conv = implicit_conversion (to, from, expr, c_cast_p, if (!conv)
flags); conv = implicit_conversion (to, from, expr, c_cast_p,
flags);
if (!conv) if (!conv)
return NULL; return NULL;
...@@ -7541,6 +7556,7 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup) ...@@ -7541,6 +7556,7 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
if (!conv || conv->bad_p) if (!conv || conv->bad_p)
{ {
if (!(TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST) if (!(TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST)
&& !TYPE_REF_IS_RVALUE (type)
&& !real_lvalue_p (expr)) && !real_lvalue_p (expr))
error ("invalid initialization of non-const reference of " error ("invalid initialization of non-const reference of "
"type %qT from a temporary of type %qT", "type %qT from a temporary of type %qT",
......
...@@ -4370,13 +4370,6 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup) ...@@ -4370,13 +4370,6 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup)
return NULL_TREE; 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) if (TREE_CODE (init) == TREE_LIST)
init = build_x_compound_expr_from_list (init, "initializer"); init = build_x_compound_expr_from_list (init, "initializer");
......
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> 2009-07-21 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/vectorize8.c: New test. * gcc.target/i386/vectorize8.c: New test.
......
// 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 @@ ...@@ -2,4 +2,4 @@
// GROUPS passed initialization // GROUPS passed initialization
struct CharList { int i; }; struct CharList { int i; };
const CharList& terminals = { 1 };// { dg-error "" } .* const CharList& terminals = { 1 }; // { dg-error "initializer lists" } c++0x
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment