/* Generic implementation of the UNPACK intrinsic
- Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
Contributed by Paul Brook <paul@nowt.org>
This file is part of the GNU Fortran runtime library (libgfortran).
<http://www.gnu.org/licenses/>. */
#include "libgfortran.h"
-#include <stdlib.h>
#include <assert.h>
#include <string.h>
rs *= extent[n];
}
ret->offset = 0;
- ret->base_addr = xmalloc (rs * size);
+ ret->base_addr = xmallocarray (rs, size);
}
else
{
{
case GFC_DTYPE_LOGICAL_1:
case GFC_DTYPE_INTEGER_1:
- case GFC_DTYPE_DERIVED_1:
unpack1_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector,
mask, (gfc_array_i1 *) field);
return;
# endif
#endif
- case GFC_DTYPE_DERIVED_2:
+ }
+
+ switch (GFC_DESCRIPTOR_SIZE(ret))
+ {
+ case 1:
+ unpack1_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector,
+ mask, (gfc_array_i1 *) field);
+ return;
+
+ case 2:
if (GFC_UNALIGNED_2(ret->base_addr) || GFC_UNALIGNED_2(vector->base_addr)
|| GFC_UNALIGNED_2(field->base_addr))
break;
return;
}
- case GFC_DTYPE_DERIVED_4:
+ case 4:
if (GFC_UNALIGNED_4(ret->base_addr) || GFC_UNALIGNED_4(vector->base_addr)
|| GFC_UNALIGNED_4(field->base_addr))
break;
return;
}
- case GFC_DTYPE_DERIVED_8:
+ case 8:
if (GFC_UNALIGNED_8(ret->base_addr) || GFC_UNALIGNED_8(vector->base_addr)
|| GFC_UNALIGNED_8(field->base_addr))
break;
}
#ifdef HAVE_GFC_INTEGER_16
- case GFC_DTYPE_DERIVED_16:
+ case 16:
if (GFC_UNALIGNED_16(ret->base_addr)
|| GFC_UNALIGNED_16(vector->base_addr)
|| GFC_UNALIGNED_16(field->base_addr))
return;
}
#endif
+ default:
+ break;
}
unpack_internal (ret, vector, mask, field, size);
{
case GFC_DTYPE_LOGICAL_1:
case GFC_DTYPE_INTEGER_1:
- case GFC_DTYPE_DERIVED_1:
unpack0_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector,
mask, (GFC_INTEGER_1 *) field);
return;
# endif
#endif
- case GFC_DTYPE_DERIVED_2:
+ }
+
+ switch (GFC_DESCRIPTOR_SIZE(ret))
+ {
+ case 1:
+ unpack0_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector,
+ mask, (GFC_INTEGER_1 *) field);
+ return;
+
+ case 2:
if (GFC_UNALIGNED_2(ret->base_addr) || GFC_UNALIGNED_2(vector->base_addr)
|| GFC_UNALIGNED_2(field))
break;
return;
}
- case GFC_DTYPE_DERIVED_4:
+ case 4:
if (GFC_UNALIGNED_4(ret->base_addr) || GFC_UNALIGNED_4(vector->base_addr)
|| GFC_UNALIGNED_4(field))
break;
return;
}
- case GFC_DTYPE_DERIVED_8:
+ case 8:
if (GFC_UNALIGNED_8(ret->base_addr) || GFC_UNALIGNED_8(vector->base_addr)
|| GFC_UNALIGNED_8(field))
break;
}
#ifdef HAVE_GFC_INTEGER_16
- case GFC_DTYPE_DERIVED_16:
+ case 16:
if (GFC_UNALIGNED_16(ret->base_addr)
|| GFC_UNALIGNED_16(vector->base_addr)
|| GFC_UNALIGNED_16(field))
return;
}
#endif
-
}
memset (&tmp, 0, sizeof (tmp));
- tmp.dtype = 0;
+ GFC_DTYPE_CLEAR(&tmp);
tmp.base_addr = field;
unpack_internal (ret, vector, mask, &tmp, GFC_DESCRIPTOR_SIZE (vector));
}
unpack_bounds (ret, vector, mask, NULL);
memset (&tmp, 0, sizeof (tmp));
- tmp.dtype = 0;
+ GFC_DTYPE_CLEAR(&tmp);
tmp.base_addr = field;
unpack_internal (ret, vector, mask, &tmp, vector_length);
}
unpack_bounds (ret, vector, mask, NULL);
memset (&tmp, 0, sizeof (tmp));
- tmp.dtype = 0;
+ GFC_DTYPE_CLEAR(&tmp);
tmp.base_addr = field;
unpack_internal (ret, vector, mask, &tmp,
vector_length * sizeof (gfc_char4_t));