Commit a7ee52fb by Igor Zamyatin Committed by Kirill Yukhin

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
parent 66368374
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> 2014-08-01 Jakub Jelinek <jakub@redhat.com>
* c-common.h (min_align_of_type): Removed prototype. * c-common.h (min_align_of_type): Removed prototype.
......
...@@ -329,6 +329,14 @@ extract_array_notation_exprs (tree node, bool ignore_builtin_fn, ...@@ -329,6 +329,14 @@ extract_array_notation_exprs (tree node, bool ignore_builtin_fn,
vec_safe_push (*array_list, node); vec_safe_push (*array_list, node);
return; 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) else if (TREE_CODE (node) == STATEMENT_LIST)
{ {
tree_stmt_iterator ii_tsi; tree_stmt_iterator ii_tsi;
......
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> 2014-07-31 Marc Glisse <marc.glisse@inria.fr>
PR c++/60517 PR c++/60517
......
...@@ -1265,6 +1265,25 @@ expand_array_notations (tree *tp, int *walk_subtrees, void *) ...@@ -1265,6 +1265,25 @@ expand_array_notations (tree *tp, int *walk_subtrees, void *)
rhs_loc, rhs, TREE_TYPE (rhs)); rhs_loc, rhs, TREE_TYPE (rhs));
} }
break; 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: case CALL_EXPR:
*tp = fix_array_notation_call_expr (*tp); *tp = fix_array_notation_call_expr (*tp);
break; break;
......
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> 2014-08-01 Paolo Carlini <paolo.carlini@oracle.com>
* pt.c (lookup_template_class_1): Use DECL_TYPE_TEMPLATE_P. * pt.c (lookup_template_class_1): Use DECL_TYPE_TEMPLATE_P.
......
...@@ -1148,13 +1148,13 @@ expand_array_notation_exprs (tree t) ...@@ -1148,13 +1148,13 @@ expand_array_notation_exprs (tree t)
case PARM_DECL: case PARM_DECL:
case NON_LVALUE_EXPR: case NON_LVALUE_EXPR:
case NOP_EXPR: case NOP_EXPR:
case INIT_EXPR:
case ADDR_EXPR: case ADDR_EXPR:
case ARRAY_REF: case ARRAY_REF:
case BIT_FIELD_REF: case BIT_FIELD_REF:
case VECTOR_CST: case VECTOR_CST:
case COMPLEX_CST: case COMPLEX_CST:
return t; return t;
case INIT_EXPR:
case MODIFY_EXPR: case MODIFY_EXPR:
if (contains_array_notation_expr (t)) if (contains_array_notation_expr (t))
t = expand_an_in_modify_expr (loc, TREE_OPERAND (t, 0), NOP_EXPR, t = expand_an_in_modify_expr (loc, TREE_OPERAND (t, 0), NOP_EXPR,
...@@ -1176,13 +1176,24 @@ expand_array_notation_exprs (tree t) ...@@ -1176,13 +1176,24 @@ expand_array_notation_exprs (tree t)
return t; return t;
} }
case DECL_EXPR: case DECL_EXPR:
{ if (contains_array_notation_expr (t))
tree x = DECL_EXPR_DECL (t); {
if (t && TREE_CODE (x) != FUNCTION_DECL) tree x = DECL_EXPR_DECL (t);
if (DECL_INITIAL (x)) 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; return t;
}
case STATEMENT_LIST: case STATEMENT_LIST:
{ {
tree_stmt_iterator i; tree_stmt_iterator i;
......
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> 2014-08-01 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/legitimize_stack_var_before_reload_1.c: New * gcc.target/aarch64/legitimize_stack_var_before_reload_1.c: New
......
/* 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;
}
/* PR c++/61455 */
/* { dg-do compile } */
/* { dg-options "-fcilkplus" } */
void foo ()
{
int a[2];
int b = a[:]; /* { dg-error "cannot be scalar" } */
}
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