re PR fortran/47260 (DLLEXPORT: TREE_PUBLIC for procedures lost between trans-decl...
authorKai Tietz <kai.tietz@onevision.com>
Thu, 13 Jan 2011 18:04:03 +0000 (18:04 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 13 Jan 2011 18:04:03 +0000 (19:04 +0100)
2011-01-13  Kai Tietz  <kai.tietz@onevision.com>
            Tobias Burnus  <burnus@net-b.de>

        PR fortran/47260
        * trans-decl.c (gfc_get_extern_function_decl,
        build_function_decl): Set TREE_PUBLIC/TREE_EXTERNAL before
        calling decl_attributes.

Co-Authored-By: Tobias Burnus <burnus@net-b.de>
From-SVN: r168757

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c

index fa84641adb818eb7f93bc72f3d312948178921ae..223acd0f633606f6247ed3b318bc856b4f33e0aa 100644 (file)
@@ -1,3 +1,11 @@
+2011-01-13  Kai Tietz  <kai.tietz@onevision.com>
+           Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/47260
+       * trans-decl.c (gfc_get_extern_function_decl,
+       build_function_decl): Set TREE_PUBLIC/TREE_EXTERNAL before
+       calling decl_attributes.
+
 2011-01-13  Tobias Burnus  <burnus@net-b.de>
            Mikael Morin  <mikael@gcc.gnu.org>
 
index 829548c646e5fd3ef302dd978c283ef622fa9b3c..254db76b0c5084a6b99a3a6464d45b8e03a0916a 100644 (file)
@@ -1575,6 +1575,12 @@ gfc_get_extern_function_decl (gfc_symbol * sym)
   fndecl = build_decl (input_location,
                       FUNCTION_DECL, name, type);
 
+  /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
+     TREE_PUBLIC specifies whether a function is globally addressable (i.e.
+     the the opposite of declaring a function as static in C).  */
+  DECL_EXTERNAL (fndecl) = 1;
+  TREE_PUBLIC (fndecl) = 1;
+
   attributes = add_attributes_to_decl (sym->attr, NULL_TREE);
   decl_attributes (&fndecl, attributes, 0);
 
@@ -1592,12 +1598,6 @@ gfc_get_extern_function_decl (gfc_symbol * sym)
       DECL_CONTEXT (fndecl) = NULL_TREE;
     }
 
-  DECL_EXTERNAL (fndecl) = 1;
-
-  /* This specifies if a function is globally addressable, i.e. it is
-     the opposite of declaring static in C.  */
-  TREE_PUBLIC (fndecl) = 1;
-
   /* Set attributes for PURE functions. A call to PURE function in the
      Fortran 95 sense is both pure and without side effects in the C
      sense.  */
@@ -1658,6 +1658,15 @@ build_function_decl (gfc_symbol * sym, bool global)
 
   attr = sym->attr;
 
+  /* Initialize DECL_EXTERNAL and TREE_PUBLIC before calling decl_attributes;
+     TREE_PUBLIC specifies whether a function is globally addressable (i.e.
+     the the opposite of declaring a function as static in C).  */
+  DECL_EXTERNAL (fndecl) = 0;
+
+  if (!current_function_decl
+      && !sym->attr.entry_master && !sym->attr.is_main_program)
+    TREE_PUBLIC (fndecl) = 1;
+
   attributes = add_attributes_to_decl (attr, NULL_TREE);
   decl_attributes (&fndecl, attributes, 0);
 
@@ -1707,15 +1716,6 @@ build_function_decl (gfc_symbol * sym, bool global)
   /* Don't call layout_decl for a RESULT_DECL.
      layout_decl (result_decl, 0);  */
 
-  /* Set up all attributes for the function.  */
-  DECL_EXTERNAL (fndecl) = 0;
-
-  /* This specifies if a function is globally visible, i.e. it is
-     the opposite of declaring static in C.  */
-  if (!current_function_decl
-      && !sym->attr.entry_master && !sym->attr.is_main_program)
-    TREE_PUBLIC (fndecl) = 1;
-
   /* TREE_STATIC means the function body is defined here.  */
   TREE_STATIC (fndecl) = 1;