aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2007-07-08 22:57:07 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2007-07-08 22:57:07 +0200
commit376397285d1564cb838083028fa24286cd101ca6 (patch)
tree0e1ed7a049e8faab2faa803ed51ef349d0884bb6
parent83b2e4e821557b90ed8a6cd4fa1cf3ec6e69e28a (diff)
downloadgcc-376397285d1564cb838083028fa24286cd101ca6.zip
gcc-376397285d1564cb838083028fa24286cd101ca6.tar.gz
gcc-376397285d1564cb838083028fa24286cd101ca6.tar.bz2
re PR fortran/32669 ("Actual argument contains too few elements for dummy argument" is triggered for valid code)
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
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/interface.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/argument_checking_6.f9024
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index bda3726..78d50f1 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index c50e0bf..8591182 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0aec398..2c325a0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..3742ab6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/argument_checking_6.f90
@@ -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