From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1888) id 54C053858D3C; Fri, 7 Oct 2022 13:33:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 54C053858D3C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1665149609; bh=HUHxvDke4ZyXXnIffFVH7qvnCsUVruJLZOw+lGdz34c=; h=From:To:Subject:Date:From; b=BR2EcMXNkfbGpC/cq5cZKyGXeNJpPrtxz0PD7Cz2qCAppj/wGZ8vUFINPDiOPAQEV 126vS3aKGNnb9PSXr2H0Ptdj6PY6qb/n+rFJ7roExqPIRFDEsU27lQDA0DJkmb6yC4 k8UkIXRrAwPq6cV9kiW+jbeswZCOfAQEnUF9wpOg= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Patrick Palka To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-3163] c++ modules: static var in inline function [PR104433] X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/master X-Git-Oldrev: d3e5465757c599ea64f611290b7793d3141a6b7c X-Git-Newrev: edbb2551d156d69a2e337dcd8daa69f2680d57ea Message-Id: <20221007133329.54C053858D3C@sourceware.org> Date: Fri, 7 Oct 2022 13:33:29 +0000 (GMT) List-Id: https://gcc.gnu.org/g:edbb2551d156d69a2e337dcd8daa69f2680d57ea commit r13-3163-gedbb2551d156d69a2e337dcd8daa69f2680d57ea Author: Patrick Palka Date: Fri Oct 7 09:32:45 2022 -0400 c++ modules: static var in inline function [PR104433] The below testcase fails to link with the error undefined reference to `f()::y' ultimately because during stream out for the static VAR_DECL y we override DECL_EXTERNAL to true, which later during IPA confuses symbol_table::remove_unreachable_nodes into thinking it's safe to not emit the symbol. The streaming code here already avoids overriding DECL_EXTERNAL for inline vars and functions, so it seems natural to extend this to static vars from an inline function. PR c++/104433 gcc/cp/ChangeLog: * module.cc (trees_out::core_bools): Don't override DECL_EXTERNAL to true for static variables from an inline function. gcc/testsuite/ChangeLog: * g++.dg/modules/static-2_a.H: New test. * g++.dg/modules/static-2_b.C: New test. Diff: --- gcc/cp/module.cc | 3 +++ gcc/testsuite/g++.dg/modules/static-2_a.H | 8 ++++++++ gcc/testsuite/g++.dg/modules/static-2_b.C | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index c5eff219909..cb1929bc5d5 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -5411,6 +5411,9 @@ trees_out::core_bools (tree t) case VAR_DECL: if (TREE_PUBLIC (t) + && !(TREE_STATIC (t) + && DECL_FUNCTION_SCOPE_P (t) + && DECL_DECLARED_INLINE_P (DECL_CONTEXT (t))) && !DECL_VAR_DECLARED_INLINE_P (t)) is_external = true; break; diff --git a/gcc/testsuite/g++.dg/modules/static-2_a.H b/gcc/testsuite/g++.dg/modules/static-2_a.H new file mode 100644 index 00000000000..65c7619616b --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/static-2_a.H @@ -0,0 +1,8 @@ +// PR c++/104433 +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } + +inline int* f() { + static int y; + return &y; +} diff --git a/gcc/testsuite/g++.dg/modules/static-2_b.C b/gcc/testsuite/g++.dg/modules/static-2_b.C new file mode 100644 index 00000000000..bfd35b0fc15 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/static-2_b.C @@ -0,0 +1,9 @@ +// PR c++/104433 +// { dg-additional-options -fmodules-ts } +// { dg-do link } + +import "static-2_a.H"; + +int main() { + f(); +}