diff options
author | Tobias Burnus <burnus@net-b.de> | 2011-05-27 20:51:31 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-05-27 20:51:31 +0200 |
commit | 2514987fa9a984b5f68ea5897d556deca3625139 (patch) | |
tree | 341533aad243abe6b029ec89d06762f65a06ebd9 /gcc/fortran/check.c | |
parent | f97b516f9a546f294a8b091d4b7fc684d0acb282 (diff) | |
download | gcc-2514987fa9a984b5f68ea5897d556deca3625139.zip gcc-2514987fa9a984b5f68ea5897d556deca3625139.tar.gz gcc-2514987fa9a984b5f68ea5897d556deca3625139.tar.bz2 |
re PR fortran/48820 (TR 29113: Implement parts needed for MPI 3)
2011-05-27 Tobias Burnus <burnus@net-b.de>
PR fortran/48820
* gfortran.h (gfc_isym_id): Add GFC_ISYM_RANK.
* intrinsic.c (add_functions): Add rank intrinsic.
(gfc_check_intrinsic_standard): Handle GFC_STD_F2008_TR.
* intrinsic.h (gfc_simplify_rank, gfc_check_rank): Add
* prototypes.
* simplify.c (gfc_simplify_rank): New function.
* intrinsic.texi (RANK): Add description for rank intrinsic.
* check.c (gfc_check_rank): New function.
2011-05-27 Tobias Burnus <burnus@net-b.de>
PR fortran/48820
* gfortran.dg/rank_3.f90: New.
* gfortran.dg/rank_4.f90: New.
From-SVN: r174348
Diffstat (limited to 'gcc/fortran/check.c')
-rw-r--r-- | gcc/fortran/check.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 8641142..01651cb 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -2830,6 +2830,33 @@ gfc_check_range (gfc_expr *x) } +gfc_try +gfc_check_rank (gfc_expr *a ATTRIBUTE_UNUSED) +{ + /* Any data object is allowed; a "data object" is a "constant (4.1.3), + variable (6), or subobject of a constant (2.4.3.2.3)" (F2008, 1.3.45). */ + + bool is_variable = true; + + /* Functions returning pointers are regarded as variable, cf. F2008, R602. */ + if (a->expr_type == EXPR_FUNCTION) + is_variable = a->value.function.esym + ? a->value.function.esym->result->attr.pointer + : a->symtree->n.sym->result->attr.pointer; + + if (a->expr_type == EXPR_OP || a->expr_type == EXPR_NULL + || a->expr_type == EXPR_COMPCALL|| a->expr_type == EXPR_PPC + || !is_variable) + { + gfc_error ("The argument of the RANK intrinsic at %L must be a data " + "object", &a->where); + return FAILURE; + } + + return SUCCESS; +} + + /* real, float, sngl. */ gfc_try gfc_check_real (gfc_expr *a, gfc_expr *kind) |