From: burnus Date: Fri, 7 Jun 2013 15:05:47 +0000 (+0000) Subject: 2013-06-07 Tobias Burnus X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aa21bb5ddf911fb4adb85f056bfa4dd0a3712980;p=thirdparty%2Fgcc.git 2013-06-07 Tobias Burnus PR fortran/57549 * array.c (gfc_match_array_constructor): Call gfc_match_type_spec instead of gfc_match_decl_type_spec. * match.c (gfc_match_type_spec): Renamed from match_type_spec. (gfc_match_type_is, gfc_match_allocate): Update call. * match.h (gfc_match_type_spec): Add prototype. 2013-06-07 Tobias Burnus PR fortran/57549 * gfortran.dg/array_constructor_48.f90: New. * gfortran.dg/array_constructor_type_14.f03: Correct test case. * gfortran.dg/array_constructor_type_15.f03: Ditto. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199820 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6b9093bce19b..9e577d8163eb 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2013-06-07 Tobias Burnus + + PR fortran/57549 + * array.c (gfc_match_array_constructor): Call + gfc_match_type_spec instead of gfc_match_decl_type_spec. + * match.c (gfc_match_type_spec): Renamed from match_type_spec. + (gfc_match_type_is, gfc_match_allocate): Update call. + * match.h (gfc_match_type_spec): Add prototype. + 2013-06-07 Tobias Burnus PR fortran/57556 diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index c2ac1ece1e65..c6b8eb9f96a7 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -1073,7 +1073,7 @@ gfc_match_array_constructor (gfc_expr **result) /* Try to match an optional "type-spec ::" */ gfc_clear_ts (&ts); gfc_new_undo_checkpoint (changed_syms); - if (gfc_match_decl_type_spec (&ts, 0) == MATCH_YES) + if (gfc_match_type_spec (&ts) == MATCH_YES) { seen_ts = (gfc_match (" ::") == MATCH_YES); diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index b44d8157717a..2533584246b6 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -1937,8 +1937,8 @@ match_derived_type_spec (gfc_typespec *ts) the implicit_flag is not needed, so it was removed. Derived types are identified by their name alone. */ -static match -match_type_spec (gfc_typespec *ts) +match +gfc_match_type_spec (gfc_typespec *ts) { match m; locus old_locus; @@ -3426,7 +3426,7 @@ gfc_match_allocate (void) /* Match an optional type-spec. */ old_locus = gfc_current_locus; - m = match_type_spec (&ts); + m = gfc_match_type_spec (&ts); if (m == MATCH_ERROR) goto cleanup; else if (m == MATCH_NO) @@ -5502,7 +5502,7 @@ gfc_match_type_is (void) c = gfc_get_case (); c->where = gfc_current_locus; - if (match_type_spec (&c->ts) == MATCH_ERROR) + if (gfc_match_type_spec (&c->ts) == MATCH_ERROR) goto cleanup; if (gfc_match_char (')') != MATCH_YES) diff --git a/gcc/fortran/match.h b/gcc/fortran/match.h index ac8b9f846960..1a701f04f39e 100644 --- a/gcc/fortran/match.h +++ b/gcc/fortran/match.h @@ -59,6 +59,8 @@ match gfc_match_char (char); match gfc_match (const char *, ...); match gfc_match_iterator (gfc_iterator *, int); match gfc_match_parens (void); +match gfc_match_type_spec (gfc_typespec *); + /* Statement matchers. */ match gfc_match_program (void); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9c2ff38c1115..5838061f20e3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-06-07 Tobias Burnus + + PR fortran/57549 + * gfortran.dg/array_constructor_48.f90: New. + * gfortran.dg/array_constructor_type_14.f03: Correct test case. + * gfortran.dg/array_constructor_type_15.f03: Ditto. + 2013-06-07 Kyrylo Tkachov PR target/56315 diff --git a/gcc/testsuite/gfortran.dg/array_constructor_48.f90 b/gcc/testsuite/gfortran.dg/array_constructor_48.f90 new file mode 100644 index 000000000000..5916eddf838b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/array_constructor_48.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! +! PR fortran/57549 +! +! Contributed by Vladimir Fuka +! + type t + end type + type(t),allocatable :: a(:) + a = [t::t()] + print *, [ integer :: ] +end + +subroutine invalid() + print *, [ type(integer) :: ] ! { dg-error "Syntax error in array constructor" } + print *, [ type(tt) :: ] ! { dg-error "Syntax error in array constructor" } +end subroutine invalid diff --git a/gcc/testsuite/gfortran.dg/array_constructor_type_14.f03 b/gcc/testsuite/gfortran.dg/array_constructor_type_14.f03 index 04ac728010a2..0e24334dcfc8 100644 --- a/gcc/testsuite/gfortran.dg/array_constructor_type_14.f03 +++ b/gcc/testsuite/gfortran.dg/array_constructor_type_14.f03 @@ -16,7 +16,7 @@ PROGRAM test TYPE(foo), DIMENSION(2) :: arr - arr = (/ TYPE(foo) :: x, foo(0, 1.) /) + arr = (/ foo :: x, foo(0, 1.) /) IF (arr(1)%i /= 42 .OR. arr(1)%x /= 42. .OR. & arr(2)%i /= 0 .OR. arr(2)%x /= 1.) THEN CALL abort() diff --git a/gcc/testsuite/gfortran.dg/array_constructor_type_15.f03 b/gcc/testsuite/gfortran.dg/array_constructor_type_15.f03 index 20736988b5ae..a94655562e95 100644 --- a/gcc/testsuite/gfortran.dg/array_constructor_type_15.f03 +++ b/gcc/testsuite/gfortran.dg/array_constructor_type_15.f03 @@ -18,5 +18,5 @@ PROGRAM test TYPE(foo), PARAMETER :: x = foo(42, 42.) - WRITE (*,*) (/ TYPE(foo) :: x, foo(0, 1.), bar(.TRUE.) /) ! { dg-error "convert TYPE" } + WRITE (*,*) (/ foo :: x, foo(0, 1.), bar(.TRUE.) /) ! { dg-error "convert TYPE" } END PROGRAM test