aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/decl.c15
-rw-r--r--gcc/testsuite/g++.dg/modules/pr98531-2.h13
-rw-r--r--gcc/testsuite/g++.dg/modules/pr98531-2_a.H5
-rw-r--r--gcc/testsuite/g++.dg/modules/pr98531-2_b.C4
-rw-r--r--gcc/testsuite/g++.dg/modules/pr98531-3.h13
-rw-r--r--gcc/testsuite/g++.dg/modules/pr98531-3_a.H5
-rw-r--r--gcc/testsuite/g++.dg/modules/pr98531-3_b.C4
7 files changed, 50 insertions, 9 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 4ddee21..0aa49f9 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8909,10 +8909,6 @@ static tree
start_cleanup_fn (void)
{
char name[32];
- tree fntype;
- tree fndecl;
- bool use_cxa_atexit = flag_use_cxa_atexit
- && !targetm.cxx.use_atexit_for_cxa_atexit ();
push_to_top_level ();
@@ -8922,8 +8918,9 @@ start_cleanup_fn (void)
/* Build the name of the function. */
sprintf (name, "__tcf_%d", start_cleanup_cnt++);
/* Build the function declaration. */
- fntype = TREE_TYPE (get_atexit_fn_ptr_type ());
- fndecl = build_lang_decl (FUNCTION_DECL, get_identifier (name), fntype);
+ tree fntype = TREE_TYPE (get_atexit_fn_ptr_type ());
+ tree fndecl = build_lang_decl (FUNCTION_DECL, get_identifier (name), fntype);
+ DECL_CONTEXT (fndecl) = FROB_CONTEXT (current_namespace);
/* It's a function with internal linkage, generated by the
compiler. */
TREE_PUBLIC (fndecl) = 0;
@@ -8934,16 +8931,16 @@ start_cleanup_fn (void)
emissions this way. */
DECL_DECLARED_INLINE_P (fndecl) = 1;
DECL_INTERFACE_KNOWN (fndecl) = 1;
- /* Build the parameter. */
- if (use_cxa_atexit)
+ if (flag_use_cxa_atexit && !targetm.cxx.use_atexit_for_cxa_atexit ())
{
+ /* Build the parameter. */
tree parmdecl = cp_build_parm_decl (fndecl, NULL_TREE, ptr_type_node);
TREE_USED (parmdecl) = 1;
DECL_READ_P (parmdecl) = 1;
DECL_ARGUMENTS (fndecl) = parmdecl;
}
- pushdecl (fndecl);
+ fndecl = pushdecl (fndecl, /*hidden=*/true);
start_preparsed_function (fndecl, NULL_TREE, SF_PRE_PARSED);
pop_lang_context ();
diff --git a/gcc/testsuite/g++.dg/modules/pr98531-2.h b/gcc/testsuite/g++.dg/modules/pr98531-2.h
new file mode 100644
index 0000000..62d4c1d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr98531-2.h
@@ -0,0 +1,13 @@
+
+struct __waiters
+{
+ __waiters() noexcept;
+ ~__waiters () noexcept;
+
+ static __waiters &_S_for()
+ {
+ static __waiters w;
+
+ return w;
+ }
+};
diff --git a/gcc/testsuite/g++.dg/modules/pr98531-2_a.H b/gcc/testsuite/g++.dg/modules/pr98531-2_a.H
new file mode 100644
index 0000000..757d68a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr98531-2_a.H
@@ -0,0 +1,5 @@
+// { dg-additional-options "-fmodule-header -fno-use-cxa-atexit" }
+// PR c++ 98531 no-context __cxa_atexit
+// { dg-module-cmi {} }
+
+#include "pr98531-2.h"
diff --git a/gcc/testsuite/g++.dg/modules/pr98531-2_b.C b/gcc/testsuite/g++.dg/modules/pr98531-2_b.C
new file mode 100644
index 0000000..b5fa449
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr98531-2_b.C
@@ -0,0 +1,4 @@
+// { dg-additional-options "-fmodules-ts -fno-module-lazy -fno-use-cxa-atexit" }
+
+#include "pr98531-2.h"
+import "pr98531-2_a.H";
diff --git a/gcc/testsuite/g++.dg/modules/pr98531-3.h b/gcc/testsuite/g++.dg/modules/pr98531-3.h
new file mode 100644
index 0000000..a1a2f8a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr98531-3.h
@@ -0,0 +1,13 @@
+
+struct __waiters
+{
+ __waiters() noexcept;
+ ~__waiters () noexcept;
+
+ static __waiters &_S_for()
+ {
+ static __waiters w[2];
+
+ return w[0];
+ }
+};
diff --git a/gcc/testsuite/g++.dg/modules/pr98531-3_a.H b/gcc/testsuite/g++.dg/modules/pr98531-3_a.H
new file mode 100644
index 0000000..1c6267a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr98531-3_a.H
@@ -0,0 +1,5 @@
+// { dg-additional-options -fmodule-header }
+// PR c++ 98531 no-context __tcf_0
+// { dg-module-cmi {} }
+
+#include "pr98531-3.h"
diff --git a/gcc/testsuite/g++.dg/modules/pr98531-3_b.C b/gcc/testsuite/g++.dg/modules/pr98531-3_b.C
new file mode 100644
index 0000000..7e3e16d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/pr98531-3_b.C
@@ -0,0 +1,4 @@
+// { dg-additional-options "-fmodules-ts -fno-module-lazy" }
+
+#include "pr98531-3.h"
+import "pr98531-3_a.H";