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).