{"id":2219794,"url":"http://patchwork.ozlabs.org/api/patches/2219794/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/adEOglkPuoWDPemf@Thaum.localdomain/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<adEOglkPuoWDPemf@Thaum.localdomain>","list_archive_url":null,"date":"2026-04-04T13:13:38","name":"c++/modules: Handle importing an undeduced auto over a deduced auto [PR124735]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"9fa79511e2c0884741c5e2750cf3ca8d1a41b2d7","submitter":{"id":85216,"url":"http://patchwork.ozlabs.org/api/people/85216/?format=json","name":"Nathaniel Shead","email":"nathanieloshead@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/adEOglkPuoWDPemf@Thaum.localdomain/mbox/","series":[{"id":498725,"url":"http://patchwork.ozlabs.org/api/series/498725/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=498725","date":"2026-04-04T13:13:38","name":"c++/modules: Handle importing an undeduced auto over a deduced auto [PR124735]","version":1,"mbox":"http://patchwork.ozlabs.org/series/498725/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2219794/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2219794/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=pwaZF/OK;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=temperror (SPF Temporary Error: DNS Timeout) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=pwaZF/OK","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=none smtp.remote-ip=209.85.216.42"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fnwzj0Stdz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 05 Apr 2026 00:14:19 +1100 (AEDT)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 8CB894BA23D8\n\tfor <incoming@patchwork.ozlabs.org>; Sat,  4 Apr 2026 13:14:11 +0000 (GMT)","from mail-pj1-f42.google.com (mail-pj1-f42.google.com\n [209.85.216.42])\n by sourceware.org (Postfix) with ESMTPS id CA35A4BA23C1\n for <gcc-patches@gcc.gnu.org>; Sat,  4 Apr 2026 13:13:44 +0000 (GMT)","by mail-pj1-f42.google.com with SMTP id\n 98e67ed59e1d1-35d9b4f93f0so616647a91.3\n for <gcc-patches@gcc.gnu.org>; Sat, 04 Apr 2026 06:13:44 -0700 (PDT)","from Thaum.localdomain ([163.53.146.3])\n by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35dd35f52c8sm8119397a91.5.2026.04.04.06.13.41\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sat, 04 Apr 2026 06:13:43 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 8CB894BA23D8","OpenDKIM Filter v2.11.0 sourceware.org CA35A4BA23C1"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org CA35A4BA23C1","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org CA35A4BA23C1","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1775308425; cv=none;\n b=aFWcVNASKxxyBVw1cog3hn+2Ag5Ir7PoMaN2VoCWv0+EYzfZTvHikRp7RJK82ZKNBjOnXNDAvuAsLjitcWZFbIzAXWldOeI6gZ/moBE0vREKHE1LQgE6rlpHSaC1CGEfoE6kKDlQWbv21GqE1JKKFjJ1VXuVyKO7kG/9FLVWSsc=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1775308425; c=relaxed/simple;\n bh=+YZui+acKkQQWe/deebrW1y12whMW3RkP8VW72jqoaE=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=ZUqH8RTSlhZM22HFzHKivVYi9dYXPIPyejd5fyEz/G3nrxSg/7voRYmNacmAri+yG75GscNrfK6hKfVXE7Z0ZLLAy9dyEogj7mqzKuNegJ3ybULPN0gWtfOcaNX1yrbxnfKvPwr3RnOI5hsjnSBjcIQBp3zMOy8q8ggbbpgE51U=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775308424; x=1775913224; darn=gcc.gnu.org;\n h=content-disposition:mime-version:message-id:subject:cc:to:from:date\n :from:to:cc:subject:date:message-id:reply-to;\n bh=4pemEzxdOx4HymhgJ4aOXGVcg/d5KTF3kVH5lWMscy0=;\n b=pwaZF/OKFC7urrhRqGGPt8ABJPBMaee+ZZBP1kVjL/YqsVF82tlb+8sosR+tHILow7\n rrfO4mlz+nLJAApnZCD6K57NR758rLtsByoQm+db6CRu55B15VoH3rH6M5kapmAvu02Q\n GSqVMckt7cCDVUPjpLf+qu6jzr4l5Xj31M+3Mz/PRaZgwOXggaH+kuuMrUmeK7vYDEVe\n Sx8T8XsSPNoSR9BsLdLPH8ruHgL6YqXCCmkkihOubRZgctrEwe9bv+k/wcaNP2PO0i5F\n oYTFXwnNU0wtE2HGFRwSjuSYUbYIZXvNVZja/a5Ha/ZsPdXrx9/ZAs6rqDIvVcrrCdC7\n lc+Q==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775308424; x=1775913224;\n h=content-disposition:mime-version:message-id:subject:cc:to:from:date\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=4pemEzxdOx4HymhgJ4aOXGVcg/d5KTF3kVH5lWMscy0=;\n b=oB+diWVt3mx+QB13zUhq0xBykMAJdZpvvAhFhwm3toux590p4TtbnxGR/Gt7YQlFfD\n ukizYnHBuO20/XiLpux3DnmMEpod7F77Fbtn92q/GJIMJiBoC3X3YnwqWDKvr4ha4a4v\n MiedsyAad8pgY/IYdkACbWZPxSGRq8RGT8XlLX6HDx6Gj7P7x5CjA5w0AUHquci3z3Eq\n VVGtPl5RpHrsdv8xh4d4KkWoGpB5wVSnryfjtxyguWF0YNJoetWHj1tvJgSj/7e4dOwr\n cBei56iumw+mo6bJAA18f+Z0R7VmejFY7nk+YUo/zTGAtxCBDWecMWf1ci5aLkOv078M\n ricQ==","X-Gm-Message-State":"AOJu0YxfOtXPiJeJ1GWb7rCKwG0x7SAeZMzm/OAvBoijdO9ou1uenfUv\n Gc3WebqmbstN7BS3z4yI1fM2XLFAlu6xPsAFEAMBQSg/1Qb35GgApTozcogKEA==","X-Gm-Gg":"AeBDietY0qxxc6LsKa9uddQwNLicJlYW55sKPN01QMX5ltH4fNdgUVD+yb3w+lnz/hL\n Sbmpq/NrDD8lNz4D0hmlPcWfgwOqI4MAQ5XbK6qXpk3NlZ4e4cHPIMkX5Bad6UlATS/b+SEYMJI\n m0iAEdUIs0E36JMYqO97aSjm/4Gn6E45nJI6KjnxHBdRmC1K0MOfu/7zHh1fMzXC7+IrUk4mgEo\n ljuLxv0EC5eRqbswAnb4rGf+O0jbMFqXv3ao6WtE5sZjTWWsJIlSHJOOPr0ndYdoPaxZn3oTgdk\n ady9F8vm30xffHBha/O51OO95MAd6F/PKTzX4oAZx/VXlIDxVWkFwqLH4INfbJyRmzqIVGRhA1W\n bhRalKdnMjmwdZ1AD6Q6LBcj5mh+H0pyy4EbQfNi5g3NCngfjEqEClaK++HnGYyuZ3glli4/OK0\n ocWgPfLJBLzNCSk1A5TIKCfj6T64F6zec4OaPr7/5KSaU6","X-Received":"by 2002:a17:90b:3dcb:b0:35d:a276:a89e with SMTP id\n 98e67ed59e1d1-35de6675b72mr3703867a91.0.1775308423594;\n Sat, 04 Apr 2026 06:13:43 -0700 (PDT)","Date":"Sun, 5 Apr 2026 00:13:38 +1100","From":"Nathaniel Shead <nathanieloshead@gmail.com>","To":"gcc-patches@gcc.gnu.org","Cc":"Jason Merrill <jason@redhat.com>","Subject":"[PATCH] c++/modules: Handle importing an undeduced auto over a\n deduced auto [PR124735]","Message-ID":"<adEOglkPuoWDPemf@Thaum.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk/15?\n\n-- >8 --\n\nLike with implicit constexpr, we need to handle cases where we import an\nfunction declaration with undeduced auto, but we already have a\ndefinition available with deduced auto.  In this case we can just keep\nthe existing declaration's type.\n\n\tPR c++/124735\n\ngcc/cp/ChangeLog:\n\n\t* module.cc (trees_in::is_matching_decl): Handle importing\n\tundeduced auto when existing is already deduced.\n\ngcc/testsuite/ChangeLog:\n\n\t* g++.dg/modules/auto-8_a.H: New test.\n\t* g++.dg/modules/auto-8_b.C: New test.\n\nSigned-off-by: Nathaniel Shead <nathanieloshead@gmail.com>\n---\n gcc/cp/module.cc                        |  6 +++++-\n gcc/testsuite/g++.dg/modules/auto-8_a.H |  7 +++++++\n gcc/testsuite/g++.dg/modules/auto-8_b.C | 15 +++++++++++++++\n 3 files changed, 27 insertions(+), 1 deletion(-)\n create mode 100644 gcc/testsuite/g++.dg/modules/auto-8_a.H\n create mode 100644 gcc/testsuite/g++.dg/modules/auto-8_b.C","diff":"diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc\nindex 6958388e454..25ffbd9eb5a 100644\n--- a/gcc/cp/module.cc\n+++ b/gcc/cp/module.cc\n@@ -12650,7 +12650,9 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef)\n \n       /* Similarly if EXISTING has an undeduced return type, but DECL's\n \t is already deduced.  */\n-      if (undeduced_auto_decl (existing) && !undeduced_auto_decl (decl))\n+      bool e_undeduced = undeduced_auto_decl (existing);\n+      bool d_undeduced = undeduced_auto_decl (decl);\n+      if (e_undeduced && !d_undeduced)\n \t{\n \t  dump (dumper::MERGE)\n \t    && dump (\"Propagating deduced return type to %N\", existing);\n@@ -12659,6 +12661,8 @@ trees_in::is_matching_decl (tree existing, tree decl, bool is_typedef)\n \t  DECL_SAVED_AUTO_RETURN_TYPE (existing) = TREE_TYPE (e_type);\n \t  TREE_TYPE (existing) = change_return_type (TREE_TYPE (d_type), e_type);\n \t}\n+      else if (d_undeduced && !e_undeduced)\n+\t/* EXISTING was deduced, leave it alone.  */;\n       else if (type_uses_auto (d_ret)\n \t       && !same_type_p (TREE_TYPE (d_type), TREE_TYPE (e_type)))\n \t{\ndiff --git a/gcc/testsuite/g++.dg/modules/auto-8_a.H b/gcc/testsuite/g++.dg/modules/auto-8_a.H\nnew file mode 100644\nindex 00000000000..a0a5cacd995\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/modules/auto-8_a.H\n@@ -0,0 +1,7 @@\n+// PR c++/124735\n+// { dg-additional-options \"-fmodule-header\" }\n+// { dg-module-cmi {} }\n+\n+struct S {\n+  auto foo();\n+};\ndiff --git a/gcc/testsuite/g++.dg/modules/auto-8_b.C b/gcc/testsuite/g++.dg/modules/auto-8_b.C\nnew file mode 100644\nindex 00000000000..bd749228a04\n--- /dev/null\n+++ b/gcc/testsuite/g++.dg/modules/auto-8_b.C\n@@ -0,0 +1,15 @@\n+// PR c++/124735\n+// { dg-additional-options \"-fmodules\" }\n+\n+struct S {\n+  auto foo();\n+};\n+\n+auto S::foo() { return 123; }\n+auto pfn = &S::foo;\n+\n+import \"auto-8_a.H\";\n+\n+int main() {\n+  return S{}.foo() != 123;\n+}\n","prefixes":[]}