Hello world, this rather self-explanatory patch fixes a problem where two function invocations with 'c ' and 'c' as arguments were considered equal.
Regression-tested. OK for trunk and 6 and 5 branches? Regards Thomas 2016-10-22 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/78021 * gfc_compare_functions: Strings with different lengths in argument lists compare unequal. 2016-10-22 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/78021 * gfortran.dg/string_length-3.f90: New test.
! { 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" } }
Index: dependency.c =================================================================== --- dependency.c (Revision 240928) +++ dependency.c (Arbeitskopie) @@ -226,10 +226,27 @@ gfc_dep_compare_functions (gfc_expr *e1, gfc_expr 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; }