public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Patch, Fortran] PR57549 - fix type-spec handling with array constructors
@ 2013-06-07 14:03 Tobias Burnus
  2013-06-07 14:50 ` Steve Kargl
  0 siblings, 1 reply; 2+ messages in thread
From: Tobias Burnus @ 2013-06-07 14:03 UTC (permalink / raw)
  To: gcc patches, gfortran

[-- Attachment #1: Type: text/plain, Size: 723 bytes --]

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

[-- Attachment #2: array-constr-ts.diff --]
[-- Type: text/x-patch, Size: 4099 bytes --]

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Patch, Fortran] PR57549 - fix type-spec handling with array constructors
  2013-06-07 14:03 [Patch, Fortran] PR57549 - fix type-spec handling with array constructors Tobias Burnus
@ 2013-06-07 14:50 ` Steve Kargl
  0 siblings, 0 replies; 2+ messages in thread
From: Steve Kargl @ 2013-06-07 14:50 UTC (permalink / raw)
  To: Tobias Burnus; +Cc: gcc patches, gfortran

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.

-- 
Steve

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-06-07 14:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-07 14:03 [Patch, Fortran] PR57549 - fix type-spec handling with array constructors Tobias Burnus
2013-06-07 14:50 ` Steve Kargl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).