> +/* Returns true if there is a length mismatch among exprssions that are at > the > + same dimension and one the same side of the equal sign. The Array > notation > + lengths (LIST) is passed in as a 2D vector of trees. */ > + > +static bool > +cp_length_mismatch_in_expr_p (location_t loc, vec<vec<tree> >list)
Other than working on a vec<>, how does this differ from the length_mismatch_in_expr_p (location_t loc, tree **list, size_t x, size_t y) in c-family? > +static inline void > +clear_all_an_vectors (vec <vec<tree> > *value, vec<vec<tree> > *start, > + vec <vec<tree> > *length, vec<vec<tree> > *stride, > + vec<vec<bool> > *is_vector, vec<vec<bool> > *count_down, > + vec<tree> *incr, vec<tree> *cmp, vec<tree> *ind_init, > + vec<tree> *var) > +{ > + value->release (); > + start->release (); > + length->release (); > + stride->release (); > + is_vector->release (); > + count_down->release (); > + incr->release (); > + cmp->release (); > + ind_init->release (); > + var->release (); > +} 10 arrays kept in sync? It's at this point that we should realize that there's a mistake in how we're arranging the data. This should be one array, with the element being a structure. That should significantly improve quite a lot of the functions in this file. > + init = ARITHMETIC_TYPE_P (new_var_type) ? build_zero_cst (new_var_type) > + : integer_zero_node; Why the test for ARITHMETIC_TYPE_P? Surely we always want something of new_var_type. > + if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ADD > + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MUL) > + new_expr = build_x_modify_expr (location, *new_var, code, func_parm, > + tf_warning_or_error); > + if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO > + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_NONZERO > + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO > + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO) Why not another switch statement here? r~