2012-12-06 Jason Merrill <jason@redhat.com>
+ PR c++/54947
+ * parser.c (cp_parser_initializer_list): Don't require an
+ expression in [] to be constant until we know it's a C99
+ designator.
+
PR c++/55015
PR c++/53821
* semantics.c (maybe_add_lambda_conv_op): Revert earlier change.
/* In C++11, [ could start a lambda-introducer. */
cp_parser_parse_tentatively (parser);
cp_lexer_consume_token (parser->lexer);
- designator = cp_parser_constant_expression (parser, false, NULL);
+ bool non_const = false;
+ designator = cp_parser_constant_expression (parser, true, &non_const);
cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
cp_parser_require (parser, CPP_EQ, RT_EQ);
if (!cp_parser_parse_definitely (parser))
designator = NULL_TREE;
+ else if (non_const)
+ require_potential_rvalue_constant_expression (designator);
}
else
designator = NULL_TREE;
--- /dev/null
+// PR c++/54947
+// { dg-options -std=gnu++11 }
+
+struct X
+{
+ template<typename L>
+ X(L)
+ { }
+};
+
+template<typename A>
+ void
+ test()
+ {
+ int i = 0;
+
+ A a_ok_1( [=] { return i; } ); // OK
+ A a_ok_2( [i] { return i; } ); // OK
+
+ A a_err_1{ [i] { return i; } }; // error
+ A a_err_2{ [=] { return i; } }; // error
+ }
+
+int main()
+{
+ test<X>();
+}