static struct c_expr c_parser_unary_expression (c_parser *parser) { int ext; struct c_expr ret, op; switch (c_parser_peek_token (parser)->type) { case '+': case CPP_PLUS: c_parser_consume_token (parser); op = c_parser_cast_expression (parser, NULL); op = default_function_array_conversion (op); return parser_build_unary_op (CONVERT_EXPR, op); case '-': case CPP_MINUS: c_parser_consume_token (parser); op = c_parser_cast_expression (parser, NULL); op = default_function_array_conversion (op); return parser_build_unary_op (NEGATE_EXPR, op); case K_NOT: // check. violates priority? case CPP_COMPL: c_parser_consume_token (parser); op = c_parser_cast_expression (parser, NULL); op = default_function_array_conversion (op); return parser_build_unary_op (BIT_NOT_EXPR, op); case CPP_NOT: c_parser_consume_token (parser); op = c_parser_cast_expression (parser, NULL); op = default_function_array_conversion (op); return parser_build_unary_op (TRUTH_NOT_EXPR, op); default: return c_parser_postfix_expression (parser); } }
struct c_expr fix_array_notation_expr (location_t location, enum tree_code code, struct c_expr arg) { vec<tree, va_gc> *array_list = NULL, *array_operand = NULL; size_t list_size = 0, rank = 0, ii = 0; tree loop_init; tree body, loop_with_init = alloc_stmt_list (); vec<vec<an_parts> > an_info = vNULL; vec<an_loop_parts> an_loop_info = vNULL; if (!find_rank (location, arg.value, arg.value, false, &rank)) { /* If this function returns a NULL, we convert the tree value in the structure to error_mark_node and the parser should take care of the rest. */ arg.value = error_mark_node; return arg; } if (rank == 0) return arg; extract_array_notation_exprs (arg.value, true, &array_list); if (vec_safe_length (array_list) == 0) return arg; list_size = vec_safe_length (array_list); an_loop_info.safe_grow_cleared (rank); cilkplus_extract_an_triplets (array_list, list_size, rank, &an_info); loop_init = push_stmt_list (); for (ii = 0; ii < rank; ii++) { an_loop_info[ii].var = create_tmp_var (integer_type_node); an_loop_info[ii].ind_init = build_modify_expr (location, an_loop_info[ii].var, TREE_TYPE (an_loop_info[ii].var), NOP_EXPR, location, build_int_cst (TREE_TYPE (an_loop_info[ii].var), 0), TREE_TYPE (an_loop_info[ii].var));; } array_operand = create_array_refs (location, an_info, an_loop_info, list_size, rank); replace_array_notations (&arg.value, true, array_list, array_operand); create_cmp_incr (location, &an_loop_info, rank, an_info); arg = default_function_array_read_conversion (location, arg); if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR) arg.value = build_unary_op (location, code, arg.value, 0); else if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR) arg = parser_build_unary_op (location, code, arg); loop_init = pop_stmt_list (loop_init); append_to_statement_list_force (loop_init, &loop_with_init); body = arg.value; for (ii = 0; ii < rank; ii++) { tree new_loop = push_stmt_list (); add_stmt (an_loop_info[ii].ind_init); c_finish_loop (location, an_loop_info[ii].cmp, an_loop_info[ii].incr, body, NULL_TREE, NULL_TREE, true); body = pop_stmt_list (new_loop); } append_to_statement_list_force (body, &loop_with_init); arg.value = loop_with_init; an_info.release (); an_loop_info.release (); return arg; }