diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2014-05-08 18:55:23 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2014-05-08 18:55:23 +0200 |
commit | d62cf3dfbe72b168d9bde08b34e2a190cdf7eb33 (patch) | |
tree | 778c1f6a41dea0e8e0d26817d32358e245d22ded /gcc/fortran/check.c | |
parent | 272325bd6abba598a8f125dab36b626acb648b03 (diff) | |
download | gcc-d62cf3dfbe72b168d9bde08b34e2a190cdf7eb33.zip gcc-d62cf3dfbe72b168d9bde08b34e2a190cdf7eb33.tar.gz gcc-d62cf3dfbe72b168d9bde08b34e2a190cdf7eb33.tar.bz2 |
check.c (check_co_minmaxsum, [...]): New.
gcc/fortran/
2014-05-08 Tobias Burnus <burnus@net-b.de>
* check.c (check_co_minmaxsum, gfc_check_co_minmax,
gfc_check_co_sum): New.
* error.c (gfc_notify_std): Update -std=f2008ts.
* gfortran.h (gfc_isym_id): Add GFC_ISYM_CO_MAX,
GFC_ISYM_CO_MIN, GFC_ISYM_CO_SUM.
* intrinsic.h (gfc_check_co_minmax,
gfc_check_co_sum): Declare.
* intrinsic.c (add_subroutines): Add co_min, co_max
and co_sum.
(gfc_check_intrinsic_standard): Update text for
-std=f2008ts.
* intrinsic.texi (CO_MIN, CO_MAX, CO_SUM): Document
them.
* invoke.texi (-std=f2008ts): Update wording.
* trans.h (gfor_fndecl_co_max,
gfor_fndecl_co_min, gfor_fndecl_co_sum): Define.
* trans-decl.c (gfor_fndecl_co_max,
gfor_fndecl_co_min, gfor_fndecl_co_sum): Define.
(gfc_build_builtin_function_decls): Assign to it.
* trans-intrinsic.c (conv_co_minmaxsum): New.
(gfc_conv_intrinsic_subroutine): Call it.
libgfortran/
2014-05-08 Tobias Burnus <burnus@net-b.de>
* caf/libcaf.h (caf_vector_t, _gfortran_caf_co_sum,
_gfortran_caf_co_min, _gfortran_caf_co_max): Declare
* caf/single.c
gcc/testsuite/
2014-05-08 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/coarray_collectives_1.f90: New.
* gfortran.dg/coarray_collectives_2.f90: New.
* gfortran.dg/coarray_collectives_3.f90: New.
* gfortran.dg/coarray_collectives_4.f90: New.
* gfortran.dg/coarray_collectives_5.f90: New.
* gfortran.dg/coarray_collectives_6.f90: New.
* gfortran.dg/coarray/collectives_1.f90: New.
* gfortran.dg/assumed_rank_5.f90: Update dg-error.
* gfortran.dg/assumed_type_4.f90: Update dg-error.
* gfortran.dg/bind_c_array_params.f03: Update dg-error.
* gfortran.dg/bind_c_usage_28.f90: Update dg-error.
* gfortran.dg/c_funloc_tests_5.f03: Update dg-error.
* gfortran.dg/c_funloc_tests_6.f90: Update dg-error.
* gfortran.dg/c_loc_tests_11.f03: Update dg-error.
From-SVN: r210223
Diffstat (limited to 'gcc/fortran/check.c')
-rw-r--r-- | gcc/fortran/check.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index b83d9da..90ba0c9 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -1290,6 +1290,91 @@ gfc_check_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *kind) } +static bool +check_co_minmaxsum (gfc_expr *a, gfc_expr *result_image, gfc_expr *stat, + gfc_expr *errmsg) +{ + if (!variable_check (a, 0, false)) + return false; + + if (result_image != NULL) + { + if (!type_check (result_image, 1, BT_INTEGER)) + return false; + if (!scalar_check (result_image, 1)) + return false; + } + + if (stat != NULL) + { + if (!type_check (stat, 2, BT_INTEGER)) + return false; + if (!scalar_check (stat, 2)) + return false; + if (!variable_check (stat, 2, false)) + return false; + if (stat->ts.kind != 4) + { + gfc_error ("The stat= argument at %L must be a kind=4 integer " + "variable", &stat->where); + return false; + } + } + + if (errmsg != NULL) + { + if (!type_check (errmsg, 3, BT_CHARACTER)) + return false; + if (!scalar_check (errmsg, 3)) + return false; + if (!variable_check (errmsg, 3, false)) + return false; + if (errmsg->ts.kind != 1) + { + gfc_error ("The errmsg= argument at %L must be a default-kind " + "character variable", &errmsg->where); + return false; + } + } + + if (gfc_option.coarray == GFC_FCOARRAY_NONE) + { + gfc_fatal_error ("Coarrays disabled at %L, use -fcoarray= to enable", + &a->where); + return false; + } + + return true; +} + + +bool +gfc_check_co_minmax (gfc_expr *a, gfc_expr *result_image, gfc_expr *stat, + gfc_expr *errmsg) +{ + if (a->ts.type != BT_INTEGER && a->ts.type != BT_REAL + && a->ts.type != BT_CHARACTER) + { + gfc_error ("'%s' argument of '%s' intrinsic at %L shall be of type " + "integer, real or character", + gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic, + &a->where); + return false; + } + return check_co_minmaxsum (a, result_image, stat, errmsg); +} + + +bool +gfc_check_co_sum (gfc_expr *a, gfc_expr *result_image, gfc_expr *stat, + gfc_expr *errmsg) +{ + if (!numeric_check (a, 0)) + return false; + return check_co_minmaxsum (a, result_image, stat, errmsg); +} + + bool gfc_check_complex (gfc_expr *x, gfc_expr *y) { |