From patchwork Sat Apr 4 13:13:38 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathaniel Shead X-Patchwork-Id: 132684 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 50F154BA23C2 for ; Sat, 4 Apr 2026 13:14:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 50F154BA23C2 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=pwaZF/OK X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) by sourceware.org (Postfix) with ESMTPS id CA35A4BA23C1 for ; Sat, 4 Apr 2026 13:13:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CA35A4BA23C1 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 CA35A4BA23C1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.85.216.42 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775308425; cv=none; b=aFWcVNASKxxyBVw1cog3hn+2Ag5Ir7PoMaN2VoCWv0+EYzfZTvHikRp7RJK82ZKNBjOnXNDAvuAsLjitcWZFbIzAXWldOeI6gZ/moBE0vREKHE1LQgE6rlpHSaC1CGEfoE6kKDlQWbv21GqE1JKKFjJ1VXuVyKO7kG/9FLVWSsc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775308425; c=relaxed/simple; bh=+YZui+acKkQQWe/deebrW1y12whMW3RkP8VW72jqoaE=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=ZUqH8RTSlhZM22HFzHKivVYi9dYXPIPyejd5fyEz/G3nrxSg/7voRYmNacmAri+yG75GscNrfK6hKfVXE7Z0ZLLAy9dyEogj7mqzKuNegJ3ybULPN0gWtfOcaNX1yrbxnfKvPwr3RnOI5hsjnSBjcIQBp3zMOy8q8ggbbpgE51U= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CA35A4BA23C1 Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-35d9b4f93f0so616647a91.3 for ; Sat, 04 Apr 2026 06:13:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775308424; x=1775913224; darn=gcc.gnu.org; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc:subject:date:message-id:reply-to; bh=4pemEzxdOx4HymhgJ4aOXGVcg/d5KTF3kVH5lWMscy0=; b=pwaZF/OKFC7urrhRqGGPt8ABJPBMaee+ZZBP1kVjL/YqsVF82tlb+8sosR+tHILow7 rrfO4mlz+nLJAApnZCD6K57NR758rLtsByoQm+db6CRu55B15VoH3rH6M5kapmAvu02Q GSqVMckt7cCDVUPjpLf+qu6jzr4l5Xj31M+3Mz/PRaZgwOXggaH+kuuMrUmeK7vYDEVe Sx8T8XsSPNoSR9BsLdLPH8ruHgL6YqXCCmkkihOubRZgctrEwe9bv+k/wcaNP2PO0i5F oYTFXwnNU0wtE2HGFRwSjuSYUbYIZXvNVZja/a5Ha/ZsPdXrx9/ZAs6rqDIvVcrrCdC7 lc+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775308424; x=1775913224; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=4pemEzxdOx4HymhgJ4aOXGVcg/d5KTF3kVH5lWMscy0=; b=oB+diWVt3mx+QB13zUhq0xBykMAJdZpvvAhFhwm3toux590p4TtbnxGR/Gt7YQlFfD ukizYnHBuO20/XiLpux3DnmMEpod7F77Fbtn92q/GJIMJiBoC3X3YnwqWDKvr4ha4a4v MiedsyAad8pgY/IYdkACbWZPxSGRq8RGT8XlLX6HDx6Gj7P7x5CjA5w0AUHquci3z3Eq VVGtPl5RpHrsdv8xh4d4KkWoGpB5wVSnryfjtxyguWF0YNJoetWHj1tvJgSj/7e4dOwr cBei56iumw+mo6bJAA18f+Z0R7VmejFY7nk+YUo/zTGAtxCBDWecMWf1ci5aLkOv078M ricQ== X-Gm-Message-State: AOJu0YxfOtXPiJeJ1GWb7rCKwG0x7SAeZMzm/OAvBoijdO9ou1uenfUv Gc3WebqmbstN7BS3z4yI1fM2XLFAlu6xPsAFEAMBQSg/1Qb35GgApTozcogKEA== X-Gm-Gg: AeBDietY0qxxc6LsKa9uddQwNLicJlYW55sKPN01QMX5ltH4fNdgUVD+yb3w+lnz/hL Sbmpq/NrDD8lNz4D0hmlPcWfgwOqI4MAQ5XbK6qXpk3NlZ4e4cHPIMkX5Bad6UlATS/b+SEYMJI m0iAEdUIs0E36JMYqO97aSjm/4Gn6E45nJI6KjnxHBdRmC1K0MOfu/7zHh1fMzXC7+IrUk4mgEo ljuLxv0EC5eRqbswAnb4rGf+O0jbMFqXv3ao6WtE5sZjTWWsJIlSHJOOPr0ndYdoPaxZn3oTgdk ady9F8vm30xffHBha/O51OO95MAd6F/PKTzX4oAZx/VXlIDxVWkFwqLH4INfbJyRmzqIVGRhA1W bhRalKdnMjmwdZ1AD6Q6LBcj5mh+H0pyy4EbQfNi5g3NCngfjEqEClaK++HnGYyuZ3glli4/OK0 ocWgPfLJBLzNCSk1A5TIKCfj6T64F6zec4OaPr7/5KSaU6 X-Received: by 2002:a17:90b:3dcb:b0:35d:a276:a89e with SMTP id 98e67ed59e1d1-35de6675b72mr3703867a91.0.1775308423594; Sat, 04 Apr 2026 06:13:43 -0700 (PDT) Received: from Thaum.localdomain ([163.53.146.3]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd35f52c8sm8119397a91.5.2026.04.04.06.13.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 04 Apr 2026 06:13:43 -0700 (PDT) Date: Sun, 5 Apr 2026 00:13:38 +1100 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill Subject: [PATCH] c++/modules: Handle importing an undeduced auto over a deduced auto [PR124735] Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, 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 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 Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk/15? -- >8 -- Like with implicit constexpr, we need to handle cases where we import an function declaration with undeduced auto, but we already have a definition available with deduced auto. In this case we can just keep the existing declaration's type. PR c++/124735 gcc/cp/ChangeLog: * module.cc (trees_in::is_matching_decl): Handle importing undeduced auto when existing is already deduced. gcc/testsuite/ChangeLog: * g++.dg/modules/auto-8_a.H: New test. * g++.dg/modules/auto-8_b.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/module.cc | 6 +++++- gcc/testsuite/g++.dg/modules/auto-8_a.H | 7 +++++++ gcc/testsuite/g++.dg/modules/auto-8_b.C | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/modules/auto-8_a.H create mode 100644 gcc/testsuite/g++.dg/modules/auto-8_b.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 6958388e454..25ffbd9eb5a 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -12650,7 +12650,9 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef) /* Similarly if EXISTING has an undeduced return type, but DECL's is already deduced. */ - if (undeduced_auto_decl (existing) && !undeduced_auto_decl (decl)) + bool e_undeduced = undeduced_auto_decl (existing); + bool d_undeduced = undeduced_auto_decl (decl); + if (e_undeduced && !d_undeduced) { dump (dumper::MERGE) && dump ("Propagating deduced return type to %N", existing); @@ -12659,6 +12661,8 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef) DECL_SAVED_AUTO_RETURN_TYPE (existing) = TREE_TYPE (e_type); TREE_TYPE (existing) = change_return_type (TREE_TYPE (d_type), e_type); } + else if (d_undeduced && !e_undeduced) + /* EXISTING was deduced, leave it alone. */; else if (type_uses_auto (d_ret) && !same_type_p (TREE_TYPE (d_type), TREE_TYPE (e_type))) { diff --git a/gcc/testsuite/g++.dg/modules/auto-8_a.H b/gcc/testsuite/g++.dg/modules/auto-8_a.H new file mode 100644 index 00000000000..a0a5cacd995 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/auto-8_a.H @@ -0,0 +1,7 @@ +// PR c++/124735 +// { dg-additional-options "-fmodule-header" } +// { dg-module-cmi {} } + +struct S { + auto foo(); +}; diff --git a/gcc/testsuite/g++.dg/modules/auto-8_b.C b/gcc/testsuite/g++.dg/modules/auto-8_b.C new file mode 100644 index 00000000000..bd749228a04 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/auto-8_b.C @@ -0,0 +1,15 @@ +// PR c++/124735 +// { dg-additional-options "-fmodules" } + +struct S { + auto foo(); +}; + +auto S::foo() { return 123; } +auto pfn = &S::foo; + +import "auto-8_a.H"; + +int main() { + return S{}.foo() != 123; +}