From: Jakub Jelinek Date: Fri, 30 Aug 2019 12:14:46 +0000 (+0200) Subject: backport: re PR c/88568 ('dllimport' no longer implies 'extern' in C) X-Git-Tag: releases/gcc-7.5.0~237 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a881d03a67d03b08222d854a650538988a3b6f77;p=thirdparty%2Fgcc.git backport: re PR c/88568 ('dllimport' no longer implies 'extern' in C) Backported from mainline 2019-03-09 Jakub Jelinek PR c/88568 * tree.c (handle_dll_attribute): Don't clear TREE_STATIC for dllimport on VAR_DECLs with RECORD_TYPE or UNION_TYPE DECL_CONTEXT. * g++.dg/other/pr88568.C: New test. From-SVN: r275126 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d0bfafb00c69..0be8ee2f152d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-03-09 Jakub Jelinek + + PR c/88568 + * tree.c (handle_dll_attribute): Don't clear TREE_STATIC for + dllimport on VAR_DECLs with RECORD_TYPE or UNION_TYPE DECL_CONTEXT. + 2019-03-05 Jakub Jelinek PR target/89587 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 48dfeb3a1d1b..e08f576ae456 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-08-30 Jakub Jelinek Backported from mainline + 2019-03-09 Jakub Jelinek + + PR c/88568 + * g++.dg/other/pr88568.C: New test. + 2019-03-08 Jakub Jelinek PR c++/82075 diff --git a/gcc/testsuite/g++.dg/other/pr88568.C b/gcc/testsuite/g++.dg/other/pr88568.C new file mode 100644 index 000000000000..9d344fd91474 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr88568.C @@ -0,0 +1,13 @@ +// PR c/88568 +// { dg-do compile } +// { dg-require-dll "" } + +struct S { + __attribute__((dllimport)) static const char foo[]; +}; + +int +foo (int x) +{ + return S::foo[x]; +} diff --git a/gcc/tree.c b/gcc/tree.c index f92ce9ebce80..4b9cecb35930 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -6456,8 +6456,11 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags, a function global scope, unless declared static. */ if (current_function_decl != NULL_TREE && !TREE_STATIC (node)) TREE_PUBLIC (node) = 1; - /* Clear TREE_STATIC because DECL_EXTERNAL is set. */ - TREE_STATIC (node) = 0; + /* Clear TREE_STATIC because DECL_EXTERNAL is set, unless + it is a C++ static data member. */ + if (DECL_CONTEXT (node) == NULL_TREE + || !RECORD_OR_UNION_TYPE_P (DECL_CONTEXT (node))) + TREE_STATIC (node) = 0; } if (*no_add_attrs == false)