]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/32669 ("Actual argument contains too few elements for dummy argument...
authorTobias Burnus <burnus@net-b.de>
Sun, 8 Jul 2007 20:57:07 +0000 (22:57 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Sun, 8 Jul 2007 20:57:07 +0000 (22:57 +0200)
2007-07-08  Tobias Burnus  <burnus@net-b.de>

PR fortran/32669
* interface.c (get_expr_storage_size): Properly obtain lower bound.
(compare_actual_formal): Add space before parenthesis.

2007-07-08  Tobias Burnus  <burnus@net-b.de>

PR fortran/32669
* gfortran.dg/argument_checking_6.f90: New.

From-SVN: r126467

gcc/fortran/ChangeLog
gcc/fortran/interface.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/argument_checking_6.f90 [new file with mode: 0644]

index bda3726b24152c4b1a4d0ea66bd44c10c795d54f..78d50f1ff80393c17115882581ac64dd5b6e6508 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-08  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/32669
+       * interface.c (get_expr_storage_size): Properly obtain lower bound.
+       (compare_actual_formal): Add space before parenthesis.
+
 2007-07-08  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/25094
index c50e0bfe299a440153026c4d96325a6193aa3a92..85911828d1942a80bce0f304a28b2d40ef7a4020 100644 (file)
@@ -1374,7 +1374,7 @@ get_expr_storage_size (gfc_expr *e)
          {
            long int start, end, stride;
            stride = 1;
-           start = 1;
+
            if (ref->u.ar.stride[i])
              {
                if (ref->u.ar.stride[i]->expr_type == EXPR_CONSTANT)
@@ -1390,6 +1390,11 @@ get_expr_storage_size (gfc_expr *e)
                else
                  return 0;
              }
+           else if (ref->u.ar.as->lower[i]
+                    && ref->u.ar.as->lower[i]->expr_type == EXPR_CONSTANT)
+             start = mpz_get_si (ref->u.ar.as->lower[i]->value.integer);
+           else
+             return 0;
 
            if (ref->u.ar.end[i])
              {
@@ -1595,8 +1600,8 @@ compare_actual_formal (gfc_actual_arglist **ap, gfc_formal_arglist *formal,
             }
         }
 
-      actual_size = get_expr_storage_size(a->expr);
-      formal_size = get_sym_storage_size(f->sym);
+      actual_size = get_expr_storage_size (a->expr);
+      formal_size = get_sym_storage_size (f->sym);
       if (actual_size != 0 && actual_size < formal_size)
        {
          if (a->expr->ts.type == BT_CHARACTER && !f->sym->as && where)
index 0aec398b7f998d9af64d669b301c21bb13ef42ee..2c325a0950c3a7532f28f2c99b35834b0ed19552 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-08  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/32669
+       * gfortran.dg/argument_checking_6.f90: New.
+
 2007-07-08  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/25094
diff --git a/gcc/testsuite/gfortran.dg/argument_checking_6.f90 b/gcc/testsuite/gfortran.dg/argument_checking_6.f90
new file mode 100644 (file)
index 0000000..3742ab6
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! PR fortran/32669
+!
+! Contributed by Janus Weil <jaydub66@gmail.com>
+!
+program tfe
+implicit none
+
+real,dimension(-1:1) ::  w
+real,dimension(1:4) ::  x
+real,dimension(0:3) ::  y
+real,dimension(-1:2) ::  z
+
+call sub(x(:))
+call sub(y(:))
+call sub(z(:))
+call sub(w(:)) ! { dg-error "too few elements" }
+
+contains
+  subroutine sub(a)
+    implicit none
+    real,dimension(1:4) :: a
+  end subroutine sub
+end program tfe