diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e95369805ab..8071e117e56 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2014-07-25 Tobias Burnus + + * simplify.c (gfc_simplify_storage_size): Use proper + integer kind for the returned value. + 2014-07-24 Uros Bizjak * intrinsic.texi (Intrinsic Procedures) : Move to diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 60d85934b72..d4a67ada3da 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -5841,11 +5841,9 @@ gfc_simplify_storage_size (gfc_expr *x, if (k == -1) return &gfc_bad_expr; - result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind, - &x->where); + result = gfc_get_constant_expr (BT_INTEGER, k, &x->where); mpz_set_si (result->value.integer, gfc_element_size (x)); - mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT); return range_check (result, "STORAGE_SIZE"); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 72ba8a7a8a8..ebf7badad82 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-07-25 Tobias Burnus + + * gfortran.dg/storage_size_5.f90: New. + 2014-07-25 Richard Biener PR middle-end/61762 diff --git a/gcc/testsuite/gfortran.dg/storage_size_5.f90 b/gcc/testsuite/gfortran.dg/storage_size_5.f90 new file mode 100644 index 00000000000..ae0f12661f0 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/storage_size_5.f90 @@ -0,0 +1,44 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! +subroutine test() + implicit none + integer :: i0, i1, i2, i3, i4 + i0 = kind(STORAGE_SIZE(5)) + i1 = kind(STORAGE_SIZE(5, kind=1)) + i2 = kind(STORAGE_SIZE(5, kind=2)) + i3 = kind(STORAGE_SIZE(5, kind=4)) + i4 = kind(STORAGE_SIZE(5, kind=8)) +end subroutine test + +subroutine test2(x) + implicit none + class(*) :: x + integer :: j0, j1, j2, j3, j4 + integer(1) :: k1 + integer(2) :: k2 + j0 = kind(STORAGE_SIZE(x)) + j1 = kind(STORAGE_SIZE(x, kind=1)) + j2 = kind(STORAGE_SIZE(x, kind=2)) + j3 = kind(STORAGE_SIZE(x, kind=4)) + j4 = kind(STORAGE_SIZE(x, kind=8)) + + k1 = STORAGE_SIZE(x, kind=1) + k2 = STORAGE_SIZE(x, kind=2) +end subroutine test2 + +! { dg-final { scan-tree-dump-times "i0 = 4;" 1 "original" } } +! { dg-final { scan-tree-dump-times "i1 = 1;" 1 "original" } } +! { dg-final { scan-tree-dump-times "i2 = 2;" 1 "original" } } +! { dg-final { scan-tree-dump-times "i3 = 4;" 1 "original" } } +! { dg-final { scan-tree-dump-times "i4 = 8;" 1 "original" } } +! { dg-final { scan-tree-dump-times "j0 = 4;" 1 "original" } } + +! { dg-final { scan-tree-dump-times "j1 = 1;" 1 "original" } } +! { dg-final { scan-tree-dump-times "j2 = 2;" 1 "original" } } +! { dg-final { scan-tree-dump-times "j3 = 4;" 1 "original" } } +! { dg-final { scan-tree-dump-times "j4 = 8;" 1 "original" } } + +! { dg-final { scan-tree-dump-times "k1 = \\(integer\\(kind=1\\)\\)" 1 "original" } } +! { dg-final { scan-tree-dump-times "k2 = \\(integer\\(kind=2\\)\\)" 1 "original" } } +! { dg-final { cleanup-tree-dump "original" } }