Unreviewed patches:
* http://gcc.gnu.org/ml/fortran/2013-06/msg00027.html
* http://gcc.gnu.org/ml/fortran/2013-06/msg00048.html
* * *
As with ALLOCATE (type-spec :: ...), also array constructors take as
type-spec a type name ("integer, my_dt, etc.) without an extra TYPE().
Thus, instead of using the decl.c var decl function, we use the same as
for allocate.
Build and regtested on x86-64-gnu-linux.
OK for the trunk?
From the standard:
The Fortran 2008 standard has:
R469 ac-spec is type-spec ::
or [type-spec ::] ac-value-list
R402 type-spec is intrinsic-type-spec
or derived-type-spec
R453 derived-type-spec is type-name [ ( type-param-spec-list ) ]
Tobias
2013-06-07 Tobias Burnus <bur...@net-b.de>
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 <bur...@net-b.de>
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.
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index c2ac1ec..c6b8eb9 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 b44d815..2533584 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 ac8b9f8..1a701f0 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);
--- /dev/null 2013-06-07 09:13:23.024185858 +0200
+++ gcc/gcc/testsuite/gfortran.dg/array_constructor_48.f90 2013-06-07 15:52:28.578691018 +0200
@@ -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 04ac728..0e24334 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 2073698..a946555 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