From patchwork Wed Jun 3 12:06:20 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: gerris.rs@gmail.com X-Patchwork-Id: 136378 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4AB284BA2E3F for ; Wed, 3 Jun 2026 12:09:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4AB284BA2E3F Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=bKQVnqWA X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-dl1-x1236.google.com (mail-dl1-x1236.google.com [IPv6:2607:f8b0:4864:20::1236]) by sourceware.org (Postfix) with ESMTPS id 9534F4BA2E1C for ; Wed, 3 Jun 2026 12:06:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9534F4BA2E1C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9534F4BA2E1C Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1236 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1780488387; cv=none; b=Buw5xkYdwl21jmHFP/BtcNBCYnE+12sY8wBFU8bzBpzr8Q/0+Pf61TA666kkNBS1/Mowl1oPEdTBjj8QJtAoOgjkzsG+cft1t7Nr8/L+NSBS0+FT2Qhtd7RH8mboVJgfeGtT3aaBj+VdN1bTdg6q+umaf4SyXvofPKmh4tspP0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1780488387; c=relaxed/simple; bh=qhpKIg/zO8E2o8njmKwEWqTPNR6x/VkfFMm4kh0z/D8=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=GSK2flVynCufGmGBnkNFD7cew4x4HrmlWcrfmYt4QDXzsq7Drq9NN6tKwu9008NAaqhcUh6mThL9tuz8jbDidjWrbc7/6Zr2FbCjg+KcCLyc++ZlmPvW8altnjcoXIxWeuStWtoWw5rXEwlpwCWPnHrG51/uAx9UEcxXN+dbzqw= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20251104 header.b=bKQVnqWA DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9534F4BA2E1C Received: by mail-dl1-x1236.google.com with SMTP id a92af1059eb24-137dd4cc208so361985c88.1 for ; Wed, 03 Jun 2026 05:06:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780488383; x=1781093183; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=xGQscodEIP+GJVhA3nNfYibrbV2gNCwBG8vm+gHa6yA=; b=bKQVnqWAzAf5KEfIrSPNpGG+Cg6o8w2Dqd6rJbRl9IGnfstiDd83eMcuiRhDsPkAq8 3120OeWUcXTG109bhQ9kqbrn7wBOWJzTqV8I0GtlyprqqzAHf0Fr4pa+ULFbYsYGfeK5 ZVXigQntUtNW7GEbHI9VXh2UQSnpT0GcKcNEvettapAgdoWWr2dIdlf56uTz60NguSV5 AX+++2FXQuCDdETPYyXmcWpLhxafQZfMq0JyR6ny1A9fHgUDoCBseZTrQUgAwqIvJExI wVsqn+X6crfDXgxK1pMw1KKmgfTkDj/Sqvwh3HWTlZeGRNqz5ocpoUzOw1ANwTnpYW48 iuEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780488383; x=1781093183; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=xGQscodEIP+GJVhA3nNfYibrbV2gNCwBG8vm+gHa6yA=; b=AsruLz4kj9MK7gQQGLjZTCkF5Xl8AbtoX3ENmF41s0/9GQnFdZCC87MxQqyiTq33WJ FLoVjzO6AqrN6bnaqoEKFimgNM7z5+OoAtEpUccsVM3DUQoji5yaz7DOFCi3vhVjVI/c PHUS3jzLxHNhHofqbDjHw/dTAZjMqm/WXnlSnt6QWnBzgyLthLANWcHcZd9Z4QiPTKxm dGcXhzaPuSFgXAp51281fCN17uY1+ZenWkP6/rJecG7+mCYnYN7bDYd6viSaQ5UFZiKY pKapBBGLbWVGU5aj+0FHWrjO0Ulzkh1cuyuO9YsWeADez0/NIr3zw5QCPj3QXhlO/3Je O41w== X-Gm-Message-State: AOJu0YzAeHgHPG4CZT1B5vpwhIOYtkYiutcGgbXonQxBg4H6WZq4RGPu J113TPxwf96f8G7PZ69xp99fxKixG1qZRZsurRG1Cu3coSTVHSuIG5KiLcBfIA== X-Gm-Gg: Acq92OEzxmO6yE/pkQs+adGeXZB+A1QjoTrM80n30OlMyi5YarlMJta9wr48qeKCAaw //WoJ266IX5rafmoIc0CDs48l+4CMlWo1b5rXe4VxPsl3dXAVnSd+oAbcnGOE2+ggR5R3iQiw5R 7MLSsIF4L1wgVrMakkBczAS89SvQ/ww/m2/WfnSsd//6RignZAfvB9dto4XEGpGBrfbIXeAWJzO oCwDyhB229Nr1y57GYd+45vYnFS6prhrRk1oHiSvYE64qPNBMxebqzwJOIa0zWRYVkZ0JP5oKTj wgUU6ADfyQ5OkZGZV8Q8jrFO4A9fsGON1gFVryrnEy5hNAUmSZMKnyzUEz9F1nGCtK2FBQcnwWV X1HGDDSCSPcSzQCrZZXxwYdYk6MxxGfwzrXmlQUbNawvTmWRiFQDfoZrkq20Cvo/ABl0WRCyk22 0SDTdwM5aF1B64W8E3cKanV2Vq+FMqgJttotrJn5Sl8p672zLwVeBVh08BBESIZfAEVtNlvrhxV EVKa+jWlbNexpXiKKr12Pl3mX/ItxXQ X-Received: by 2002:a05:7022:b901:b0:137:edae:540e with SMTP id a92af1059eb24-137f68e79femr799321c88.6.1780488383279; Wed, 03 Jun 2026 05:06:23 -0700 (PDT) Received: from runnervm3jyl0.5mdysf0siviedfgc1genqfi2hh.dx.internal.cloudapp.net ([52.225.73.166]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-137f54899acsm1595811c88.3.2026.06.03.05.06.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jun 2026 05:06:22 -0700 (PDT) From: gerris.rs@gmail.com To: gcc-patches@gcc.gnu.org, gcc-rust@gcc.gnu.org Cc: pierre-emmanuel.patry@embecosm.com, arthur.cohen@embecosm.com, dkm+gccrs@kataplop.net, Yap Zhi Heng Subject: [gccrs COMMIT] gccrs: Make `extern crate self` resolve to current crate Date: Wed, 3 Jun 2026 12:06:20 +0000 Message-ID: <20260603120621.3103-1-gerris.rs@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on 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~patchwork=sourceware.org@gcc.gnu.org From: Yap Zhi Heng gcc/rust/ChangeLog: * resolve/rust-default-resolver.h (DefaultResolver): Add new visited_crates member for recursion protection. * resolve/rust-default-resolver.cc (DefaultResolver::visit(ExternCrate)): Make references of `self` resolve to the current crate. Signed-off-by: Yap Zhi Heng --- This change was merged into the gccrs repository and is posted here for upstream visibility and potential drive-by review, as requested by GCC release managers. Each commit email contains a link to its details on github from where you can find the Pull-Request and associated discussions. Commit on github: https://github.com/Rust-GCC/gccrs/commit/367269fd522a923bd1e8de3f58f7228d6f45bc35 The commit has NOT been mentioned in any issue. The commit has been mentioned in the following pull-request(s): - https://github.com/Rust-GCC/gccrs/pull/4570 gcc/rust/resolve/rust-default-resolver.cc | 15 +++++++++++++-- gcc/rust/resolve/rust-default-resolver.h | 3 +++ gcc/testsuite/rust/compile/extern_crate_self.rs | 6 ++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/rust/compile/extern_crate_self.rs base-commit: 16a37ba94b143f0f1e9987d0380fca1ae309406f diff --git a/gcc/rust/resolve/rust-default-resolver.cc b/gcc/rust/resolve/rust-default-resolver.cc index 098c81e9b..3b724c9e6 100644 --- a/gcc/rust/resolve/rust-default-resolver.cc +++ b/gcc/rust/resolve/rust-default-resolver.cc @@ -31,6 +31,11 @@ namespace Resolver2_0 { void DefaultResolver::visit (AST::Crate &crate) { + // Guard against infinite recursion: `extern crate self;` resolves to the + // current crate, causing visit(AST::Crate) to call itself infinitely. + if (!visited_crates.insert (crate.get_node_id ()).second) + return; + auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); }; auto &mappings = Analysis::Mappings::get (); @@ -444,7 +449,11 @@ void DefaultResolver::visit (AST::ExternCrate &crate) { auto &mappings = Analysis::Mappings::get (); - auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ()); + tl::optional num_opt; + if (crate.get_referenced_crate () == "self") + num_opt = mappings.get_current_crate (); + else + num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ()); if (!num_opt) { @@ -462,7 +471,9 @@ DefaultResolver::visit (AST::ExternCrate &crate) auto sub_visitor_2 = [&] () { ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (), - crate.get_referenced_crate (), + crate.get_referenced_crate () == "self" + ? mappings.get_current_crate_name () + : crate.get_referenced_crate (), std::move (sub_visitor_1)); }; diff --git a/gcc/rust/resolve/rust-default-resolver.h b/gcc/rust/resolve/rust-default-resolver.h index 55ae2b15f..d3e4e17f8 100644 --- a/gcc/rust/resolve/rust-default-resolver.h +++ b/gcc/rust/resolve/rust-default-resolver.h @@ -20,6 +20,7 @@ #ifndef RUST_AST_DEFAULT_RESOLVER_H #define RUST_AST_DEFAULT_RESOLVER_H +#include "rust-system.h" #include "rust-ast-visitor.h" #include "rust-name-resolution-context.h" @@ -89,6 +90,8 @@ protected: DefaultResolver (NameResolutionContext &ctx) : ctx (ctx) {} NameResolutionContext &ctx; + + std::set visited_crates; }; } // namespace Resolver2_0 diff --git a/gcc/testsuite/rust/compile/extern_crate_self.rs b/gcc/testsuite/rust/compile/extern_crate_self.rs new file mode 100644 index 000000000..920e52f1e --- /dev/null +++ b/gcc/testsuite/rust/compile/extern_crate_self.rs @@ -0,0 +1,6 @@ +#![feature(no_core)] +#![no_core] + +fn main() { + extern crate self as my_crate; +}