From 15c7455d0104af2aab90b27a53e5dd8faabf6d2a Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Mon, 24 Oct 2016 22:12:06 +0000 Subject: [PATCH] backport: re PR fortran/78021 (Wrong result with optimization on character constant) 2016-10-24 Thomas Koenig Backport from trunk PR fortran/78021 * gfc_compare_functions: Strings with different lengths in argument lists compare unequal. 2016-10-24 Thomas Koenig Backport from trunk PR fortran/78021 * gfortran.dg/string_length_3.f90: New test. From-SVN: r241498 --- gcc/fortran/ChangeLog | 7 ++++++ gcc/fortran/dependency.c | 23 ++++++++++++++++--- gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gfortran.dg/string_length_3.f90 | 19 +++++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/string_length_3.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3c392a69f934..1f812f78c95d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016-10-24 Thomas Koenig + + Backport from trunk + PR fortran/78021 + * gfc_compare_functions: Strings with different lengths in + argument lists compare unequal. + 2016-10-24 Steven G. Kargl PR fortran/71895 diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 40adbe4a57f4..37adcc1b9b6f 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -227,9 +227,26 @@ gfc_dep_compare_functions (gfc_expr *e1, gfc_expr *e2, bool impure_ok) if ((args1->expr == NULL) ^ (args2->expr == NULL)) return -2; - if (args1->expr != NULL && args2->expr != NULL - && gfc_dep_compare_expr (args1->expr, args2->expr) != 0) - return -2; + if (args1->expr != NULL && args2->expr != NULL) + { + gfc_expr *e1, *e2; + e1 = args1->expr; + e2 = args2->expr; + + if (gfc_dep_compare_expr (e1, e2) != 0) + return -2; + + /* Special case: String arguments which compare equal can have + different lengths, which makes them different in calls to + procedures. */ + + if (e1->expr_type == EXPR_CONSTANT + && e1->ts.type == BT_CHARACTER + && e2->expr_type == EXPR_CONSTANT + && e2->ts.type == BT_CHARACTER + && e1->value.character.length != e2->value.character.length) + return -2; + } args1 = args1->next; args2 = args2->next; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d9c8de752bf5..3700eabf635e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-10-24 Thomas Koenig + + Backport from trunk + PR fortran/78021 + * gfortran.dg/string_length_3.f90: New test. + 2016-10-24 Steven G. Kargl PR fortran/71895 diff --git a/gcc/testsuite/gfortran.dg/string_length_3.f90 b/gcc/testsuite/gfortran.dg/string_length_3.f90 new file mode 100644 index 000000000000..e745eb9fdfac --- /dev/null +++ b/gcc/testsuite/gfortran.dg/string_length_3.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +! { dg-options "-ffrontend-optimize -fdump-tree-original" } +! PR 78021 - calls to mylen were folded after shortening the +! argument list. + +PROGRAM test_o_char + implicit none + integer :: n + n = mylen('c') + mylen('c ') + if (n /= 5) call abort +CONTAINS + + FUNCTION mylen(c) + CHARACTER(len=*),INTENT(in) :: c + INTEGER :: mylen + mylen=LEN(c) + END FUNCTION mylen +END PROGRAM test_o_char +! { dg-final { scan-tree-dump-times "__var" 0 "original" } } -- 2.47.2