Message ID | 20151026011639.GA34497@troutmask.apl.washington.edu |
---|---|
State | New |
Headers | show |
> 2015-10-25 Steven G. Kargl <kargl@gcc.gnu.org> > > PR fortran/36192 > * array.c (gfc_ref_dimen_size): Check for BT_INTEGER before calling > mpz_set. > > > 2015-10-25 Steven G. Kargl <kargl@gcc.gnu.org> > > PR fortran/36192 > * gfortran.dg/pr36192.f90: New test. OK. But I don’t understand why the testcase’s dg-error pattern has this form: a regex “or” (|) of two identical strings? FX
On Mon, Oct 26, 2015 at 09:49:10AM +0100, FX wrote: > > 2015-10-25 Steven G. Kargl <kargl@gcc.gnu.org> > > > > PR fortran/36192 > > * array.c (gfc_ref_dimen_size): Check for BT_INTEGER before calling > > mpz_set. > > > > > > 2015-10-25 Steven G. Kargl <kargl@gcc.gnu.org> > > > > PR fortran/36192 > > * gfortran.dg/pr36192.f90: New test. > > OK. But I don???t understand why the testcase???s dg-error pattern has this form: a regex ???or??? (|) of two identical strings? > Because the code issues two errors, one for each dimension. I thought testing for the third (which I prune) to be excessive. laptop-kargl:kargl[202] gfc -c pr36192.f90 pr36192.f90:6:18: real, dimension(n,d) :: x ! { dg-error "of INTEGER type|of INTEGER type" } 1 Error: Expression at (1) must be of INTEGER type, found REAL pr36192.f90:6:20: real, dimension(n,d) :: x ! { dg-error "of INTEGER type|of INTEGER type" } 1 Error: Expression at (1) must be of INTEGER type, found REAL pr36192.f90:6:27: real, dimension(n,d) :: x ! { dg-error "of INTEGER type|of INTEGER type" } 1 Error: The module or main program array 'x' at (1) must have constant shape
> Because the code issues two errors, one for each dimension.
Then shouldn’t it be “string.*string” to match two occurences of the string, with some stuff (incl. newline) in the middle?
FX
On Mon, Oct 26, 2015 at 03:43:37PM +0100, FX wrote: > > Because the code issues two errors, one for each dimension. > > Then shouldn???t it be ???string.*string??? to match > two occurences of the string, with some stuff (incl. newline) in the middle? > I don't know dejagnu well enough to know if some other regex pattern would capture all 3 errors. I'm simply using the advice given on the wiki: https://gcc.gnu.org/wiki/TestCaseWriting If you have a better pattern, I'm more than willing to change the testcase. The point of the testcase isn't to see if 3 errors messages or even 1 error message is issued. The testcase demonstrates that the segfault in F951 (caused by calling mpz_set with an invalid mpz_t) does not happen.
Index: gcc/fortran/array.c =================================================================== --- gcc/fortran/array.c (revision 229301) +++ gcc/fortran/array.c (working copy) @@ -2208,7 +2208,8 @@ gfc_ref_dimen_size (gfc_array_ref *ar, i if (ar->start[dimen] == NULL) { if (ar->as->lower[dimen] == NULL - || ar->as->lower[dimen]->expr_type != EXPR_CONSTANT) + || ar->as->lower[dimen]->expr_type != EXPR_CONSTANT + || ar->as->lower[dimen]->ts.type != BT_INTEGER) goto cleanup; mpz_set (lower, ar->as->lower[dimen]->value.integer); } @@ -2222,7 +2223,8 @@ gfc_ref_dimen_size (gfc_array_ref *ar, i if (ar->end[dimen] == NULL) { if (ar->as->upper[dimen] == NULL - || ar->as->upper[dimen]->expr_type != EXPR_CONSTANT) + || ar->as->upper[dimen]->expr_type != EXPR_CONSTANT + || ar->as->upper[dimen]->ts.type != BT_INTEGER) goto cleanup; mpz_set (upper, ar->as->upper[dimen]->value.integer); } Index: gcc/testsuite/gfortran.dg/pr36192.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr36192.f90 (revision 0) +++ gcc/testsuite/gfortran.dg/pr36192.f90 (working copy) @@ -0,0 +1,9 @@ +! { dg-do compile } +! PR fortran/36192.f90 +! +program three_body + real, parameter :: n = 2, d = 2 + real, dimension(n,d) :: x ! { dg-error "of INTEGER type|of INTEGER type" } + x(1,:) = (/ 1.0, 0.0 /) +end program three_body +! { dg-prune-output "have constant shape" }