X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=libgfortran%2Fgenerated%2Fproduct_i2.c;h=bf3f68b73c0c1268e7905fd684037d4899e552d8;hb=7adcbafe45f8001b698967defe682687b52c0007;hp=82a650f6ec65cfaa014d1617aff89634fcb09488;hpb=80dd631fceac3b9b8da712fa9e1c1a2f61002cb9;p=thirdparty%2Fgcc.git diff --git a/libgfortran/generated/product_i2.c b/libgfortran/generated/product_i2.c index 82a650f6ec65..bf3f68b73c0c 100644 --- a/libgfortran/generated/product_i2.c +++ b/libgfortran/generated/product_i2.c @@ -1,5 +1,5 @@ /* Implementation of the PRODUCT intrinsic - Copyright (C) 2002-2017 Free Software Foundation, Inc. + Copyright (C) 2002-2022 Free Software Foundation, Inc. Contributed by Paul Brook This file is part of the GNU Fortran runtime library (libgfortran). @@ -52,8 +52,15 @@ product_i2 (gfc_array_i2 * const restrict retarray, int continue_loop; /* Make dim zero based to avoid confusion. */ - dim = (*pdim) - 1; rank = GFC_DESCRIPTOR_RANK (array) - 1; + dim = (*pdim) - 1; + + if (unlikely (dim < 0 || dim > rank)) + { + runtime_error ("Dim argument incorrect in PRODUCT intrinsic: " + "is %ld, should be between 1 and %ld", + (long int) dim + 1, (long int) rank + 1); + } len = GFC_DESCRIPTOR_EXTENT(array,dim); if (len < 0) @@ -93,7 +100,7 @@ product_i2 (gfc_array_i2 * const restrict retarray, } retarray->offset = 0; - retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank; + retarray->dtype.rank = rank; alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1]; @@ -143,8 +150,10 @@ product_i2 (gfc_array_i2 * const restrict retarray, *dest = 1; else { +#if ! defined HAVE_BACK_ARG for (n = 0; n < len; n++, src += delta) { +#endif result *= *src; } @@ -203,17 +212,35 @@ mproduct_i2 (gfc_array_i2 * const restrict retarray, GFC_INTEGER_2 * restrict dest; const GFC_INTEGER_2 * restrict base; const GFC_LOGICAL_1 * restrict mbase; - int rank; - int dim; + index_type rank; + index_type dim; index_type n; index_type len; index_type delta; index_type mdelta; int mask_kind; + if (mask == NULL) + { +#ifdef HAVE_BACK_ARG + product_i2 (retarray, array, pdim, back); +#else + product_i2 (retarray, array, pdim); +#endif + return; + } + dim = (*pdim) - 1; rank = GFC_DESCRIPTOR_RANK (array) - 1; + + if (unlikely (dim < 0 || dim > rank)) + { + runtime_error ("Dim argument incorrect in PRODUCT intrinsic: " + "is %ld, should be between 1 and %ld", + (long int) dim + 1, (long int) rank + 1); + } + len = GFC_DESCRIPTOR_EXTENT(array,dim); if (len <= 0) return; @@ -272,7 +299,7 @@ mproduct_i2 (gfc_array_i2 * const restrict retarray, alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1]; retarray->offset = 0; - retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank; + retarray->dtype.rank = rank; if (alloc_size == 0) { @@ -382,15 +409,26 @@ sproduct_i2 (gfc_array_i2 * const restrict retarray, index_type dim; - if (*mask) + if (mask == NULL || *mask) { +#ifdef HAVE_BACK_ARG + product_i2 (retarray, array, pdim, back); +#else product_i2 (retarray, array, pdim); +#endif return; } /* Make dim zero based to avoid confusion. */ dim = (*pdim) - 1; rank = GFC_DESCRIPTOR_RANK (array) - 1; + if (unlikely (dim < 0 || dim > rank)) + { + runtime_error ("Dim argument incorrect in PRODUCT intrinsic: " + "is %ld, should be between 1 and %ld", + (long int) dim + 1, (long int) rank + 1); + } + for (n = 0; n < dim; n++) { extent[n] = GFC_DESCRIPTOR_EXTENT(array,n); @@ -424,7 +462,7 @@ sproduct_i2 (gfc_array_i2 * const restrict retarray, } retarray->offset = 0; - retarray->dtype = (array->dtype & ~GFC_DTYPE_RANK_MASK) | rank; + retarray->dtype.rank = rank; alloc_size = GFC_DESCRIPTOR_STRIDE(retarray,rank-1) * extent[rank-1];