aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDaniel Kraft <d@domob.eu>2008-09-05 13:56:23 +0200
committerDaniel Kraft <domob@gcc.gnu.org>2008-09-05 13:56:23 +0200
commitebac6d9cb9f255b379fffcff4ba871d5b74d39d7 (patch)
treec4c56bb9e4866146e02d77626b3ddd228ce9dee8 /gcc
parent719bb4e3d3f7d9e3e59f97141a54fe633a77b46d (diff)
downloadgcc-ebac6d9cb9f255b379fffcff4ba871d5b74d39d7.zip
gcc-ebac6d9cb9f255b379fffcff4ba871d5b74d39d7.tar.gz
gcc-ebac6d9cb9f255b379fffcff4ba871d5b74d39d7.tar.bz2
re PR fortran/36746 (Rejects variable which is implictly typed as derived typed with DIMENSION)
2008-09-05 Daniel Kraft <d@domob.eu> PR fortran/36746 * primary.c (gfc_match_rvalue): Removed logic to handle implicit typing to a derived-type if a component reference is found. (gfc_match_varspec): Moved it here. 2008-09-05 Daniel Kraft <d@domob.eu> PR fortran/36746 * gfortran.dg/implicit_derived_type_1.f90: New test. * gfortran.dg/used_before_typed_5.f90: New test. From-SVN: r140034
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/primary.c8
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/implicit_derived_type_1.f9020
-rw-r--r--gcc/testsuite/gfortran.dg/used_before_typed_5.f9019
5 files changed, 56 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 459aeb9..d9c65ff 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2008-09-05 Daniel Kraft <d@domob.eu>
+
+ PR fortran/36746
+ * primary.c (gfc_match_rvalue): Removed logic to handle implicit
+ typing to a derived-type if a component reference is found.
+ (gfc_match_varspec): Moved it here.
+
2008-09-04 Richard Guenther <rguenther@suse.de>
* trans-array.c (gfc_conv_array_parameter): Use correct types
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 6689443..04c24eb7 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1745,6 +1745,10 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag)
if (equiv_flag)
return MATCH_YES;
+ if (sym->ts.type == BT_UNKNOWN && gfc_peek_ascii_char () == '%'
+ && gfc_get_default_type (sym, sym->ns)->type == BT_DERIVED)
+ gfc_set_default_type (sym, 0, sym->ns);
+
if (sym->ts.type != BT_DERIVED || gfc_match_char ('%') != MATCH_YES)
goto check_substring;
@@ -2434,10 +2438,6 @@ gfc_match_rvalue (gfc_expr **result)
{
case FL_VARIABLE:
variable:
- if (sym->ts.type == BT_UNKNOWN && gfc_peek_ascii_char () == '%'
- && gfc_get_default_type (sym, sym->ns)->type == BT_DERIVED)
- gfc_set_default_type (sym, 0, sym->ns);
-
e = gfc_get_expr ();
e->expr_type = EXPR_VARIABLE;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ea503fd..4c683eb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2008-09-05 Daniel Kraft <d@domob.eu>
+
+ PR fortran/36746
+ * gfortran.dg/implicit_derived_type_1.f90: New test.
+ * gfortran.dg/used_before_typed_5.f90: New test.
+
2008-09-04 Jan Hubicka <jh@suse.cz>
* gcc.target/i386/cold-attribute-1.c: Update testcase.
diff --git a/gcc/testsuite/gfortran.dg/implicit_derived_type_1.f90 b/gcc/testsuite/gfortran.dg/implicit_derived_type_1.f90
new file mode 100644
index 0000000..baa36d1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/implicit_derived_type_1.f90
@@ -0,0 +1,20 @@
+! { dg-do compile }
+
+! PR fortran/36746
+! Check that parsing of component references for symbols with IMPLICIT
+! derived-type works.
+
+! Reduced test from the PR.
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+module m
+ type t
+ integer :: i
+ end type t
+contains
+ subroutine s(x)
+ implicit type(t)(x)
+ dimension x(:)
+ print *, x(1)%i
+ end subroutine s
+end module m
diff --git a/gcc/testsuite/gfortran.dg/used_before_typed_5.f90 b/gcc/testsuite/gfortran.dg/used_before_typed_5.f90
new file mode 100644
index 0000000..9e78e68
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/used_before_typed_5.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! { dg-options "-pedantic -std=f95" }
+
+! Check that DIMENSION/POINTER/ALLOCATABLE/INTENT statements *do* allow
+! symbols to be typed later.
+
+SUBROUTINE test (a)
+ IMPLICIT REAL (a-z)
+
+ ! Those should *not* IMPLICIT-type the symbols:
+ INTENT(IN) :: a
+ DIMENSION :: b(:)
+ POINTER :: c
+ ALLOCATABLE :: b
+
+ ! So this is ok:
+ INTEGER :: a, b, c
+
+END SUBROUTINE test