* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@149873
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
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;
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;
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",
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");
+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.
--- /dev/null
+// 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
// GROUPS passed initialization
struct CharList { int i; };
-const CharList& terminals = { 1 };// { dg-error "" } .*
+const CharList& terminals = { 1 }; // { dg-error "initializer lists" } c++0x