From patchwork Thu Aug 1 14:56:23 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Cohen X-Patchwork-Id: 1967741 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=embecosm.com header.i=@embecosm.com header.a=rsa-sha256 header.s=google header.b=McILl9du; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4WZXTb4W5Gz1ybV for ; Fri, 2 Aug 2024 01:10:43 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D121F385E836 for ; Thu, 1 Aug 2024 15:10:41 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by sourceware.org (Postfix) with ESMTPS id D573B385DDF8 for ; Thu, 1 Aug 2024 14:58:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D573B385DDF8 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 D573B385DDF8 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::52f ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1722524347; cv=none; b=BWGt3SVP1S9ibyqJb5xcUOaHXm8c9idG8W0AXaCAFmS7kP3VUnk5ff2GHc+sWFjZ0p4+ISHHF2uFCD1a/YuoSriMhebLf009RbqrQIRV9LmB3S3ASe4U1Bj00d42SkBToufrRCYT0KnBWVRJ5Eql0I2N0BhflKrED86Sm3Axri0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1722524347; c=relaxed/simple; bh=lc4Fbyg6Ba7K6YgMOqZT2cU4MjNFWDoCFC3bCeu1Mzw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Otez0AUnDny4GTPRdllXviO85rSTmQ6qhFHIj3Xtg/+MHLNHjQFUWTqd7u+AD8a0sSSSLag725WV5AYWw3hMj/pExXWmYQf1o4x+Sq3fRaQEpkqDZaanc9viSPNQofl6wHCBXjJyjjib8v6GfTHYw4hy4aLgCCE6uZ8jBJKz7Uk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ed1-x52f.google.com with SMTP id 4fb4d7f45d1cf-5a309d1a788so9299271a12.3 for ; Thu, 01 Aug 2024 07:58:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1722524332; x=1723129132; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rjR+SP2KC+7vhGzj5zag3f3vShXLsX8VOHpAjqdloR0=; b=McILl9duTlZujs3Zo4zYmmJAvHLhsTvaOFTirqJL64JrR7IL2zcxqk+IOemFTvQ2Sb ulWSFDj2T27A0fGvFzJ/o7RcYYaugMCqnq/qsJlk23HM7PDenMjaDjpVxZe4kufJXaxZ HkvyY/2wvsYJqpz4O0zaSzu/ie6HTHgeeQ9wpwME2HpTO6N8xtnmVB8CCNRq3E27PjEL 0mSw1rsGZLtfUaJO30t8riEKD44A1Po/CntrF/6bFyXdMjfHchU/BvXHlLcWX5pj67Px p9qTLFhTr8t/dXJwg6SWGR0K45wcwPjwzJI7rDAD+Kwsi5hM+Vqm58yiPNfJeFUvfdBU vq0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722524332; x=1723129132; h=content-transfer-encoding:mime-version: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=rjR+SP2KC+7vhGzj5zag3f3vShXLsX8VOHpAjqdloR0=; b=EjQ0P7bOUQiFPtrEnDpzzPTgKzCGFuf6BncgECbN6VXxlGqPDbgCL3tgdv3GaxmtVL Tu8MGDLa1qP2Ef02q7iAiYV9Pu6roAt+BczSTTSuujhna/YbqZuO1MdNlnd8ONqmzit3 XzKZI6BojoFIMwXFNPtSz5yLgpopdNhRa8fQpx9LhiOMETTB0jQSHIbBtpdxT1R46uMI MCtmsDHAVM7m3sAzSZUsqRVULUPjNbCrsEASMYWqrcsyEpvYAibTX5PAhBZYUr+WpSOj /ZKwL54oU5p5b7lEgGAwLzE7sQAp/hPe0nHwxE+cHbWFGutitn/PYmv5j0BtJgLLHdEO LpeQ== X-Gm-Message-State: AOJu0YwMG4VDy5x/BiEC3i0BzL1A1VlI3gJkoSW9Xk78fVJ6dSz4pQbr 37j9aTWVF4mv6oK8Vyeo+rpaPRyQk3kczSZg6ZotNYkxjanJR3WdrK/HexUWxeUOVDJPdrlZJZb l16UH X-Google-Smtp-Source: AGHT+IEHw3Ed7oszLqQtXMP6BAe/l+a4UXGOd1Y7pcDDQEYDOIhzWS2J8d30rPHqp8NnX+qjlsM7vA== X-Received: by 2002:a05:6402:1a42:b0:5a1:21df:752d with SMTP id 4fb4d7f45d1cf-5b7f3adaf75mr460000a12.10.1722524332095; Thu, 01 Aug 2024 07:58:52 -0700 (PDT) Received: from platypus.lan ([2a04:cec2:9:dc84:3622:6733:ff49:ee91]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5ac63590592sm10252456a12.25.2024.08.01.07.58.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Aug 2024 07:58:51 -0700 (PDT) From: Arthur Cohen To: gcc-patches@gcc.gnu.org Cc: gcc-rust@gcc.gnu.org, Owen Avery Subject: [PATCH 027/125] gccrs: Make DefaultResolver visit more of the AST Date: Thu, 1 Aug 2024 16:56:23 +0200 Message-ID: <20240801145809.366388-29-arthur.cohen@embecosm.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240801145809.366388-2-arthur.cohen@embecosm.com> References: <20240801145809.366388-2-arthur.cohen@embecosm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-14.0 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 autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org From: Owen Avery gcc/rust/ChangeLog: * resolve/rust-default-resolver.cc (DefaultResolver::visit): Visit inner AST nodes of ClosureExprInner, ClosureExprInnerTyped, IfExpr, IfExprConseqElse, MatchExpr, PathInExpression, EnumItemTuple, EnumItemStruct, and EnumItemDiscriminant. * ast/rust-item.h (EnumItemDiscriminant::has_expr): New function. Signed-off-by: Owen Avery --- gcc/rust/ast/rust-item.h | 2 + gcc/rust/resolve/rust-default-resolver.cc | 105 ++++++++++++++++++---- 2 files changed, 91 insertions(+), 16 deletions(-) diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index 0911719b716..44963ba386e 100644 --- a/gcc/rust/ast/rust-item.h +++ b/gcc/rust/ast/rust-item.h @@ -2081,6 +2081,8 @@ public: void accept_vis (ASTVisitor &vis) override; + bool has_expr () { return expression != nullptr; } + // TODO: is this better? Or is a "vis_block" better? std::unique_ptr &get_expr () { diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index 9f7fda4adaa..28f04a10839 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -177,12 +177,43 @@ DefaultResolver::visit (AST::StructExprFieldIndexValue &) {} void -DefaultResolver::visit (AST::ClosureExprInner &) -{} +DefaultResolver::visit (AST::ClosureExprInner &expr) +{ + if (expr.is_marked_for_strip ()) + return; + + for (auto ¶m : expr.get_params ()) + { + if (param.is_error ()) + continue; + + param.get_pattern ()->accept_vis (*this); + if (param.has_type_given ()) + param.get_type ()->accept_vis (*this); + } + + expr.get_definition_expr ()->accept_vis (*this); +} void -DefaultResolver::visit (AST::ClosureExprInnerTyped &) -{} +DefaultResolver::visit (AST::ClosureExprInnerTyped &expr) +{ + if (expr.is_marked_for_strip ()) + return; + + for (auto ¶m : expr.get_params ()) + { + if (param.is_error ()) + continue; + + param.get_pattern ()->accept_vis (*this); + if (param.has_type_given ()) + param.get_type ()->accept_vis (*this); + } + + expr.get_definition_block ()->accept_vis (*this); + expr.get_return_type ()->accept_vis (*this); +} void DefaultResolver::visit (AST::ContinueExpr &expr) @@ -230,11 +261,18 @@ DefaultResolver::visit (AST::WhileLetLoopExpr &expr) void DefaultResolver::visit (AST::IfExpr &expr) -{} +{ + expr.get_condition_expr ()->accept_vis (*this); + expr.get_if_block ()->accept_vis (*this); +} void -DefaultResolver::visit (AST::IfExprConseqElse &) -{} +DefaultResolver::visit (AST::IfExprConseqElse &expr) +{ + expr.get_condition_expr ()->accept_vis (*this); + expr.get_if_block ()->accept_vis (*this); + expr.get_else_block ()->accept_vis (*this); +} void DefaultResolver::visit (AST::IfLetExpr &expr) @@ -246,7 +284,20 @@ DefaultResolver::visit (AST::IfLetExprConseqElse &) void DefaultResolver::visit (AST::MatchExpr &expr) -{} +{ + if (expr.is_marked_for_strip ()) + return; + + expr.get_scrutinee_expr ()->accept_vis (*this); + for (auto &arm : expr.get_match_cases ()) + { + arm.get_expr ()->accept_vis (*this); + for (auto &pat : arm.get_arm ().get_patterns ()) + pat->accept_vis (*this); + if (arm.get_arm ().has_match_arm_guard ()) + arm.get_arm ().get_guard_expr ()->accept_vis (*this); + } +} void DefaultResolver::visit (AST::AwaitExpr &expr) @@ -277,8 +328,21 @@ DefaultResolver::visit (AST::ConstGenericParam &) {} void -DefaultResolver::visit (AST::PathInExpression &) -{} +DefaultResolver::visit (AST::PathInExpression &expr) +{ + for (auto &seg : expr.get_segments ()) + if (seg.has_generic_args ()) + { + auto &args = seg.get_generic_args (); + for (auto &arg : args.get_generic_args ()) + arg.accept_vis (*this); + for (auto &arg : args.get_binding_args ()) + if (!arg.is_error ()) + arg.get_type ()->accept_vis (*this); + for (auto &arg : args.get_lifetime_args ()) + arg.accept_vis (*this); + } +} void DefaultResolver::visit (AST::TypePathSegmentGeneric &) @@ -373,16 +437,25 @@ DefaultResolver::visit (AST::EnumItem &) {} void -DefaultResolver::visit (AST::EnumItemTuple &) -{} +DefaultResolver::visit (AST::EnumItemTuple &item) +{ + for (auto &field : item.get_tuple_fields ()) + field.get_field_type ()->accept_vis (*this); +} void -DefaultResolver::visit (AST::EnumItemStruct &) -{} +DefaultResolver::visit (AST::EnumItemStruct &item) +{ + for (auto &field : item.get_struct_fields ()) + field.get_field_type ()->accept_vis (*this); +} void -DefaultResolver::visit (AST::EnumItemDiscriminant &) -{} +DefaultResolver::visit (AST::EnumItemDiscriminant &item) +{ + if (item.has_expr ()) + item.get_expr ()->accept_vis (*this); +} void DefaultResolver::visit (AST::ConstantItem &item)