aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2024-02-28 11:20:53 +1100
committerNathaniel Shead <nathanieloshead@gmail.com>2024-02-28 11:25:21 +1100
commit615b62aada6cc42759e5c43e196dab6c524925d6 (patch)
tree63c7e6bc5aa6e95578a6f25f2eb823f6c0470745 /gcc
parent6309ad25c6dc22bf1d47990eedb8a5bec5d7315a (diff)
downloadgcc-615b62aada6cc42759e5c43e196dab6c524925d6.zip
gcc-615b62aada6cc42759e5c43e196dab6c524925d6.tar.gz
gcc-615b62aada6cc42759e5c43e196dab6c524925d6.tar.bz2
c++: Revert deferring emission of inline variables [PR114013]
This is a (partial) reversion of r14-8987-gdd9d14f7d53 to return to eagerly emitting inline variables to the middle-end when they are declared. 'import_export_decl' will still continue to accept them, as allowing this is a pure extension and doesn't seem to cause issues with modules, but otherwise deferring the emission of inline variables appears to cause issues on some targets and prevents some code using inline variable templates from correctly linking. There might be a more targetted way to support this, but due to the complexity of handling linkage and emission I'd prefer to wait till GCC 15 to explore our options. PR c++/113970 PR c++/114013 gcc/cp/ChangeLog: * decl.cc (make_rtl_for_nonlocal_decl): Don't defer inline variables. gcc/testsuite/ChangeLog: * g++.dg/cpp1z/inline-var10.C: New test. Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/decl.cc4
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inline-var10.C33
2 files changed, 33 insertions, 4 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index e47f694..d19d09a 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -7954,10 +7954,6 @@ make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec)
&& DECL_IMPLICIT_INSTANTIATION (decl))
defer_p = 1;
- /* Defer vague-linkage variables. */
- if (DECL_INLINE_VAR_P (decl))
- defer_p = 1;
-
/* If we're not deferring, go ahead and assemble the variable. */
if (!defer_p)
rest_of_decl_compilation (decl, toplev, at_eof);
diff --git a/gcc/testsuite/g++.dg/cpp1z/inline-var10.C b/gcc/testsuite/g++.dg/cpp1z/inline-var10.C
new file mode 100644
index 0000000..8a19855
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/inline-var10.C
@@ -0,0 +1,33 @@
+// PR c++/114013
+// { dg-do link { target c++17 } }
+
+struct S { int a, b; };
+
+template <int N>
+constexpr struct S var[8] = {};
+
+template <>
+constexpr inline struct S var<6>[8] = {
+ { 1, 1 }, { 2, 0 }, { 3, 1 }, { 4, 0 },
+ { 5, 1 }, { 6, 0 }, { 7, 1 }, { 8, 0 }
+};
+
+[[gnu::noipa]] void
+foo (S)
+{
+}
+
+template <int N>
+void
+bar (int x)
+{
+ foo (var<N>[x]);
+}
+
+volatile int x;
+
+int
+main ()
+{
+ bar <6> (x);
+}