diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2009-01-05 14:34:02 -0500 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2009-01-05 14:34:02 -0500 |
commit | b55c4f04b3ede3f0b299553e6de822e7d63d2ea5 (patch) | |
tree | 1d1722549d8cbb51b27aa4567e09ce0373c1253a /gcc | |
parent | 2042cb0422f269f12bbffcbad6a5d63a27d19fd8 (diff) | |
download | gcc-b55c4f04b3ede3f0b299553e6de822e7d63d2ea5.zip gcc-b55c4f04b3ede3f0b299553e6de822e7d63d2ea5.tar.gz gcc-b55c4f04b3ede3f0b299553e6de822e7d63d2ea5.tar.bz2 |
re PR fortran/37159 (RANDOM_SEED: GET= check array size at compile time and respect -fdefault-integer-*)
gcc/fortran:
2009-01-05 Daniel Franke <franke.daniel@gmail.com>
PR fortran/37159
* check.c (gfc_check_random_seed): Added size check for GET
dummy argument, reworded error messages to follow common pattern.
gcc/testsuite:
2009-01-05 Daniel Franke <franke.daniel@gmail.com>
PR fortran/37159
* gfortran.dg/random_seed_1.f90: Updated.
From-SVN: r143089
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/check.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/random_seed_1.f90 | 30 |
4 files changed, 55 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a6622a0..8252bd4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2009-01-05 Daniel Franke <franke.daniel@gmail.com> + + PR fortran/37159 + * check.c (gfc_check_random_seed): Added size check for GET + dummy argument, reworded error messages to follow common pattern. + 2009-01-05 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/38672 diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 228ccb2..5b6a2eb 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -3136,14 +3136,15 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get) { unsigned int nargs = 0, kiss_size; locus *where = NULL; - mpz_t put_size; + mpz_t put_size, get_size; bool have_gfc_real_16; /* Try and mimic HAVE_GFC_REAL_16 in libgfortran. */ have_gfc_real_16 = gfc_validate_kind (BT_REAL, 16, true) != -1; - /* Keep these values in sync with kiss_size in libgfortran/random.c. */ - kiss_size = have_gfc_real_16 ? 12 : 8; - + /* Keep the number of bytes in sync with kiss_size in + libgfortran/intrinsics/random.c. */ + kiss_size = (have_gfc_real_16 ? 48 : 32) / gfc_default_integer_kind; + if (size != NULL) { if (size->expr_type != EXPR_VARIABLE @@ -3186,9 +3187,10 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get) if (gfc_array_size (put, &put_size) == SUCCESS && mpz_get_ui (put_size) < kiss_size) - gfc_error ("Array PUT of intrinsic %s is too small (%i/%i) at %L", - gfc_current_intrinsic, (int) mpz_get_ui (put_size), - kiss_size, where); + gfc_error ("Size of '%s' argument of '%s' intrinsic at %L " + "too small (%i/%i)", + gfc_current_intrinsic_arg[1], gfc_current_intrinsic, where, + (int) mpz_get_ui (put_size), kiss_size); } if (get != NULL) @@ -3214,6 +3216,13 @@ gfc_check_random_seed (gfc_expr *size, gfc_expr *put, gfc_expr *get) if (kind_value_check (get, 2, gfc_default_integer_kind) == FAILURE) return FAILURE; + + if (gfc_array_size (get, &get_size) == SUCCESS + && mpz_get_ui (get_size) < kiss_size) + gfc_error ("Size of '%s' argument of '%s' intrinsic at %L " + "too small (%i/%i)", + gfc_current_intrinsic_arg[2], gfc_current_intrinsic, where, + (int) mpz_get_ui (get_size), kiss_size); } /* RANDOM_SEED may not have more than one non-optional argument. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d2c47c..fbb3529 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-05 Daniel Franke <franke.daniel@gmail.com> + + PR fortran/37159 + * gfortran.dg/random_seed_1.f90: Updated. + 2009-01-05 Mikael Morin <mikael.morin@tele2.fr> PR fortran/38669 diff --git a/gcc/testsuite/gfortran.dg/random_seed_1.f90 b/gcc/testsuite/gfortran.dg/random_seed_1.f90 index 510badf..45627ff 100644 --- a/gcc/testsuite/gfortran.dg/random_seed_1.f90 +++ b/gcc/testsuite/gfortran.dg/random_seed_1.f90 @@ -6,9 +6,35 @@ ! Possible improvement: ! Provide a separate testcase for systems that support REAL(16), ! to test the minimum size of 12 (instead of 8). +! +! Updated to check for arrays of unexpected size, +! this also works for -fdefault-integer-8. +! PROGRAM random_seed_1 IMPLICIT NONE - INTEGER :: small(7) - CALL RANDOM_SEED(PUT=small) ! { dg-error "is too small" } + INTEGER, PARAMETER :: k = selected_real_kind (precision (0.0_8) + 1) + INTEGER, PARAMETER :: nbytes = MERGE(48, 32, k == 16) + + ! '+1' to avoid out-of-bounds warnings + INTEGER, PARAMETER :: n = nbytes / KIND(n) + 1 + INTEGER, DIMENSION(n) :: seed + + ! Get seed, array too small + CALL RANDOM_SEED(GET=seed(1:(n-2))) ! { dg-error "too small" } + + ! Get seed, array bigger than necessary + CALL RANDOM_SEED(GET=seed(1:n)) + + ! Get seed, proper size + CALL RANDOM_SEED(GET=seed(1:(n-1))) + + ! Put too few bytes + CALL RANDOM_SEED(PUT=seed(1:(n-2))) ! { dg-error "too small" } + + ! Put too many bytes + CALL RANDOM_SEED(PUT=seed(1:n)) + + ! Put the right amount of bytes + CALL RANDOM_SEED(PUT=seed(1:(n-1))) END PROGRAM random_seed_1 |