From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x334.google.com (mail-wm1-x334.google.com [IPv6:2a00:1450:4864:20::334]) by sourceware.org (Postfix) with ESMTPS id 56B0538582BE for ; Wed, 7 Feb 2024 12:44:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 56B0538582BE Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 56B0538582BE Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::334 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707309872; cv=none; b=qAExDDX8mzwF/q014THV/WZ6J1jsZ4lHRW6R30plBZqCoNGAPfLuadTbOBHfnASYi+ehqCgX1K75JxavKpwcuabgIu2TVOd0V1+RJVFadW8p7fYkyQHQCsda20Cwja66pp0Rh96/Iz0cDTIEmiZP27/LbgMHf0vEzWAbDE1+zrM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707309872; c=relaxed/simple; bh=8oFUY0hOsk7x7NvoBk0PI5dPTAZCdm26j22lKEulKf4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=DBUDF0E41r81rjati3fqPJObymwfY7iEMwN+JXXbvL+KaPDDO8XOrptmsZy0FAZMo+MAM3+umRVeBaF1I+94TwdPlvr7ON/QL4cgT3/BlbXZkMQZf+GHxx6+jRmJpZKR/UPAF3IKVjQ2QQWNF63fZzcHCMHPD+5Wi3otbJzaSh0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-40fff96d5d7so4837095e9.2 for ; Wed, 07 Feb 2024 04:44:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1707309858; x=1707914658; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=XbUhUP6AxF+FUf7hCTn+jyUvuUbzDEMH13n5ULAmyrI=; b=VjhZfbq+2gGSh3oi2yAdaJNYKGlI3kDpC3gFDjQMjV5on/mn7C+hNFIz9OhjdQqtP0 9QMaCgrnXHrO7OCGS91IN2Q2OdsXX1v4wkc31a+NPm/0vjtvsHL6LIeNTmJTu7z/yHpk 858g3lHMHUlxYDO6E/AtxT3cqc07rx1xu71bu27vvrf2LzXfLRVhXXMZ748Dy0wRzlsB BcLM6y4Rfnv2vI4tZIQxRUhcO8WXFytsCJLhitbVcLaGhz5H/YgE2HcXR7nwCXex3MwT IawUlOL692JMBve2YA+op9Ny6n0o3mG9Av3iBX7Xe42L1G/FM9Z1bxBi/U5a8lU/y7MG kuFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707309858; x=1707914658; h=content-transfer-encoding:mime-version:reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=XbUhUP6AxF+FUf7hCTn+jyUvuUbzDEMH13n5ULAmyrI=; b=AyxYq9I3LDRTrDG+HYd2fcLGEwZmDpjsYdDztk2CEqjI33GrpQEejlunKXYeLPppFY Mk0qr31S28Mx1dOY4Lq/fA1SQm+d2VeaRcPKwNMY2bBK9cOZFLJhbQAleg3HvaIV3mp3 SL/3sns9fkNKAoGg7GzZEzfPvKXSJpCd54jC8nXmXmg3tThlmz+rkkG4TjoBDpGnJmWv ZKmm+MA6kzqEGqSJRtYHSByVO93xflTVZbMlBdMstbvGyM7uB5apTVza4yDQg2jn++fH 0pRAApJ2nvHuaBiyS3S4VR7Va1OSjBkCW1XrEZADcGeducIZSuFtsZ5sRN1sDJQW1hvv 7vWw== X-Gm-Message-State: AOJu0YziBt0x0hP+DgLSO/vpS1b2TNozwxrQln6I4hMOX9c8kmdp6Gan vW6pwolChZFsZgCbu8UPAj4y008eMnE9ndgGsXFgtbj5plh+JCMPNoiq9gkjH0jXndtGqr8pY0H sFg== X-Google-Smtp-Source: AGHT+IH6Otf/caM2ZrRFPZ6wmkfIUZA8AojEcvNEQyiyIWb8GpQWKWsQth8OnitssOLhS5/cJFzSUQ== X-Received: by 2002:a05:600c:5250:b0:40f:cf69:3e1a with SMTP id fc16-20020a05600c525000b0040fcf693e1amr4394460wmb.39.1707309858158; Wed, 07 Feb 2024 04:44:18 -0800 (PST) X-Forwarded-Encrypted: i=1; AJvYcCW10DT+WmC5QgfPAJJ+8kpVmLkLvQOrr5+M78YAljxPUWjQYTIlXusZ9Y+7px/3WwGuGgV6t8mysy9wL/V9XafPdSd7OlyG Received: from platypus.sou.embecosm-corp.com ([212.69.42.53]) by smtp.gmail.com with ESMTPSA id x19-20020a05600c2a5300b0040fbdd6f69bsm5044188wme.33.2024.02.07.04.44.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Feb 2024 04:44:17 -0800 (PST) From: arthur.cohen@embecosm.com To: gcc-patches@gcc.gnu.org Cc: gcc-rust@gcc.gnu.org, Kushal Pal Subject: [COMMITTED 21/25] gccrs: Add missing visitors for AST::Function. Date: Wed, 7 Feb 2024 12:44:07 +0100 Message-ID: <20240207114419.1100894-22-arthur.cohen@embecosm.com> X-Mailer: git-send-email 2.42.1 In-Reply-To: <20240207114419.1100894-2-arthur.cohen@embecosm.com> References: <20240207114419.1100894-2-arthur.cohen@embecosm.com> Reply-To: arthur.cohen@embecosm.com MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: From: Kushal Pal To use AST::Function instead of AST::TraitItemFunc and AST::TraitItemMethod, we need to provide similar visitors during lowering and resolving phase. gcc/rust/ChangeLog: * hir/rust-ast-lower-implitem.cc (ASTLowerTraitItem::visit): Provide visitor for AST::Function. * hir/rust-ast-lower-implitem.h: Likewise. * resolve/rust-ast-resolve-implitem.h: Likewise. * resolve/rust-ast-resolve-item.cc (ResolveTraitItems::visit): Likewise. * resolve/rust-ast-resolve-item.h: Likewise. Signed-off-by: Kushal Pal --- gcc/rust/hir/rust-ast-lower-implitem.cc | 86 +++++++++++++++++++ gcc/rust/hir/rust-ast-lower-implitem.h | 1 + gcc/rust/resolve/rust-ast-resolve-implitem.h | 20 +++++ gcc/rust/resolve/rust-ast-resolve-item.cc | 88 ++++++++++++++++++++ gcc/rust/resolve/rust-ast-resolve-item.h | 1 + 5 files changed, 196 insertions(+) diff --git a/gcc/rust/hir/rust-ast-lower-implitem.cc b/gcc/rust/hir/rust-ast-lower-implitem.cc index 98db1dccd7c..77230e7a8bf 100644 --- a/gcc/rust/hir/rust-ast-lower-implitem.cc +++ b/gcc/rust/hir/rust-ast-lower-implitem.cc @@ -227,6 +227,92 @@ ASTLowerTraitItem::translate (AST::AssociatedItem *item) return resolver.translated; } +void +ASTLowerTraitItem::visit (AST::Function &func) +{ + std::vector > where_clause_items; + HIR::WhereClause where_clause (std::move (where_clause_items)); + HIR::FunctionQualifiers qualifiers + = lower_qualifiers (func.get_qualifiers ()); + + std::vector > generic_params; + if (func.has_generics ()) + generic_params = lower_generic_params (func.get_generic_params ()); + + std::unique_ptr return_type + = func.has_return_type () ? std::unique_ptr ( + ASTLoweringType::translate (func.get_return_type ().get ())) + : nullptr; + + // set self parameter to error if this is a method + // else lower to hir + HIR::SelfParam self_param = func.has_self_param () + ? lower_self (func.get_self_param ()) + : HIR::SelfParam::error (); + + std::vector function_params; + for (auto &p : func.get_function_params ()) + { + if (p->is_variadic () || p->is_self ()) + continue; + + auto param = static_cast (p.get ()); + + auto translated_pattern = std::unique_ptr ( + ASTLoweringPattern::translate (param->get_pattern ().get ())); + auto translated_type = std::unique_ptr ( + ASTLoweringType::translate (param->get_type ().get ())); + + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, param->get_node_id (), + mappings->get_next_hir_id (crate_num), + UNKNOWN_LOCAL_DEFID); + + auto hir_param + = HIR::FunctionParam (mapping, std::move (translated_pattern), + std::move (translated_type), param->get_locus ()); + function_params.push_back (hir_param); + } + + HIR::TraitFunctionDecl decl (func.get_function_name (), + std::move (qualifiers), + std::move (generic_params), + std::move (self_param), + std::move (function_params), + std::move (return_type), + std::move (where_clause)); + bool terminated = false; + std::unique_ptr block_expr + = func.has_body () ? std::unique_ptr ( + ASTLoweringBlock::translate (func.get_definition ()->get (), + &terminated)) + : nullptr; + + auto crate_num = mappings->get_current_crate (); + Analysis::NodeMapping mapping (crate_num, func.get_node_id (), + mappings->get_next_hir_id (crate_num), + mappings->get_next_localdef_id (crate_num)); + + auto *trait_item + = new HIR::TraitItemFunc (mapping, std::move (decl), std::move (block_expr), + func.get_outer_attrs (), func.get_locus ()); + translated = trait_item; + if (func.has_self_param ()) + { + // insert mappings for self + mappings->insert_hir_self_param (&self_param); + mappings->insert_location (self_param.get_mappings ().get_hirid (), + self_param.get_locus ()); + } + + // add the mappings for the function params at the end + for (auto ¶m : trait_item->get_decl ().get_function_params ()) + { + mappings->insert_hir_param (¶m); + mappings->insert_location (mapping.get_hirid (), param.get_locus ()); + } +} + void ASTLowerTraitItem::visit (AST::TraitItemFunc &func) { diff --git a/gcc/rust/hir/rust-ast-lower-implitem.h b/gcc/rust/hir/rust-ast-lower-implitem.h index 3a266b41ed4..b9d12cc4a56 100644 --- a/gcc/rust/hir/rust-ast-lower-implitem.h +++ b/gcc/rust/hir/rust-ast-lower-implitem.h @@ -48,6 +48,7 @@ class ASTLowerTraitItem : public ASTLoweringBase public: static HIR::TraitItem *translate (AST::AssociatedItem *item); + void visit (AST::Function &func) override; void visit (AST::TraitItemFunc &func) override; void visit (AST::TraitItemMethod &method) override; void visit (AST::TraitItemConst &constant) override; diff --git a/gcc/rust/resolve/rust-ast-resolve-implitem.h b/gcc/rust/resolve/rust-ast-resolve-implitem.h index 365bdd6135f..d9c9bcb28c9 100644 --- a/gcc/rust/resolve/rust-ast-resolve-implitem.h +++ b/gcc/rust/resolve/rust-ast-resolve-implitem.h @@ -110,6 +110,26 @@ public: item->accept_vis (resolver); }; + void visit (AST::Function &function) override + { + auto decl + = CanonicalPath::new_seg (function.get_node_id (), + function.get_function_name ().as_string ()); + auto path = prefix.append (decl); + auto cpath = canonical_prefix.append (decl); + + resolver->get_name_scope ().insert ( + path, function.get_node_id (), function.get_locus (), false, + Rib::ItemType::Function, + [&] (const CanonicalPath &, NodeId, location_t locus) -> void { + rich_location r (line_table, function.get_locus ()); + r.add_range (locus); + rust_error_at (r, "redefined multiple times"); + }); + + mappings->insert_canonical_path (function.get_node_id (), cpath); + } + void visit (AST::TraitItemFunc &function) override { auto decl = CanonicalPath::new_seg ( diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc index 60eca5b13c7..6037fe59f5b 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.cc +++ b/gcc/rust/resolve/rust-ast-resolve-item.cc @@ -45,6 +45,94 @@ ResolveTraitItems::go (AST::AssociatedItem *item, const CanonicalPath &prefix, item->accept_vis (resolver); } +void +ResolveTraitItems::visit (AST::Function &function) +{ + auto decl + = CanonicalPath::new_seg (function.get_node_id (), + function.get_function_name ().as_string ()); + auto path = prefix.append (decl); + auto cpath = canonical_prefix.append (decl); + mappings->insert_canonical_path (function.get_node_id (), cpath); + + NodeId scope_node_id = function.get_node_id (); + resolver->get_name_scope ().push (scope_node_id); + resolver->get_type_scope ().push (scope_node_id); + resolver->get_label_scope ().push (scope_node_id); + resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); + resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + + if (function.has_generics ()) + for (auto &generic : function.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); + + if (function.has_return_type ()) + ResolveType::go (function.get_return_type ().get ()); + + // self turns into (self: Self) as a function param + std::vector bindings + = {PatternBinding (PatternBoundCtx::Product, std::set ())}; + + // we make a new scope so the names of parameters are resolved and shadowed + // correctly + for (auto &p : function.get_function_params ()) + { + if (p->is_variadic ()) + { + auto param = static_cast (p.get ()); + PatternDeclaration::go (param->get_pattern ().get (), + Rib::ItemType::Param, bindings); + } + else if (p->is_self ()) + { + auto param = static_cast (p.get ()); + // FIXME: which location should be used for Rust::Identifier `self`? + AST::IdentifierPattern self_pattern ( + param->get_node_id (), {"self"}, param->get_locus (), + param->get_has_ref (), param->get_is_mut (), + std::unique_ptr (nullptr)); + + PatternDeclaration::go (&self_pattern, Rib::ItemType::Param); + + if (param->has_type ()) + { + // This shouldn't happen the parser should already error for this + rust_assert (!param->get_has_ref ()); + ResolveType::go (param->get_type ().get ()); + } + else + { + // here we implicitly make self have a type path of Self + std::vector> segments; + segments.push_back (std::unique_ptr ( + new AST::TypePathSegment ("Self", false, param->get_locus ()))); + + AST::TypePath self_type_path (std::move (segments), + param->get_locus ()); + ResolveType::go (&self_type_path); + } + } + else + { + auto param = static_cast (p.get ()); + ResolveType::go (param->get_type ().get ()); + PatternDeclaration::go (param->get_pattern ().get (), + Rib::ItemType::Param, bindings); + } + } + + if (function.has_where_clause ()) + ResolveWhereClause::Resolve (function.get_where_clause ()); + + // trait items have an optional body + if (function.has_body ()) + ResolveExpr::go (function.get_definition ()->get (), path, cpath); + + resolver->get_name_scope ().pop (); + resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); +} void ResolveTraitItems::visit (AST::TraitItemType &type) { diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index 712fe62336f..33a78e21957 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.h +++ b/gcc/rust/resolve/rust-ast-resolve-item.h @@ -35,6 +35,7 @@ public: static void go (AST::AssociatedItem *item, const CanonicalPath &prefix, const CanonicalPath &canonical_prefix); + void visit (AST::Function &type) override; void visit (AST::TraitItemType &type) override; void visit (AST::TraitItemFunc &func) override; void visit (AST::TraitItemMethod &func) override; -- 2.42.1