]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: modules and DECL_REPLACEABLE_P
authorJason Merrill <jason@redhat.com>
Fri, 22 Nov 2024 11:00:20 +0000 (12:00 +0100)
committerJason Merrill <jason@redhat.com>
Fri, 10 Jan 2025 16:37:11 +0000 (11:37 -0500)
We need to remember that the ::operator new is replaceable to avoid a bogus
error about __builtin_operator_new finding a non-replaceable function.

This affected __get_temporary_buffer in stl_tempbuf.h.

gcc/cp/ChangeLog:

* module.cc (trees_out::core_bools): Write replaceable_operator.
(trees_in::core_bools): Read it.

gcc/testsuite/ChangeLog:

* g++.dg/modules/operator-2_a.C: New test.
* g++.dg/modules/operator-2_b.C: New test.

gcc/cp/module.cc
gcc/testsuite/g++.dg/modules/operator-2_a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/operator-2_b.C [new file with mode: 0644]

index 7288c46a7baaa5efa621e089a8107b7a315f97b7..4fbe522264b3ad39c2f7464b5fc720a724220c0f 100644 (file)
@@ -5640,6 +5640,7 @@ trees_out::core_bools (tree t, bits_out& bits)
 
       WB (t->function_decl.has_debug_args_flag);
       WB (t->function_decl.versioned_function);
+      WB (t->function_decl.replaceable_operator);
 
       /* decl_type is a (misnamed) 2 bit discriminator.         */
       unsigned kind = t->function_decl.decl_type;
@@ -5796,6 +5797,7 @@ trees_in::core_bools (tree t, bits_in& bits)
 
       RB (t->function_decl.has_debug_args_flag);
       RB (t->function_decl.versioned_function);
+      RB (t->function_decl.replaceable_operator);
 
       /* decl_type is a (misnamed) 2 bit discriminator.         */
       unsigned kind = 0;
diff --git a/gcc/testsuite/g++.dg/modules/operator-2_a.C b/gcc/testsuite/g++.dg/modules/operator-2_a.C
new file mode 100644 (file)
index 0000000..0b1f6e8
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-additional-options -fmodules }
+// { dg-module-cmi M }
+
+module;
+
+#include <new>
+
+export module M;
+
+export template <class T>
+inline T* alloc (__SIZE_TYPE__ n)
+{
+  return (T*) __builtin_operator_new (n * sizeof (T), std::nothrow_t{});
+};
diff --git a/gcc/testsuite/g++.dg/modules/operator-2_b.C b/gcc/testsuite/g++.dg/modules/operator-2_b.C
new file mode 100644 (file)
index 0000000..fb21ccb
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-additional-options -fmodules }
+
+import M;
+
+int main()
+{
+  int *p = alloc<int>(42);
+}