]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2012-06-18 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Jun 2012 18:37:16 +0000 (18:37 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Jun 2012 18:37:16 +0000 (18:37 +0000)
        * intrinsic.h (gfc_resolve_rank): New prototype.
        * intrinsic.c (add_functions): Use gfc_resolve_rank.
        * iresolve.c (add_functions): New function.
        * trans-intrinsic.c (gfc_conv_intrinsic_rank): New function.
        (gfc_conv_intrinsic_function): Call it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188751 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/intrinsic.c
gcc/fortran/intrinsic.h
gcc/fortran/iresolve.c
gcc/fortran/trans-intrinsic.c

index a89e197f954050f9297ddf3b69b9397a095ffe7d..ef2dc36166b12e3530895757f62b4245b26f85d6 100644 (file)
@@ -1,3 +1,11 @@
+2012-06-18  Tobias Burnus  <burnus@net-b.de>
+
+       * intrinsic.h (gfc_resolve_rank): New prototype.
+       * intrinsic.c (add_functions): Use gfc_resolve_rank.
+       * iresolve.c (add_functions): New function.
+       * trans-intrinsic.c (gfc_conv_intrinsic_rank): New function.
+       (gfc_conv_intrinsic_function): Call it.
+
 2012-06-18  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/53692
index 38bcb273fdd146b31ab42ca9739fe98d47921c3e..88d4636bd7144de97c27569feecf322791f684f7 100644 (file)
@@ -2434,7 +2434,7 @@ add_functions (void)
   make_generic ("range", GFC_ISYM_RANGE, GFC_STD_F95);
 
   add_sym_1 ("rank", GFC_ISYM_RANK, CLASS_INQUIRY, ACTUAL_NO, BT_INTEGER, di,
-            GFC_STD_F2008_TS, gfc_check_rank, gfc_simplify_rank, NULL,
+            GFC_STD_F2008_TS, gfc_check_rank, gfc_simplify_rank, gfc_resolve_rank,
             a, BT_REAL, dr, REQUIRED);
   make_generic ("rank", GFC_ISYM_RANK, GFC_STD_F2008_TS);
 
index bfc2455cfd2351b5b9d63813b00aac4bd6394d17..2635ba6d3da915958fe5a8633ddaf5a015217eb2 100644 (file)
@@ -486,6 +486,7 @@ void gfc_resolve_long (gfc_expr *, gfc_expr *);
 void gfc_resolve_ior (gfc_expr *, gfc_expr *, gfc_expr *);
 void gfc_resolve_iparity (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
 void gfc_resolve_isatty (gfc_expr *, gfc_expr *);
+void gfc_resolve_rank (gfc_expr *, gfc_expr *);
 void gfc_resolve_rshift (gfc_expr *, gfc_expr *, gfc_expr *);
 void gfc_resolve_lshift (gfc_expr *, gfc_expr *, gfc_expr *);
 void gfc_resolve_ishft (gfc_expr *, gfc_expr *, gfc_expr *);
index 9d94e3b91075353ea4629a93ad89f52a2b8c2561..2a494550bbc8e88b99845c433dd627f5908e969c 100644 (file)
@@ -2005,6 +2005,15 @@ gfc_resolve_product (gfc_expr *f, gfc_expr *array, gfc_expr *dim,
 }
 
 
+void
+gfc_resolve_rank (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED)
+{
+  f->ts.type = BT_INTEGER;
+  f->ts.kind = gfc_default_integer_kind;
+  f->value.function.name = gfc_get_string ("__rank");
+}
+
+
 void
 gfc_resolve_real (gfc_expr *f, gfc_expr *a, gfc_expr *kind)
 {
index 8cce42744bf20e9552c49c9fd1d3f3cf8e005c98..c74e81a011efff4c1591e794b7ad9d27c4b4c24e 100644 (file)
@@ -1316,6 +1316,32 @@ trans_num_images (gfc_se * se)
 }
 
 
+static void
+gfc_conv_intrinsic_rank (gfc_se *se, gfc_expr *expr)
+{
+  gfc_se argse;
+  gfc_ss *ss;
+  tree dtype, tmp;
+
+  ss = gfc_walk_expr (expr->value.function.actual->expr);
+  gcc_assert (ss != gfc_ss_terminator);
+  gfc_init_se (&argse, NULL);
+  argse.data_not_needed = 1;
+  argse.want_pointer = 1;
+
+  gfc_conv_expr_descriptor (&argse, expr->value.function.actual->expr, ss);
+  gfc_add_block_to_block (&se->pre, &argse.pre);
+  gfc_add_block_to_block (&se->post, &argse.post);
+  argse.expr = build_fold_indirect_ref_loc (input_location, argse.expr);
+  argse.expr = build_fold_indirect_ref_loc (input_location, argse.expr);
+  dtype = gfc_conv_descriptor_dtype (argse.expr);
+  tmp = build_int_cst (TREE_TYPE (dtype), GFC_DTYPE_RANK_MASK);
+  tmp = fold_build2_loc (input_location, BIT_AND_EXPR, TREE_TYPE (dtype),
+                        dtype, tmp);
+  se->expr = fold_convert (gfc_get_int_type (gfc_default_integer_kind), tmp);
+}
+
+
 /* Evaluate a single upper or lower bound.  */
 /* TODO: bound intrinsic generates way too much unnecessary code.  */
 
@@ -6710,6 +6736,10 @@ gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr)
       gfc_conv_intrinsic_arith (se, expr, MULT_EXPR, false);
       break;
 
+    case GFC_ISYM_RANK:
+      gfc_conv_intrinsic_rank (se, expr);
+      break;
+
     case GFC_ISYM_RRSPACING:
       gfc_conv_intrinsic_rrspacing (se, expr);
       break;