OSDN Git Service

2006-02-03 Steven G. Kargl <kargls@comcast.net>
authorkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 Feb 2006 19:11:27 +0000 (19:11 +0000)
committerkargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 3 Feb 2006 19:11:27 +0000 (19:11 +0000)
           Paul Thomas  <pault@gcc.gnu.org>

       * resolve.c (resolve_symbol): Default initialization of derived type
       component reguires the SAVE attribute.

2006-02-03  Steven G. Kargl  <kargls@comcast.net>

       * gfortran.dg/char_result_11.f90: Add SAVE.
       * gfortran.dg/der_pointer_4.f90: Ditto.
       * gfortran.dg/default_initialization.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110554 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/char_result_11.f90
gcc/testsuite/gfortran.dg/default_initialization.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/der_pointer_4.f90

index 80a453d..a9a610e 100644 (file)
@@ -1,3 +1,9 @@
+2006-02-03  Steven G. Kargl  <kargls@comcast>
+           Paul Thomas  <pault@gcc.gnu.org>
+
+       * resolve.c (resolve_symbol): Default initialization of derived type
+       component reguires the SAVE attribute.
+
 2006-02-02  Steven G. Kargl  <kargls@comcast>
 
        PR fortran/24958
index ca89f88..3767992 100644 (file)
@@ -4511,11 +4511,12 @@ resolve_symbol (gfc_symbol * sym)
   int formal_ns_save, check_constant, mp_flag;
   int i, flag;
   gfc_namelist *nl;
-  gfc_symtree * symtree;
-  gfc_symtree * this_symtree;
-  gfc_namespace * ns;
-  gfc_component * c;
-  gfc_formal_arglist * arg;
+  gfc_symtree *symtree;
+  gfc_symtree *this_symtree;
+  gfc_namespace *ns;
+  gfc_component *c;
+  gfc_formal_arglist *arg;
+  gfc_expr *constructor_expr;
 
   if (sym->attr.flavor == FL_UNKNOWN)
     {
@@ -4857,6 +4858,26 @@ resolve_symbol (gfc_symbol * sym)
          return;
        }
 
+     /* 4th constraint in section 11.3:  "If an object of a type for which
+       component-initialization is specified (R429) appears in the
+       specification-part of a module and does not have the ALLOCATABLE
+       or POINTER attribute, the object shall have the SAVE attribute."  */
+
+      if (sym->ts.type == BT_DERIVED && !(sym->value || flag))
+        constructor_expr = gfc_default_initializer (&sym->ts);
+
+      if (sym->ns->proc_name
+         && sym->ns->proc_name->attr.flavor == FL_MODULE
+         && constructor_expr
+         && !sym->ns->save_all && !sym->attr.save
+         && !sym->attr.pointer && !sym->attr.allocatable)
+       {
+         gfc_error("Object '%s' at %L must have the SAVE attribute %s",
+                    sym->name, &sym->declared_at,
+                    "for default initialization of a component");
+         return;
+       }
+
       /* Assign default initializer.  */
       if (sym->ts.type == BT_DERIVED && !(sym->value || flag)
           && !sym->attr.pointer)
index 416187f..5dc5b19 100644 (file)
@@ -1,3 +1,9 @@
+2006-02-03  Steven G. Kargl  <kargls@comcast.net>
+
+       * gfortran.dg/char_result_11.f90: Add SAVE.
+       * gfortran.dg/der_pointer_4.f90: Ditto.
+       * gfortran.dg/default_initialization.f90: New test.
+
 2006-02-03  Jeff Law  <law@redhat.com>
 
         * lib/gcc-dg.exp (cleanup-rtl-dump): Fix dump file regexp to
index 19a5c96..c37b20e 100644 (file)
@@ -16,7 +16,7 @@ module cutils
     integer(1) :: n1 = 3, n2 = 3, n3 = 3, n4 = 3, n6 = 3, n8 = 3
     character(10) :: s = "abcdefghij"
     integer :: x(4) = (/ 30, 40, 50, 60 /)
-    type(t) :: tt1(5), tt2(5)
+    type(t), save :: tt1(5), tt2(5)
 
     public :: IntToChar1, IntToChar2, IntToChar3, IntToChar4, IntToChar5, &
                 IntToChar6, IntToChar7, IntToChar8
diff --git a/gcc/testsuite/gfortran.dg/default_initialization.f90 b/gcc/testsuite/gfortran.dg/default_initialization.f90
new file mode 100644 (file)
index 0000000..4064784
--- /dev/null
@@ -0,0 +1,18 @@
+!
+! { dg-do compile }
+! PR 20845
+!
+! In ISO/IEC 1539-1:1997(E), 4th constraint in section 11.3:
+!
+!   If an object of a type for which component-initialization is specified
+!   (R429) appears in the specification-part of a module and does not have
+!   the ALLOCATABLE or POINTER attribute, the object shall have the SAVE
+!   attribute.
+!
+module bad
+   implicit none
+   type default_initialization
+      integer :: x = 42
+   end type default_initialization
+   type (default_initialization) t ! { dg-error "default initialization" }
+end module bad
index 6bc499d..c08b846 100644 (file)
@@ -7,5 +7,5 @@ module crash
     integer :: i = 0
     type (foo), pointer :: next
   end type foo
-  type (foo) :: bar
+  type (foo), save :: bar
 end module crash