From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id 05D3E383EC6C; Thu, 30 Jun 2022 18:50:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 05D3E383EC6C Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] Ensure we support generic arguments on mangled type-paths X-Act-Checkin: gcc X-Git-Author: Philip Herron X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: c88cc0aa644836c361ce5d8ff5225a9c12333dea X-Git-Newrev: 1282974cf899f9486c62054bcbadf41346915dd5 Message-Id: <20220630185048.05D3E383EC6C@sourceware.org> Date: Thu, 30 Jun 2022 18:50:48 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Jun 2022 18:50:48 -0000 https://gcc.gnu.org/g:1282974cf899f9486c62054bcbadf41346915dd5 commit 1282974cf899f9486c62054bcbadf41346915dd5 Author: Philip Herron Date: Wed Jun 29 12:01:05 2022 +0100 Ensure we support generic arguments on mangled type-paths This allows us to have the generic arguments within type paths for mangled symbols such as those in impl-blocks. This also updates our symbol managling to mangle comma's to $C$. Diff: --- gcc/rust/backend/rust-mangle.cc | 6 ++++ gcc/rust/resolve/rust-ast-resolve-type.cc | 47 ++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/gcc/rust/backend/rust-mangle.cc b/gcc/rust/backend/rust-mangle.cc index c0aea0286af..4d202078a70 100644 --- a/gcc/rust/backend/rust-mangle.cc +++ b/gcc/rust/backend/rust-mangle.cc @@ -14,6 +14,7 @@ static const std::string kMangledPtr = "$BP$"; static const std::string kMangledLeftSqParen = "$u5b$"; // [ static const std::string kMangledRightSqParen = "$u5d$"; // ] static const std::string kQualPathBegin = "_" + kMangledSubstBegin; +static const std::string kMangledComma = "$C$"; namespace Rust { namespace Compile { @@ -39,6 +40,9 @@ legacy_mangle_name (const std::string &name) // // example::Foo::new: // _ZN7example12Foo$LT$T$GT$3new17h9a2aacb7fd783515E: + // + // >::call + // _ZN74_$LT$example..Identity$u20$as$u20$example..FnLike$LT$$RF$T$C$$RF$T$GT$$GT$4call17ha9ee58935895acb3E std::string buffer; for (size_t i = 0; i < name.size (); i++) @@ -62,6 +66,8 @@ legacy_mangle_name (const std::string &name) m = kMangledLeftSqParen; else if (c == ']') m = kMangledRightSqParen; + else if (c == ',') + m = kMangledComma; else if (c == ':') { rust_assert (i + 1 < name.size ()); diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index 5d0ceb536d5..a823543e18d 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.cc +++ b/gcc/rust/resolve/rust-ast-resolve-type.cc @@ -356,7 +356,52 @@ ResolveTypeToCanonicalPath::visit (AST::TypePath &path) if (mappings->lookup_canonical_path (mappings->get_current_crate (), resolved_node, &type_path)) { - result = *type_path; + auto &final_seg = path.get_segments ().back (); + switch (final_seg->get_type ()) + { + case AST::TypePathSegment::SegmentType::GENERIC: { + AST::TypePathSegmentGeneric *s + = static_cast (final_seg.get ()); + + std::vector args; + if (s->has_generic_args ()) + { + for (auto > : s->get_generic_args ().get_type_args ()) + { + CanonicalPath arg = CanonicalPath::create_empty (); + bool ok = ResolveTypeToCanonicalPath::go (gt.get (), arg); + if (ok) + args.push_back (std::move (arg)); + } + } + + result = *type_path; + if (!args.empty ()) + { + // append this onto the path + std::string buf; + for (size_t i = 0; i < args.size (); i++) + { + bool has_next = (i + 1) < args.size (); + const auto &arg = args.at (i); + + buf += arg.get (); + if (has_next) + buf += ", "; + } + + std::string arg_seg = "<" + buf + ">"; + CanonicalPath argument_seg + = CanonicalPath::new_seg (s->get_node_id (), arg_seg); + result = result.append (argument_seg); + } + } + break; + + default: + result = *type_path; + break; + } } }