/* Special implementation of the SPREAD intrinsic
- Copyright 2008, 2009, 2012 Free Software Foundation, Inc.
+ Copyright (C) 2008-2024 Free Software Foundation, Inc.
Contributed by Thomas Koenig <tkoenig@gcc.gnu.org>, based on
spread_generic.c written by Paul Brook <paul@nowt.org>
<http://www.gnu.org/licenses/>. */
#include "libgfortran.h"
-#include <stdlib.h>
-#include <assert.h>
#include <string.h>
srank = GFC_DESCRIPTOR_RANK(source);
+ sstride[0] = 0; /* Avoid warnings if not initialized. */
+
rrank = srank + 1;
if (rrank > GFC_MAX_DIMENSIONS)
runtime_error ("return rank too large in spread()");
/* The front end has signalled that we need to populate the
return array descriptor. */
- ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rrank;
+ ret->dtype.rank = rrank;
+
dim = 0;
rs = 1;
for (n = 0; n < rrank; n++)
}
ret->offset = 0;
- /* internal_malloc_size allocates a single byte for zero size. */
- ret->base_addr = internal_malloc_size (rs * sizeof(GFC_INTEGER_8));
+ /* xmallocarray allocates a single byte for zero size. */
+ ret->base_addr = xmallocarray (rs, sizeof(GFC_INTEGER_8));
if (rs <= 0)
return;
}
void
spread_scalar_i8 (gfc_array_i8 *ret, const GFC_INTEGER_8 *source,
- const index_type along, const index_type pncopies)
+ const index_type along, const index_type ncopies)
{
- int n;
- int ncopies = pncopies;
GFC_INTEGER_8 * restrict dest;
index_type stride;
if (ret->base_addr == NULL)
{
- ret->base_addr = internal_malloc_size (ncopies * sizeof (GFC_INTEGER_8));
+ ret->base_addr = xmallocarray (ncopies, sizeof (GFC_INTEGER_8));
ret->offset = 0;
GFC_DIMENSION_SET(ret->dim[0], 0, ncopies - 1, 1);
}
dest = ret->base_addr;
stride = GFC_DESCRIPTOR_STRIDE(ret,0);
- for (n = 0; n < ncopies; n++)
+ for (index_type n = 0; n < ncopies; n++)
{
*dest = *source;
dest += stride;