diff options
author | kargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-10-05 21:59:16 +0000 |
---|---|---|
committer | kargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-10-05 21:59:16 +0000 |
commit | 6350aaa27fd6d5dbe4c85f1463cbd8408b6ef026 (patch) | |
tree | d4030f2b4934b9ee99848b4f04f257c853667bf2 | |
parent | d19f839874f9ce1b580e6b8b2b57c7ef655bc0d3 (diff) | |
download | gcc-6350aaa27fd6d5dbe4c85f1463cbd8408b6ef026.tar.gz |
2016-10-05 Steven G. Kargl <kargls@gcc.gnu.org>
PR fortran/58991
PR fortran/58992
* resolve.c (resolve_assoc_var): Fix CHARACTER type-spec for a
selector in ASSOCIATE.
(resolve_fl_variable): Skip checks for an ASSOCIATE variable.
2016-10-05 Steven G. Kargl <kargls@gcc.gnu.org>
PR fortran/58991
PR fortran/58992
* gfortran.dg/associate_22.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@240813 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/associate_22.f90 | 37 |
4 files changed, 64 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index bfea37c528f..3ec2a8e4b5c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2016-10-05 Steven G. Kargl <kargls@gcc.gnu.org> + + PR fortran/58991 + PR fortran/58992 + * resolve.c (resolve_assoc_var): Fix CHARACTER type-spec for a + selector in ASSOCIATE. + (resolve_fl_variable): Skip checks for an ASSOCIATE variable. + 2016-09-28 Steven G. Kargl <kargl@gcc.gnu.org> Backport from trunk diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index a7108ce73bd..34998554706 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -8244,6 +8244,18 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) /* Mark this as an associate variable. */ sym->attr.associate_var = 1; + /* Fix up the type-spec for CHARACTER types. */ + if (sym->ts.type == BT_CHARACTER && !sym->attr.select_type_temporary) + { + if (!sym->ts.u.cl) + sym->ts.u.cl = target->ts.u.cl; + + if (!sym->ts.u.cl->length) + sym->ts.u.cl->length + = gfc_get_int_expr (gfc_default_integer_kind, + NULL, target->value.character.length); + } + /* If the target is a good class object, so is the associate variable. */ if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok) sym->attr.class_ok = 1; @@ -11558,7 +11570,7 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag) if (!deferred_requirements (sym)) return false; - if (sym->ts.type == BT_CHARACTER) + if (sym->ts.type == BT_CHARACTER && !sym->attr.associate_var) { /* Make sure that character string variables with assumed length are dummy arguments. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c3c50b6c7ba..cf5f492ca0f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-10-05 Steven G. Kargl <kargls@gcc.gnu.org> + + PR fortran/58991 + PR fortran/58992 + * gfortran.dg/associate_22.f90: New test. + 2016-10-04 Martin Sebor <msebor@redhat.com> * g++.dg/warn/Wplacement-new-size-4.C: Use relative line number diff --git a/gcc/testsuite/gfortran.dg/associate_22.f90 b/gcc/testsuite/gfortran.dg/associate_22.f90 new file mode 100644 index 00000000000..1558992004d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/associate_22.f90 @@ -0,0 +1,37 @@ +! { dg-do run } +program foo + + implicit none + + character(len=4) :: s + character(len=10) :: a + + ! This works. + s = 'abc' + associate(t => s) + if (trim(t) /= 'abc') call abort + end associate + + ! This failed. + associate(u => 'abc') + if (trim(u) /= 'abc') call abort + end associate + + ! This failed. + a = s // 'abc' + associate(v => s // 'abc') + if (trim(v) /= trim(a)) call abort + end associate + + ! This failed. + a = trim(s) // 'abc' + associate(w => trim(s) // 'abc') + if (trim(w) /= trim(a)) call abort + end associate + + ! This failed. + associate(x => trim('abc')) + if (trim(x) /= 'abc') call abort + end associate + +end program foo |