From 15876ceeb1cfb8a8280eb05f15f01ce945fcad15 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sat, 22 Oct 2016 14:04:46 +0000 Subject: [PATCH] re PR fortran/78021 (Wrong result with optimization on character constant) 2016-10-22 Thomas Koenig PR fortran/78021 * gfc_compare_functions: Strings with different lengths in argument lists compare unequal. 2016-10-22 Thomas Koenig PR fortran/78021 * gfortran.dg/string_length_3.f90: New test. From-SVN: r241440 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/dependency.c | 23 ++++++++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/string_length_3.f90 | 19 +++++++++++++++++++ 4 files changed, 50 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 406ebb32..f5843bf 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-10-22 Thomas Koenig + + PR fortran/78021 + * gfc_compare_functions: Strings with different lengths in + argument lists compare unequal. + 2016-10-22 Andre Vehreschild PR fortran/43366 diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 8e78e43..82c5e6b 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -226,9 +226,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 74c2b09..8b09101 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-10-22 Thomas Koenig + + PR fortran/78021 + * gfortran.dg/string_length_3.f90: New test. + 2016-10-22 Andre Vehreschild Forgot to add on original commit. 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 0000000..e745eb9 --- /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.7.4