summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>2016-10-05 21:59:16 +0000
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>2016-10-05 21:59:16 +0000
commit6350aaa27fd6d5dbe4c85f1463cbd8408b6ef026 (patch)
treed4030f2b4934b9ee99848b4f04f257c853667bf2
parentd19f839874f9ce1b580e6b8b2b57c7ef655bc0d3 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/fortran/resolve.c14
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/associate_22.f9037
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