aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/check.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2011-05-27 20:51:31 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2011-05-27 20:51:31 +0200
commit2514987fa9a984b5f68ea5897d556deca3625139 (patch)
tree341533aad243abe6b029ec89d06762f65a06ebd9 /gcc/fortran/check.c
parentf97b516f9a546f294a8b091d4b7fc684d0acb282 (diff)
downloadgcc-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.c27
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)