Commit 1c97d579 by Paolo Carlini Committed by Paolo Carlini

re PR c++/82593 (Internal compiler error: in process_init_constructor_array, at cp/typeck2.c:1294)

/cp
2017-12-19  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/82593
	* decl.c (check_array_designated_initializer): Not static.
	* cp-tree.h (check_array_designated_initializer): Declare.
	* typeck2.c (process_init_constructor_array): Call the latter.
	* parser.c (cp_parser_initializer_list): Check the return value
	of require_potential_rvalue_constant_expression.

/testsuite
2017-12-19  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/82593
	* g++.dg/cpp0x/desig2.C: New.
	* g++.dg/cpp0x/desig3.C: Likewise.
	* g++.dg/cpp0x/desig4.C: Likewise.

From-SVN: r255845
parent 5837edca
2017-12-19 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/82593
* decl.c (check_array_designated_initializer): Not static.
* cp-tree.h (check_array_designated_initializer): Declare.
* typeck2.c (process_init_constructor_array): Call the latter.
* parser.c (cp_parser_initializer_list): Check the return value
of require_potential_rvalue_constant_expression.
2017-12-19 Martin Sebor <msebor@redhat.com> 2017-12-19 Martin Sebor <msebor@redhat.com>
PR c++/83394 PR c++/83394
......
...@@ -6212,6 +6212,8 @@ extern bool require_deduced_type (tree, tsubst_flags_t = tf_warning_or_error); ...@@ -6212,6 +6212,8 @@ extern bool require_deduced_type (tree, tsubst_flags_t = tf_warning_or_error);
extern tree finish_case_label (location_t, tree, tree); extern tree finish_case_label (location_t, tree, tree);
extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t); extern tree cxx_maybe_build_cleanup (tree, tsubst_flags_t);
extern bool check_array_designated_initializer (constructor_elt *,
unsigned HOST_WIDE_INT);
/* in decl2.c */ /* in decl2.c */
extern void record_mangling (tree, bool); extern void record_mangling (tree, bool);
......
...@@ -5308,7 +5308,7 @@ grok_reference_init (tree decl, tree type, tree init, int flags) ...@@ -5308,7 +5308,7 @@ grok_reference_init (tree decl, tree type, tree init, int flags)
initializer. If it does, an error is issued. Returns true if CE initializer. If it does, an error is issued. Returns true if CE
is valid, i.e., does not have a designated initializer. */ is valid, i.e., does not have a designated initializer. */
static bool bool
check_array_designated_initializer (constructor_elt *ce, check_array_designated_initializer (constructor_elt *ce,
unsigned HOST_WIDE_INT index) unsigned HOST_WIDE_INT index)
{ {
......
...@@ -22101,8 +22101,10 @@ cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p) ...@@ -22101,8 +22101,10 @@ cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
if (!cp_parser_parse_definitely (parser)) if (!cp_parser_parse_definitely (parser))
designator = NULL_TREE; designator = NULL_TREE;
else if (non_const) else if (non_const
require_potential_rvalue_constant_expression (designator); && (!require_potential_rvalue_constant_expression
(designator)))
designator = NULL_TREE;
if (designator) if (designator)
/* Warn the user that they are using an extension. */ /* Warn the user that they are using an extension. */
pedwarn (loc, OPT_Wpedantic, pedwarn (loc, OPT_Wpedantic,
...@@ -1305,17 +1305,10 @@ process_init_constructor_array (tree type, tree init, int nested, ...@@ -1305,17 +1305,10 @@ process_init_constructor_array (tree type, tree init, int nested,
FOR_EACH_VEC_SAFE_ELT (v, i, ce) FOR_EACH_VEC_SAFE_ELT (v, i, ce)
{ {
if (ce->index) if (!ce->index)
{
gcc_assert (TREE_CODE (ce->index) == INTEGER_CST);
if (compare_tree_int (ce->index, i) != 0)
{
ce->value = error_mark_node;
sorry ("non-trivial designated initializers not supported");
}
}
else
ce->index = size_int (i); ce->index = size_int (i);
else if (!check_array_designated_initializer (ce, i))
ce->index = error_mark_node;
gcc_assert (ce->value); gcc_assert (ce->value);
ce->value ce->value
= massage_init_elt (TREE_TYPE (type), ce->value, nested, complain); = massage_init_elt (TREE_TYPE (type), ce->value, nested, complain);
......
// PR c++/82593
// { dg-do compile { target c++11 } }
// { dg-options "" }
enum {
INDEX1 = 0,
INDEX2
};
class SomeClass {
public:
SomeClass();
private:
struct { int field; } member[2];
};
SomeClass::SomeClass()
: member({
[INDEX1] = { .field = 0 },
[INDEX2] = { .field = 1 }
})
{
}
// PR c++/82593
// { dg-do compile { target c++11 } }
// { dg-options "" }
const int INDEX1 = 0;
const int INDEX2 = 1;
class SomeClass {
public:
SomeClass();
private:
struct { int field; } member[2];
};
SomeClass::SomeClass()
: member({
[INDEX1] = { .field = 0 },
[INDEX2] = { .field = 1 }
})
{
}
// PR c++/82593
// { dg-do compile { target c++11 } }
// { dg-options "" }
int INDEX1 = 0;
int INDEX2 = 1;
class SomeClass {
public:
SomeClass();
private:
struct { int field; } member[2];
};
SomeClass::SomeClass()
: member({
[INDEX1] = { .field = 0 }, // { dg-error "constant expression" }
[INDEX2] = { .field = 1 } // { dg-error "constant expression" }
})
{
}
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