+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
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;
+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.
--- /dev/null
+! { 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" } }