aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2007-12-23 19:17:08 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2007-12-23 19:17:08 +0100
commit107d5ff67f3558b6fc77dfa51d0ccefc29eb7f49 (patch)
tree6d94f9d12e63cdb537bbdf4ef60b0ba7f3f36654 /gcc
parent57c65fb59c62beb1cbe6db6be2e42c0a9a077915 (diff)
downloadgcc-107d5ff67f3558b6fc77dfa51d0ccefc29eb7f49.zip
gcc-107d5ff67f3558b6fc77dfa51d0ccefc29eb7f49.tar.gz
gcc-107d5ff67f3558b6fc77dfa51d0ccefc29eb7f49.tar.bz2
re PR fortran/34421 (ENTRY functions: Character with different stringlength not rejected)
2007-12-23 Tobias Burnus <burnus@net-b.de> PR fortran/34421 * resolve.c (resolve_entries): Add standard error for functions returning characters with different length. 2007-12-23 Tobias Burnus <burnus@net-b.de> PR fortran/34421 * gfortran.dg/entry_17.f90: New. From-SVN: r131150
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c21
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/entry_17.f9055
4 files changed, 85 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 6e99243..9db44b2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2007-12-23 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/34421
+ * resolve.c (resolve_entries): Add standard error for functions
+ returning characters with different length.
+
2007-12-23 Daniel Franke <franke.daniel@gmail.com>
PR fortran/34536
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 6289d5d..8fc679d 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -488,11 +488,28 @@ resolve_entries (gfc_namespace *ns)
|| (el->sym->result->attr.pointer
!= ns->entries->sym->result->attr.pointer))
break;
-
else if (as && fas && gfc_compare_array_spec (as, fas) == 0)
- gfc_error ("Procedure %s at %L has entries with mismatched "
+ gfc_error ("Function %s at %L has entries with mismatched "
"array specifications", ns->entries->sym->name,
&ns->entries->sym->declared_at);
+ /* The characteristics need to match and thus both need to have
+ the same string length, i.e. both len=*, or both len=4.
+ Having both len=<variable> is also possible, but difficult to
+ check at compile time. */
+ else if (ts->type == BT_CHARACTER && ts->cl && fts->cl
+ && (((ts->cl->length && !fts->cl->length)
+ ||(!ts->cl->length && fts->cl->length))
+ || (ts->cl->length
+ && ts->cl->length->expr_type
+ != fts->cl->length->expr_type)
+ || (ts->cl->length
+ && ts->cl->length->expr_type == EXPR_CONSTANT
+ && mpz_cmp (ts->cl->length->value.integer,
+ fts->cl->length->value.integer) != 0)))
+ gfc_notify_std (GFC_STD_GNU, "Extension: Function %s at %L with "
+ "entries returning variables of different "
+ "string lengths", ns->entries->sym->name,
+ &ns->entries->sym->declared_at);
}
if (el == NULL)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4b540f0..9f5aa26 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-23 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/34421
+ * gfortran.dg/entry_17.f90: New.
+
2007-12-23 Daniel Franke <franke.daniel@gmail.com>
PR fortran/34536
diff --git a/gcc/testsuite/gfortran.dg/entry_17.f90 b/gcc/testsuite/gfortran.dg/entry_17.f90
new file mode 100644
index 0000000..d466266
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/entry_17.f90
@@ -0,0 +1,55 @@
+function test1(n)
+ integer :: n
+ character(n) :: test1
+ character(n) :: bar1
+ test1 = ""
+ return
+entry bar1()
+ bar1 = ""
+end function test1
+
+function test2()
+ character(1) :: test2
+ character(1) :: bar2
+ test2 = ""
+ return
+entry bar2()
+ bar2 = ""
+end function test2
+
+function test3() ! { dg-warning "is obsolescent" }
+ character(*) :: test3
+ character(*) :: bar3 ! { dg-warning "is obsolescent" }
+ test3 = ""
+ return
+entry bar3()
+ bar3 = ""
+end function test3 ! { dg-warning "is obsolescent" }
+
+function test4(n) ! { dg-error "returning variables of different string lengths" }
+ integer :: n
+ character(n) :: test4
+ character(*) :: bar4 ! { dg-warning "is obsolescent" }
+ test4 = ""
+ return
+entry bar4()
+ bar4 = ""
+end function test4
+
+function test5() ! { dg-error "returning variables of different string lengths" }
+ character(1) :: test5
+ character(2) :: bar5
+ test5 = ""
+ return
+entry bar5()
+ bar5 = ""
+end function test5
+
+function test6() ! { dg-warning "is obsolescent|returning variables of different string lengths" }
+ character(*) :: test6
+ character(2) :: bar6
+ test6 = ""
+ return
+entry bar6()
+ bar6 = ""
+end function test6 ! { dg-warning "is obsolescent" }