Fix fortran/85982 ICE in resolve_component.
authorFritz Reese <foreese@gcc.gnu.org>
Thu, 2 Apr 2020 17:50:11 +0000 (13:50 -0400)
committerFritz Reese <foreese@gcc.gnu.org>
Thu, 2 Apr 2020 17:50:11 +0000 (13:50 -0400)
2020-04-01  Fritz Reese  <foreese@gcc.gnu.org>

PR fortran/85982
* fortran/decl.c (match_attr_spec): Lump COMP_STRUCTURE/COMP_MAP into
attribute checking used by TYPE.

2020-04-01  Fritz Reese  <foreese@gcc.gnu.org>

PR fortran/85982
* gfortran.dg/dec_structure_28.f90: New test.

gcc/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dec_structure_28.f90 [new file with mode: 0644]

index e71466f9574d6b92dea58b18efcef9359dbacdb4..27fac2cacca384fefa762feb5491dcb7dd541742 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-02  Fritz Reese  <foreese@gcc.gnu.org>
+
+       PR fortran/85982
+       * fortran/decl.c (match_attr_spec): Lump COMP_STRUCTURE/COMP_MAP into
+       attribute checking used by TYPE.
+
 2020-04-02  Martin Jambor  <mjambor@suse.cz>
 
        PR ipa/92676
index 79c951003ad5572f4604017a25b2433c05fc4df7..ea309089ac9bc74e9b14a6aad102d3f7541cfa07 100644 (file)
@@ -5408,15 +5408,19 @@ match_attr_spec (void)
       if (d == DECL_STATIC && seen[DECL_SAVE])
        continue;
 
-      if (gfc_current_state () == COMP_DERIVED
+      if (gfc_comp_struct (gfc_current_state ())
          && d != DECL_DIMENSION && d != DECL_CODIMENSION
          && d != DECL_POINTER   && d != DECL_PRIVATE
          && d != DECL_PUBLIC && d != DECL_CONTIGUOUS && d != DECL_NONE)
        {
+         bool is_derived = gfc_current_state () == COMP_DERIVED;
          if (d == DECL_ALLOCATABLE)
            {
-             if (!gfc_notify_std (GFC_STD_F2003, "ALLOCATABLE "
-                                  "attribute at %C in a TYPE definition"))
+             if (!gfc_notify_std (GFC_STD_F2003, is_derived
+                                  ? G_("ALLOCATABLE attribute at %C in a "
+                                       "TYPE definition")
+                                  : G_("ALLOCATABLE attribute at %C in a "
+                                       "STRUCTURE definition")))
                {
                  m = MATCH_ERROR;
                  goto cleanup;
@@ -5424,8 +5428,11 @@ match_attr_spec (void)
            }
          else if (d == DECL_KIND)
            {
-             if (!gfc_notify_std (GFC_STD_F2003, "KIND "
-                                  "attribute at %C in a TYPE definition"))
+             if (!gfc_notify_std (GFC_STD_F2003, is_derived
+                                  ? G_("KIND attribute at %C in a "
+                                       "TYPE definition")
+                                  : G_("KIND attribute at %C in a "
+                                       "STRUCTURE definition")))
                {
                  m = MATCH_ERROR;
                  goto cleanup;
@@ -5448,8 +5455,11 @@ match_attr_spec (void)
            }
          else if (d == DECL_LEN)
            {
-             if (!gfc_notify_std (GFC_STD_F2003, "LEN "
-                                  "attribute at %C in a TYPE definition"))
+             if (!gfc_notify_std (GFC_STD_F2003, is_derived
+                                  ? G_("LEN attribute at %C in a "
+                                       "TYPE definition")
+                                  : G_("LEN attribute at %C in a "
+                                       "STRUCTURE definition")))
                {
                  m = MATCH_ERROR;
                  goto cleanup;
@@ -5472,8 +5482,10 @@ match_attr_spec (void)
            }
          else
            {
-             gfc_error ("Attribute at %L is not allowed in a TYPE definition",
-                        &seen_at[d]);
+             gfc_error (is_derived ? G_("Attribute at %L is not allowed in a "
+                                        "TYPE definition")
+                                   : G_("Attribute at %L is not allowed in a "
+                                        "STRUCTURE definition"), &seen_at[d]);
              m = MATCH_ERROR;
              goto cleanup;
            }
index c28b0018c37bc79f8a19d2e30f7f30cc1a2ccd27..050cecd61592ea4ad91e5598dfb5d95b79c2c480 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-02  Fritz Reese  <foreese@gcc.gnu.org>
+
+       PR fortran/85982
+       * gfortran.dg/dec_structure_28.f90: New test.
+
 2020-04-02  Tobias Burnus  <tobias@codesourcery.com>
 
        * gfortran.dg/dtio_35.f90: New.
diff --git a/gcc/testsuite/gfortran.dg/dec_structure_28.f90 b/gcc/testsuite/gfortran.dg/dec_structure_28.f90
new file mode 100644 (file)
index 0000000..bab08b2
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do compile }
+! { dg-options "-fdec-structure -fdec-static" }
+!
+! PR fortran/85982
+!
+! Test a regression wherein some component attributes were erroneously accepted
+! within a DEC structure.
+!
+
+structure /s/
+  integer :: a
+  integer, intent(in) :: b ! { dg-error "is not allowed" }
+  integer, intent(out) :: c ! { dg-error "is not allowed" }
+  integer, intent(inout) :: d ! { dg-error "is not allowed" }
+  integer, dimension(1,1) :: e ! OK
+  integer, external, pointer :: f ! { dg-error "is not allowed" }
+  integer, intrinsic :: f ! { dg-error "is not allowed" }
+  integer, optional :: g ! { dg-error "is not allowed" }
+  integer, parameter :: h ! { dg-error "is not allowed" }
+  integer, protected :: i ! { dg-error "is not allowed" }
+  integer, private :: j ! { dg-error "is not allowed" }
+  integer, static :: k ! { dg-error "is not allowed" }
+  integer, automatic :: l ! { dg-error "is not allowed" }
+  integer, public :: m ! { dg-error "is not allowed" }
+  integer, save :: n ! { dg-error "is not allowed" }
+  integer, target :: o ! { dg-error "is not allowed" }
+  integer, value :: p ! { dg-error "is not allowed" }
+  integer, volatile :: q ! { dg-error "is not allowed" }
+  integer, bind(c) :: r ! { dg-error "is not allowed" }
+  integer, asynchronous :: t ! { dg-error "is not allowed" }
+  character(len=3) :: v ! OK
+  integer(kind=4) :: w ! OK
+end structure
+
+end