public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-4732] c++: mangle contracts in write_mangled_name
@ 2022-12-15 21:48 Jason Merrill
0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2022-12-15 21:48 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:52e7ff23ff5967fef52ebe31b6750a56f7103080
commit r13-4732-g52e7ff23ff5967fef52ebe31b6750a56f7103080
Author: Arsen Arsenović <arsen@aarsen.me>
Date: Thu Dec 15 18:56:59 2022 +0100
c++: mangle contracts in write_mangled_name
This fixes contract-checked extern "C" functions.
gcc/cp/ChangeLog:
* mangle.cc (write_encoding): Move contract pre/post function
mangling from here...
(write_mangled_name): ... to here, and make it happen always.
gcc/testsuite/ChangeLog:
* g++.dg/contracts/contracts-externC.C: New test.
Diff:
---
gcc/cp/mangle.cc | 14 +++++++-------
gcc/testsuite/g++.dg/contracts/contracts-externC.C | 19 +++++++++++++++++++
2 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index e363ef35b9f..074cf27ec7a 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -798,6 +798,13 @@ write_mangled_name (const tree decl, bool top_level)
write_string ("_Z");
write_encoding (decl);
}
+
+ /* If this is the pre/post function for a guarded function, append
+ .pre/post, like something from create_virtual_clone. */
+ if (DECL_IS_PRE_FN_P (decl))
+ write_string (".pre");
+ else if (DECL_IS_POST_FN_P (decl))
+ write_string (".post");
}
/* Returns true if the return type of DECL is part of its signature, and
@@ -856,13 +863,6 @@ write_encoding (const tree decl)
mangle_return_type_p (decl),
d);
- /* If this is the pre/post function for a guarded function, append
- .pre/post, like something from create_virtual_clone. */
- if (DECL_IS_PRE_FN_P (decl))
- write_string (".pre");
- else if (DECL_IS_POST_FN_P (decl))
- write_string (".post");
-
/* If this is a coroutine helper, then append an appropriate string to
identify which. */
if (tree ramp = DECL_RAMP_FN (decl))
diff --git a/gcc/testsuite/g++.dg/contracts/contracts-externC.C b/gcc/testsuite/g++.dg/contracts/contracts-externC.C
new file mode 100644
index 00000000000..873056b742b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/contracts/contracts-externC.C
@@ -0,0 +1,19 @@
+// simple check to ensure we don't emit a function with the same name twice,
+// when wrapping functions in pre- and postconditions.
+// { dg-do link }
+// { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" }
+
+volatile int x = 10;
+
+extern "C" void
+f ()
+ [[ pre: x < 10 ]]
+{
+}
+
+int
+main ()
+ [[ post: x > 10 ]]
+{
+ f();
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-12-15 21:48 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-15 21:48 [gcc r13-4732] c++: mangle contracts in write_mangled_name Jason Merrill
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).