re PR c++/61455 (Internal compiler error, and other confused errors, when using array notation)

PR middle-end/61455

gcc/c-family/
	* array-notation-common.c (extract_array_notation_exprs): Handling
	of DECL_EXPR added.

gcc/c/
	* c-array-notation.c (expand_array_notations): Handling
	of DECL_EXPR added.

gcc/cp/
	* cp-array-notation.c (expand_array_notation_exprs): Handling of
	DECL_EXPR improved. Changed handling for INIT_EXPR.

gcc/testsuite/
	* c-c++-common/cilk-plus/AN/pr61455.c: New test.
	* c-c++-common/cilk-plus/AN/pr61455-2.c: Likewise.

From-SVN: r213491
This commit is contained in:
Igor Zamyatin 2014-08-01 16:54:27 +00:00 committed by Kirill Yukhin
parent 663683746c
commit a7ee52fba0
9 changed files with 90 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2014-08-01 Igor Zamyatin <igor.zamyatin@intel.com>
PR middle-end/61455
* array-notation-common.c (extract_array_notation_exprs): Handling
of DECL_EXPR added.
2014-08-01 Jakub Jelinek <jakub@redhat.com>
* c-common.h (min_align_of_type): Removed prototype.

View File

@ -329,6 +329,14 @@ extract_array_notation_exprs (tree node, bool ignore_builtin_fn,
vec_safe_push (*array_list, node);
return;
}
if (TREE_CODE (node) == DECL_EXPR)
{
tree x = DECL_EXPR_DECL (node);
if (DECL_INITIAL (x))
extract_array_notation_exprs (DECL_INITIAL (x),
ignore_builtin_fn,
array_list);
}
else if (TREE_CODE (node) == STATEMENT_LIST)
{
tree_stmt_iterator ii_tsi;

View File

@ -1,3 +1,9 @@
2014-08-01 Igor Zamyatin <igor.zamyatin@intel.com>
PR middle-end/61455
* c-array-notation.c (expand_array_notations): Handling
of DECL_EXPR added.
2014-07-31 Marc Glisse <marc.glisse@inria.fr>
PR c++/60517

View File

@ -1265,6 +1265,25 @@ expand_array_notations (tree *tp, int *walk_subtrees, void *)
rhs_loc, rhs, TREE_TYPE (rhs));
}
break;
case DECL_EXPR:
{
tree x = DECL_EXPR_DECL (*tp);
if (DECL_INITIAL (x))
{
location_t loc = DECL_SOURCE_LOCATION (x);
tree lhs = x;
tree rhs = DECL_INITIAL (x);
DECL_INITIAL (x) = NULL;
tree new_modify_expr = build_modify_expr (loc, lhs,
TREE_TYPE (lhs),
NOP_EXPR,
loc, rhs,
TREE_TYPE(rhs));
expand_array_notations (&new_modify_expr, walk_subtrees, NULL);
*tp = new_modify_expr;
}
}
break;
case CALL_EXPR:
*tp = fix_array_notation_call_expr (*tp);
break;

View File

@ -1,3 +1,9 @@
2014-07-08 Igor Zamyatin <igor.zamyatin@intel.com>
PR middle-end/61455
* cp-array-notation.c (expand_array_notation_exprs): Handling of
DECL_EXPR improved. Changed handling for INIT_EXPR.
2014-08-01 Paolo Carlini <paolo.carlini@oracle.com>
* pt.c (lookup_template_class_1): Use DECL_TYPE_TEMPLATE_P.

View File

@ -1148,13 +1148,13 @@ expand_array_notation_exprs (tree t)
case PARM_DECL:
case NON_LVALUE_EXPR:
case NOP_EXPR:
case INIT_EXPR:
case ADDR_EXPR:
case ARRAY_REF:
case BIT_FIELD_REF:
case VECTOR_CST:
case COMPLEX_CST:
return t;
case INIT_EXPR:
case MODIFY_EXPR:
if (contains_array_notation_expr (t))
t = expand_an_in_modify_expr (loc, TREE_OPERAND (t, 0), NOP_EXPR,
@ -1176,13 +1176,24 @@ expand_array_notation_exprs (tree t)
return t;
}
case DECL_EXPR:
{
tree x = DECL_EXPR_DECL (t);
if (t && TREE_CODE (x) != FUNCTION_DECL)
if (contains_array_notation_expr (t))
{
tree x = DECL_EXPR_DECL (t);
if (DECL_INITIAL (x))
t = expand_unary_array_notation_exprs (t);
{
location_t loc = DECL_SOURCE_LOCATION (x);
tree lhs = x;
tree rhs = DECL_INITIAL (x);
DECL_INITIAL (x) = NULL;
tree new_modify_expr = build_modify_expr (loc, lhs,
TREE_TYPE (lhs),
NOP_EXPR,
loc, rhs,
TREE_TYPE(rhs));
t = expand_array_notation_exprs (new_modify_expr);
}
}
return t;
}
case STATEMENT_LIST:
{
tree_stmt_iterator i;

View File

@ -1,3 +1,9 @@
2014-07-08 Igor Zamyatin <igor.zamyatin@intel.com>
PR middle-end/61455
* c-c++-common/cilk-plus/AN/pr61455.c: New test.
* c-c++-common/cilk-plus/AN/pr61455-2.c: Likewise.
2014-08-01 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/legitimize_stack_var_before_reload_1.c: New

View File

@ -0,0 +1,13 @@
/* PR c++/61455 */
/* { dg-options "-fcilkplus" } */
int a[3] = {2, 3, 4};
int main ()
{
int c = 10;
int b = __sec_reduce_add(a[:]);
if (b+c != 19)
__builtin_abort();
return 0;
}

View File

@ -0,0 +1,9 @@
/* PR c++/61455 */
/* { dg-do compile } */
/* { dg-options "-fcilkplus" } */
void foo ()
{
int a[2];
int b = a[:]; /* { dg-error "cannot be scalar" } */
}