tree build_array_notation_ref (location_t loc, tree array, tree start, tree length, tree stride, tree type) { tree array_ntn_expr = NULL_TREE; /* If we enter the then-case of the if-statement below, we have hit a case like this: ARRAY [:]. */ if (!start && !length) { if (TREE_CODE (type) != ARRAY_TYPE) { error_at (loc, "start-index and length fields necessary for " "using array notation in pointers or records"); return error_mark_node; } tree domain = TYPE_DOMAIN (type); if (!domain) { error_at (loc, "start-index and length fields necessary for " "using array notation with array of unknown bound"); return error_mark_node; } start = cp_fold_convert (ptrdiff_type_node, TYPE_MINVAL (domain)); length = size_binop (PLUS_EXPR, TYPE_MAXVAL (domain), size_one_node); length = cp_fold_convert (ptrdiff_type_node, length); } if (!stride) stride = build_one_cst (ptrdiff_type_node); /* When dealing with templates, triplet type-checking will be done in pt.c after type substitution. */ if (processing_template_decl && (type_dependent_expression_p (array) || type_dependent_expression_p (length) || type_dependent_expression_p (start) || type_dependent_expression_p (stride))) array_ntn_expr = build_min_nt_loc (loc, ARRAY_NOTATION_REF, array, start, length, stride, NULL_TREE); else { if (!cilkplus_an_triplet_types_ok_p (loc, start, length, stride, type)) return error_mark_node; array_ntn_expr = build4 (ARRAY_NOTATION_REF, NULL_TREE, array, start, length, stride); } if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == POINTER_TYPE) TREE_TYPE (array_ntn_expr) = TREE_TYPE (type); else gcc_unreachable (); SET_EXPR_LOCATION (array_ntn_expr, loc); return array_ntn_expr; }
static void write_ts_type_non_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p) { if (TREE_CODE (expr) == ENUMERAL_TYPE) stream_write_tree (ob, TYPE_VALUES (expr), ref_p); else if (TREE_CODE (expr) == ARRAY_TYPE) stream_write_tree (ob, TYPE_DOMAIN (expr), ref_p); else if (RECORD_OR_UNION_TYPE_P (expr)) streamer_write_chain (ob, TYPE_FIELDS (expr), ref_p); else if (TREE_CODE (expr) == FUNCTION_TYPE || TREE_CODE (expr) == METHOD_TYPE) stream_write_tree (ob, TYPE_ARG_TYPES (expr), ref_p); if (!POINTER_TYPE_P (expr)) stream_write_tree (ob, TYPE_MINVAL (expr), ref_p); stream_write_tree (ob, TYPE_MAXVAL (expr), ref_p); if (RECORD_OR_UNION_TYPE_P (expr)) stream_write_tree (ob, TYPE_BINFO (expr), ref_p); }
static void lto_input_ts_type_non_common_tree_pointers (struct lto_input_block *ib, struct data_in *data_in, tree expr) { if (TREE_CODE (expr) == ENUMERAL_TYPE) TYPE_VALUES (expr) = stream_read_tree (ib, data_in); else if (TREE_CODE (expr) == ARRAY_TYPE) TYPE_DOMAIN (expr) = stream_read_tree (ib, data_in); else if (RECORD_OR_UNION_TYPE_P (expr)) TYPE_FIELDS (expr) = streamer_read_chain (ib, data_in); else if (TREE_CODE (expr) == FUNCTION_TYPE || TREE_CODE (expr) == METHOD_TYPE) TYPE_ARG_TYPES (expr) = stream_read_tree (ib, data_in); if (!POINTER_TYPE_P (expr)) TYPE_MINVAL (expr) = stream_read_tree (ib, data_in); TYPE_MAXVAL (expr) = stream_read_tree (ib, data_in); if (RECORD_OR_UNION_TYPE_P (expr)) TYPE_BINFO (expr) = stream_read_tree (ib, data_in); }