[pushed] c++: modules and local static

Message ID 20241127044903.3074092-1-jason@redhat.com
State New
Headers
Series [pushed] c++: modules and local static |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Jason Merrill Nov. 27, 2024, 4:48 a.m. UTC
  Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

Here we weren't emitting the guard variable for 'a'  when we emitted 'afn'
in the importer, because we only treated inline variables as needing that.
Fixed by generalizing to vague_linkage_p.

But we need to specifically exempt vtables, because the rest of the module
code handles them specially and expects them to be DECL_EXTERNAL.

gcc/cp/ChangeLog:

	* module.cc (trees_out::core_bools): Check vague_linkage_p.
	(has_definition): Likewise.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/static-3_b.C: New test.
	* g++.dg/modules/static-3_a.H: New test.
---
 gcc/cp/module.cc                          | 23 ++++++++++++-----------
 gcc/testsuite/g++.dg/modules/static-3_b.C |  8 ++++++++
 gcc/testsuite/g++.dg/modules/static-3_a.H | 13 +++++++++++++
 3 files changed, 33 insertions(+), 11 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/modules/static-3_b.C
 create mode 100644 gcc/testsuite/g++.dg/modules/static-3_a.H


base-commit: 819f67a2f633d2000f09119f0e19b784ea0a4bd8
prerequisite-patch-id: 44b613ffa7552972edb4078fd124f755bb857985
prerequisite-patch-id: 4f6f2295c571a63cb862f9e8c3455c66d41cc2e3
  

Patch

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 617bf4c68b1..5e68bb414cd 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -5490,16 +5490,13 @@  trees_out::core_bools (tree t, bits_out& bits)
 
 	    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))
+		  && DECL_VTABLE_OR_VTT_P (t))
+		/* We handle vtable linkage specially.  */
 		is_external = true;
-	      break;
-
+	      gcc_fallthrough ();
 	    case FUNCTION_DECL:
 	      if (TREE_PUBLIC (t)
-		  && !DECL_DECLARED_INLINE_P (t))
+		  && !vague_linkage_p (t))
 		is_external = true;
 	      break;
 	    }
@@ -11919,11 +11916,15 @@  has_definition (tree decl)
 	       since there's no TU to emit them in otherwise.  */
 	    return true;
 
-	  if (!decl_maybe_constant_var_p (decl)
-	      && !DECL_INLINE_VAR_P (decl))
-	    return false;
+	  if (decl_maybe_constant_var_p (decl))
+	    /* We might need its constant value.  */
+	    return true;
 
-	  return true;
+	  if (vague_linkage_p (decl))
+	    /* These are emitted as needed.  */
+	    return true;
+
+	  return false;
 	}
       break;
 
diff --git a/gcc/testsuite/g++.dg/modules/static-3_b.C b/gcc/testsuite/g++.dg/modules/static-3_b.C
new file mode 100644
index 00000000000..70180f8eb32
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/static-3_b.C
@@ -0,0 +1,8 @@ 
+// { dg-additional-options -fmodules }
+
+import "static-3_a.H";
+
+int main()
+{
+  afn();
+}
diff --git a/gcc/testsuite/g++.dg/modules/static-3_a.H b/gcc/testsuite/g++.dg/modules/static-3_a.H
new file mode 100644
index 00000000000..e5a014e9373
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/static-3_a.H
@@ -0,0 +1,13 @@ 
+// { dg-additional-options -fmodules }
+// { dg-module-do link }
+
+inline int i;
+
+struct A {
+  A() { ++i; }
+};
+
+inline A& afn() {
+  static A a;
+  return a;
+}