From patchwork Mon Apr 14 16:31:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arthur Cohen X-Patchwork-Id: 110400 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6D89B385840C for ; Mon, 14 Apr 2025 16:44:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6D89B385840C Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=embecosm.com header.i=@embecosm.com header.a=rsa-sha256 header.s=google header.b=E2OyYeJW X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by sourceware.org (Postfix) with ESMTPS id 8402D385840C for ; Mon, 14 Apr 2025 16:31:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8402D385840C 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 8402D385840C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::330 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1744648302; cv=none; b=ASPfRKk2rGmKhyAUxCkz0E48b2RX52PcVaEe1e+SPKiNNCAChfweadI/bRgp6zUXCYc0ObBgX/n/gm5Iqgu7e7yln0tcyGtpvlEhuHW4GXi22al4cZPnxzh9BaG/lBLjQhvZR5Tw+vQBCwGls5VhCRCEmb/bNhMjoiaxYrQkwbE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1744648302; c=relaxed/simple; bh=FMjvXotcD8vSUWIo/gxAOEM8E0vqc6vyMetn1VQ1gVA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=IrC9rLEIs2VoZzgZo9nO4pjwhM4whbk5p6DsvcNsMbBmweJqk/imsWuCgjVbMG+6D0GvMUf9DEUA31p0rOgXc1OTInl4qbVzZfD2E9DYaeEYpVxYs3TiutsB2Ovowo55hf6NZpqMQoriY7Qcq9oEJps1npA4Stz2du9kxTpdqlk= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8402D385840C Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-43edecbfb46so31390875e9.0 for ; Mon, 14 Apr 2025 09:31:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1744648301; x=1745253101; 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=2XjAeh7OQKIIafkkMe5AJeceIsQFsBO/gb7ii7eFkfc=; b=E2OyYeJWevLEbvp7RE+BkifU3Q6+Q7Q2QpaLh+Gqn3TCBhL4zuJYh9f0pE5hkq8hV4 pOjLHYKOZUZaJY1ZM8Go1CyBI8aSyeYMusOf4TW3nnmu3TS2v0RrUtRHMlEPSLFgYGXH TwdGPEVvKAYIY9PjRZ4TLkwYizEkZ3pZcnv8mZK7Qw/rRrXmA88tAonMwcBBv0erM3d6 HfRigi0XCv0MI0foKEiHLCVAj5pHYV/8Ch4jR9t3iefz9m+XsnGUDHllPchaEyrnCqQ2 R7g2qASlynYU8XelrZqqrhCPwW3bhzvxLZePRmTzxdMXOdkv4mc0rdkF+0/aR7m8K32S Wn7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744648301; x=1745253101; 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=2XjAeh7OQKIIafkkMe5AJeceIsQFsBO/gb7ii7eFkfc=; b=bz6m8GNkizA539RH2HZy2B6ZJjQ8aTKsTk/pAYuGnNuQE3SpZcIIE+avLQonYbiuG2 mmnSiblIj257tl594VxmaMu2Ox5nf5Tnfoo1Y3cayjjdiQuiBaFxgUKp17VQ235VCtEO d6Z2mWZ2/jypHT3K+OMSP23agAQVxT9HTW288ROIWmRhu4RoJrXaei9vofdbQgQkbaFj PbDWBRqbIIOoTT5fNiOKg/ZpsOIDjnVldmOgt3iGl3r854vaLDsHG/peIvgL6qF85QXZ oaptlVWffI9NuToe1jUgem0R4E6kk97ksPloknmcbrQf0JGhH6m6Ky5CY236al1YKg/H y1IQ== X-Gm-Message-State: AOJu0YwMLL6HWbmrrDWy8exOrfT5Bh+VuaXRO8S9AeVUw3LiaI5tab/w JZpX8I69AYWIBzXF9MKiiOfPTl2ToMzLtR9wke3a5h5PNV13PcaExeJE6lf2qaMgU6PU+q3Qojp wSQ== X-Gm-Gg: ASbGncsk6gngRwv9vmoovij/+JtnsU+U0sgHJpiifjtXii0SCCeEoTRtS+JTMrjQ4rc 8LS5Le8eFMNWvEmmHrNWTMYPjV0znBUu+thEC2O/89BDCRyMBLjDQSzYFR7Am44z3NYRcbc9zY2 k8ZJS0ReWOgaWO4FLHoeWbVfc6LfRDda1xEY+5REP2+tBwzvtNevv402wxoywdLcuEEGD1Z7N5s tnqaZTRNmeyCF4P7xW0rSgRpTDTTWhV2b14JZxG5h+Mw8MKaqNYJXivSyzLsVguz9+H0DhlE/LV O9HbQNBE/uR0XVkIKkJGulwhlQf9TG2xq1Axk5shWd2hKcJjCA== X-Google-Smtp-Source: AGHT+IFxR2Xn5cKOLj24Y9YIhHf+NXlPrbmAPt2r8PHFhAFhAO55z1uAJPPlPk7uX+tQeSIQ4XBPJA== X-Received: by 2002:a05:6000:4205:b0:391:40bd:6222 with SMTP id ffacd0b85a97d-39ea5200a8emr8887449f8f.22.1744648300702; Mon, 14 Apr 2025 09:31:40 -0700 (PDT) Received: from platypus.lan ([2a04:cec2:23:71c0:c543:1fff:77d1:f317]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-39ed15caa5asm6399335f8f.20.2025.04.14.09.31.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Apr 2025 09:31:40 -0700 (PDT) From: arthur.cohen@embecosm.com To: gcc-patches@gcc.gnu.org Cc: gcc-rust@gcc.gnu.org, Arthur Cohen Subject: [COMMITTED 10/19] gccrs: expansion: Only add fragments if the matcher succeeded Date: Mon, 14 Apr 2025 18:31:30 +0200 Message-ID: <20250414163138.506753-11-arthur.cohen@embecosm.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250414163138.506753-2-arthur.cohen@embecosm.com> References: <20250414163138.506753-2-arthur.cohen@embecosm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-14.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 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~patchwork=sourceware.org@gcc.gnu.org From: Arthur Cohen gcc/rust/ChangeLog: * expand/rust-macro-expand.cc (MacroExpander::match_n_matches): Do not insert fragments and substack fragments if the matcher failed. gcc/testsuite/ChangeLog: * rust/compile/macros/mbe/macro-issue3708.rs: New test. --- gcc/rust/expand/rust-macro-expand.cc | 15 ++-- .../compile/macros/mbe/macro-issue3708.rs | 80 +++++++++++++++++++ 2 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/rust/compile/macros/mbe/macro-issue3708.rs diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc index cd17a3f9ba1..6e62a083ae7 100644 --- a/gcc/rust/expand/rust-macro-expand.cc +++ b/gcc/rust/expand/rust-macro-expand.cc @@ -621,9 +621,10 @@ MacroExpander::match_n_matches (Parser &parser, // matched fragment get the offset in the token stream size_t offs_end = source.get_offs (); - sub_stack.insert_metavar ( - MatchedFragment (fragment->get_ident ().as_string (), - offs_begin, offs_end)); + if (valid_current_match) + sub_stack.insert_metavar ( + MatchedFragment (fragment->get_ident ().as_string (), + offs_begin, offs_end)); } break; @@ -650,15 +651,15 @@ MacroExpander::match_n_matches (Parser &parser, } auto old_stack = sub_stack.pop (); - // nest metavars into repetitions - for (auto &ent : old_stack) - sub_stack.append_fragment (ent.first, std::move (ent.second)); - // If we've encountered an error once, stop trying to match more // repetitions if (!valid_current_match) break; + // nest metavars into repetitions + for (auto &ent : old_stack) + sub_stack.append_fragment (ent.first, std::move (ent.second)); + match_amount++; // Break early if we notice there's too many expressions already diff --git a/gcc/testsuite/rust/compile/macros/mbe/macro-issue3708.rs b/gcc/testsuite/rust/compile/macros/mbe/macro-issue3708.rs new file mode 100644 index 00000000000..e5b38bb0da7 --- /dev/null +++ b/gcc/testsuite/rust/compile/macros/mbe/macro-issue3708.rs @@ -0,0 +1,80 @@ +// { dg-additional-options "-frust-name-resolution-2.0 -frust-compile-until=lowering" } + +macro_rules! impl_fn_for_zst { + ($( + $( #[$attr: meta] )* + struct $Name: ident impl$( <$( $lifetime : lifetime ),+> )? Fn = + |$( $arg: ident: $ArgTy: ty ),*| -> $ReturnTy: ty + $body: block; + )+) => { + $( + $( #[$attr] )* + struct $Name; + + impl $( <$( $lifetime ),+> )? Fn<($( $ArgTy, )*)> for $Name { + #[inline] + extern "rust-call" fn call(&self, ($( $arg, )*): ($( $ArgTy, )*)) -> $ReturnTy { + $body + } + } + + impl $( <$( $lifetime ),+> )? FnMut<($( $ArgTy, )*)> for $Name { + #[inline] + extern "rust-call" fn call_mut( + &mut self, + ($( $arg, )*): ($( $ArgTy, )*) + ) -> $ReturnTy { + Fn::call(&*self, ($( $arg, )*)) + } + } + + impl $( <$( $lifetime ),+> )? FnOnce<($( $ArgTy, )*)> for $Name { + type Output = $ReturnTy; + + #[inline] + extern "rust-call" fn call_once(self, ($( $arg, )*): ($( $ArgTy, )*)) -> $ReturnTy { + Fn::call(&self, ($( $arg, )*)) + } + } + )+ + } +} + +#[lang = "sized"] +trait Sized {} + +#[lang = "copy"] +trait Copy {} + +#[lang = "fn"] +pub trait Fn: FnMut { + /// Performs the call operation. + #[unstable(feature = "fn_traits", issue = "29625")] + extern "rust-call" fn call(&self, args: Args) -> Self::Output; +} + +#[lang = "fn_mut"] +#[must_use = "closures are lazy and do nothing unless called"] +pub trait FnMut: FnOnce { + /// Performs the call operation. + #[unstable(feature = "fn_traits", issue = "29625")] + extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output; +} + +#[lang = "fn_once"] +pub trait FnOnce { + /// The returned type after the call operator is used. + #[lang = "fn_once_output"] + #[stable(feature = "fn_once_output", since = "1.12.0")] + type Output; + + /// Performs the call operation. + #[unstable(feature = "fn_traits", issue = "29625")] + extern "rust-call" fn call_once(self, args: Args) -> Self::Output; +} + +impl_fn_for_zst! { + #[derive(Copy)] + struct LinesAnyMap impl<'a> Fn = |line: &'a str| -> () { + }; +}