aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/dependency.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/string_length_3.f9019
4 files changed, 50 insertions, 3 deletions
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 <tkoenig@gcc.gnu.org>
+
+ PR fortran/78021
+ * gfc_compare_functions: Strings with different lengths in
+ argument lists compare unequal.
+
2016-10-22 Andre Vehreschild <vehre@gcc.gnu.org>
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 <tkoenig@gcc.gnu.org>
+
+ PR fortran/78021
+ * gfortran.dg/string_length_3.f90: New test.
+
2016-10-22 Andre Vehreschild <vehre@gcc.gnu.org>
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..e745eb9f
--- /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" } }