From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1888) id 0BCA43858C33; Sat, 3 Jun 2023 13:17:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0BCA43858C33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1685798267; bh=onUC0dDfhYgLEN5X1SEyjQYnKz2M3LmYCEHo8f7kQPs=; h=From:To:Subject:Date:From; b=PPH3zbimnIzLVFu2m36yxWMkCRtqlwgfAmd4pQ6hLJvOysoZS6L6+vU3QLSQW4S23 G34eQcpAD97NPbkB+Y5g4PQKLkKosshAkKiDqYx+V7iyt/FU9TWQyyvKA2xqQqRzGO 2kHgmrK4+RQ5TaJDylQITCokghGEg8OdWNUqJv8E= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Patrick Palka To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-1516] c++: mangle noexcept-expr [PR70790] X-Act-Checkin: gcc X-Git-Author: Patrick Palka X-Git-Refname: refs/heads/master X-Git-Oldrev: 38e88d41f50d844f1404172657ef7e8372014ef6 X-Git-Newrev: 999e617d3121b82921c8031ee695fd036f553f04 Message-Id: <20230603131747.0BCA43858C33@sourceware.org> Date: Sat, 3 Jun 2023 13:17:47 +0000 (GMT) List-Id: https://gcc.gnu.org/g:999e617d3121b82921c8031ee695fd036f553f04 commit r14-1516-g999e617d3121b82921c8031ee695fd036f553f04 Author: Patrick Palka Date: Sat Jun 3 09:03:27 2023 -0400 c++: mangle noexcept-expr [PR70790] This implements noexcept(expr) mangling and demangling as per the Itanium ABI. PR c++/70790 gcc/cp/ChangeLog: * mangle.cc (write_expression): Handle NOEXCEPT_EXPR. libiberty/ChangeLog: * cp-demangle.c (cplus_demangle_operators): Add the noexcept operator. (d_print_comp_inner) : Always print parens around the operand of noexcept too. * testsuite/demangle-expected: Test noexcept operator demangling. gcc/testsuite/ChangeLog: * g++.dg/abi/mangle78.C: New test. Diff: --- gcc/cp/mangle.cc | 5 +++++ gcc/testsuite/g++.dg/abi/mangle78.C | 14 ++++++++++++++ libiberty/cp-demangle.c | 5 +++-- libiberty/testsuite/demangle-expected | 3 +++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc index 826c5e76c1d..7dab4e62bc9 100644 --- a/gcc/cp/mangle.cc +++ b/gcc/cp/mangle.cc @@ -3402,6 +3402,11 @@ write_expression (tree expr) else write_string ("tr"); } + else if (code == NOEXCEPT_EXPR) + { + write_string ("nx"); + write_expression (TREE_OPERAND (expr, 0)); + } else if (code == CONSTRUCTOR) { bool braced_init = BRACE_ENCLOSED_INITIALIZER_P (expr); diff --git a/gcc/testsuite/g++.dg/abi/mangle78.C b/gcc/testsuite/g++.dg/abi/mangle78.C new file mode 100644 index 00000000000..63c4d779e9f --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle78.C @@ -0,0 +1,14 @@ +// PR c++/70790 +// { dg-do compile { target c++11 } } + +template +struct A { }; + +template +void f(A); + +int main() { + f({}); +} + +// { dg-final { scan-assembler "_Z1fIiEv1AIXnxtlT_EEE" } } diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index f2b36bcad68..18ab28fd028 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -1947,6 +1947,7 @@ const struct demangle_operator_info cplus_demangle_operators[] = { "ng", NL ("-"), 1 }, { "nt", NL ("!"), 1 }, { "nw", NL ("new"), 3 }, + { "nx", NL ("noexcept"), 1 }, { "oR", NL ("|="), 2 }, { "oo", NL ("||"), 2 }, { "or", NL ("|"), 2 }, @@ -5836,8 +5837,8 @@ d_print_comp_inner (struct d_print_info *dpi, int options, if (code && !strcmp (code, "gs")) /* Avoid parens after '::'. */ d_print_comp (dpi, options, operand); - else if (code && !strcmp (code, "st")) - /* Always print parens for sizeof (type). */ + else if (code && (!strcmp (code, "st") || !strcmp (code, "nx"))) + /* Always print parens for sizeof (type) and noexcept(expr). */ { d_append_char (dpi, '('); d_print_comp (dpi, options, operand); diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index d9bc7ed4b1f..52dff883a18 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -1659,3 +1659,6 @@ auto f()::{lambda(X<$T0>*, X*)#1}::operator()(X*, _ZZN1XIiE1FEvENKUliE_clEi X::F()::{lambda(int)#1}::operator()(int) const + +_Z1fIiEv1AIXnxtlT_EEE +void f(A)