https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88568

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |jsm28 at gcc dot gnu.org,
                   |                            |jyong at gcc dot gnu.org
            Summary|[8/9 Regression]            |[7/8/9 Regression]
                   |'dllimport' no longer       |'dllimport' no longer
                   |implies 'extern' in C       |implies 'extern' in C

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Guess it regressed with the PR24293 change then.

I think the problem is that handle_dll_attribute has for dllimport on
VAR_DECLs:
          /* `extern' needn't be specified with dllimport.
             Specify `extern' now and hope for the best.  Sigh.  */
          DECL_EXTERNAL (node) = 1;
          /* Also, implicitly give dllimport'd variables declared within
             a function global scope, unless declared static.  */
          if (current_function_decl != NULL_TREE && !TREE_STATIC (node))
            TREE_PUBLIC (node) = 1;
The problem is that the decl is previously TREE_STATIC and TREE_PUBLIC and
setting it also DECL_EXTERNAL results in an unusual combination of flags.

So, either we can tweak the code reporting the issues and hope TREE_STATIC &&
DECL_EXTERNAL means something reasonable elsewhere:

--- gcc/c/c-decl.c.jj   2019-01-01 12:37:48.628458597 +0100
+++ gcc/c/c-decl.c      2019-01-04 15:13:03.281213304 +0100
@@ -5100,7 +5100,8 @@ finish_decl (tree decl, location_t init_
       if ((RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl))
          || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
          && DECL_SIZE (decl) == NULL_TREE
-         && TREE_STATIC (decl))
+         && TREE_STATIC (decl)
+         && !DECL_EXTERNAL (decl))
        incomplete_record_decls.safe_push (decl);

       if (is_global_var (decl) && DECL_SIZE (decl) != NULL_TREE)

or we should change handle_dll_attribute to:

--- gcc/attribs.c       2019-01-01 12:37:18.066960036 +0100
+++ gcc/attribs.c       2019-01-04 15:41:55.949812827 +0100
@@ -1691,6 +1691,7 @@ handle_dll_attribute (tree * pnode, tree
             a function global scope, unless declared static.  */
          if (current_function_decl != NULL_TREE && !TREE_STATIC (node))
            TREE_PUBLIC (node) = 1;
+         TREE_STATIC (node) = 0;
        }

       if (*no_add_attrs == false)

Joseph, is there any meaning for DECL_EXTERNAL & TREE_STATIC, or is that
invalid flag combination?  If the latter, we should go with the latter patch,
but I'm afraid I have no access to Windows and no way to test.

Reply via email to