aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-01-24 09:10:47 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2010-01-24 09:10:47 +0100
commit23f6293ee8a55bcfa45caa456d86dc403315ce68 (patch)
tree75fbe25735a40e15dfd44c35008a3b60ec13b89e /gcc
parent48634cdbedb800727021315512addccd32c0de91 (diff)
downloadgcc-23f6293ee8a55bcfa45caa456d86dc403315ce68.zip
gcc-23f6293ee8a55bcfa45caa456d86dc403315ce68.tar.gz
gcc-23f6293ee8a55bcfa45caa456d86dc403315ce68.tar.bz2
re PR fortran/39304 (ICE with MATMUL, specific/generic functions and rank checking)
2010-01-24 Tobias Burnus <burnus@net-b.de> PR fortran/39304 * array.c (gfc_array_dimen_size): Use correct specific function in the check. 2010-01-24 Tobias Burnus <burnus@net-b.de> PR fortran/39304 * gfortran.dg/generic_20.f90: New test. From-SVN: r156195
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/array.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/generic_20.f9031
4 files changed, 51 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 84dcaae..ae4fa51 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-24 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/39304
+ * array.c (gfc_array_dimen_size): Use correct specific
+ function in the check.
+
2010-01-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/42736
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 7bb5100..139609c 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -2053,7 +2053,15 @@ gfc_array_dimen_size (gfc_expr *array, int dimen, mpz_t *result)
return SUCCESS;
}
- if (spec_dimen_size (array->symtree->n.sym->as, dimen, result) == FAILURE)
+ if (array->symtree->n.sym->attr.generic
+ && !array->symtree->n.sym->attr.intrinsic)
+ {
+ if (spec_dimen_size (array->value.function.esym->as, dimen, result)
+ == FAILURE)
+ return FAILURE;
+ }
+ else if (spec_dimen_size (array->symtree->n.sym->as, dimen, result)
+ == FAILURE)
return FAILURE;
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e321412..c9a6fdc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-24 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/39304
+ * gfortran.dg/generic_20.f90: New test.
+
2010-01-22 Michael Matz <matz@suse.de>
* gfortran.dg/vect/fast-math-mgrid-resid.f: Limit to x86, add
diff --git a/gcc/testsuite/gfortran.dg/generic_20.f90 b/gcc/testsuite/gfortran.dg/generic_20.f90
new file mode 100644
index 0000000..04a57b0
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/generic_20.f90
@@ -0,0 +1,31 @@
+! { dg-do run }
+!
+! PR fortran/39304
+!
+! matmul checking was checking the wrong specific function
+! ("one" instead of "two")
+!
+module m
+ implicit none
+ interface one
+ module procedure one, two
+ end interface one
+contains
+ function one()
+ real :: one(1)
+ one = 0.0
+ end function one
+ function two(x)
+ real :: x
+ real :: two(1,1)
+ two = reshape ( (/ x /), (/ 1, 1 /) )
+ end function two
+end module m
+
+use m
+real :: res(1)
+res = matmul (one(2.0), (/ 2.0/))
+if (abs (res(1)-4.0) > epsilon (res)) call abort ()
+end
+
+! { dg-final { cleanup-modules "m" } }