Patchwork [Fortran] PR57549 - fix type-spec handling with array constructors

login
register
mail settings
Submitter Tobias Burnus
Date June 7, 2013, 2:03 p.m.
Message ID <51B1E848.1040302@net-b.de>
Download mbox | patch
Permalink /patch/249731/
State New
Headers show

Comments

Tobias Burnus - June 7, 2013, 2:03 p.m.
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
Steve Kargl - June 7, 2013, 2:50 p.m.
On Fri, Jun 07, 2013 at 04:03:52PM +0200, Tobias Burnus wrote:
> 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?
> 

OK.  Thanks for the patch.

Patch

2013-06-07  Tobias Burnus  <burnus@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  <burnus@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