From patchwork Sat Nov 9 08:28:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathaniel Shead X-Patchwork-Id: 2008873 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=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=hRlXRJJf; 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 4XlprH6mwSz1xyk for ; Sat, 9 Nov 2024 19:29:19 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C29EB3858C50 for ; Sat, 9 Nov 2024 08:29:17 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by sourceware.org (Postfix) with ESMTPS id DCEC73858D20 for ; Sat, 9 Nov 2024 08:28:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DCEC73858D20 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 DCEC73858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1031 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1731140940; cv=none; b=p1xKBRLDZ8AA3yAUi13SlTREqs/yOLkl+sfbkX6lGh8jQ5oXTmJDxqjqIL3HnsvvC1fISI5MMyarVwzKvybW2pFFRTfJxgCzHv29yUe25/+hCs0ofwMW35M7Tk3HGkH1DqmBkWiyS4xINsjtb+Z8vn/YtUaQBTuN8cnEkPUVrps= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1731140940; c=relaxed/simple; bh=XHREGB0uFTLkxc1gk1irB96MuA71aS6ATTwKOY6dgAE=; h=DKIM-Signature:Message-ID:Date:From:To:Subject:MIME-Version; b=uwekPVF9/xPAIGjq5mBm6f0ROo62hDVcKuoEgToqeeh7w8fnsMYCh/lL0i5K1AaVbCRx9h0X+y7CXZ/JWx3z6WPkwLqSIpZHPloWMADwIYIZGKTz6TefYFgXI/F0oY+ToUunby1sSvQgnIPK7drlROw+fhX8d1lklKFpfwlhxIs= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-2e2c2a17aa4so378008a91.0 for ; Sat, 09 Nov 2024 00:28:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1731140937; x=1731745737; darn=gcc.gnu.org; h=in-reply-to:content-disposition:mime-version:references:subject:cc :to:from:date:message-id:from:to:cc:subject:date:message-id:reply-to; bh=E7cW5HEbVTm6rLbGJEfV2gaovabjP+qUDxRbJri11VQ=; b=hRlXRJJfyJdGuR96NKxifydaErDU8NOVAHuOkVt+5RVMm6MsN+FZhrA2kb3B971KJH Xxh6YGHB7rMGNPOn0lDHhXUR3Fw6H58unguh+5bXQrV3kOUlxNnKDkGRknSnLp2hUrWA re/dhzAJGuorW9r1ifwSiDeyjodz7E3zAQfyK0Rz7vr5XdOZ0sp2fBYmVyfxgi6N4JbZ 5WPXhwcx7ye9VAMl3g007NZGEJj2CCEZcgNEkhge2GRtu9PbJl1iwoUemsH7YNHtHrSh 38WzeWoZnab5sNMqlslMDY8XiQfexy1kWb5rpEVR1hMZ7jMGFh4YfSAk6o3c5ac0Ka05 F/nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1731140937; x=1731745737; h=in-reply-to:content-disposition:mime-version:references:subject:cc :to:from:date:message-id:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=E7cW5HEbVTm6rLbGJEfV2gaovabjP+qUDxRbJri11VQ=; b=ZeKK3x/wnuqY3j1zSnr/W8wccxE0tlniePgAMlHnUIN9pj1pSo0Cn6LlkyQl7u/GRy Vpw9bNzprqIU7BHz8sHvkm/d5VYEYwXfwdFgZ5g5pewoQQ89CwOp8LCyW1HL4zAvV2yj F9K+cJBEX0VDMywFWzSNLIV7gogK4Imx8UljW8NGZF0/+MXfJJ7qkfn0L3vI02EDTabD zP3zmIKPk6m1r6yZJirr+OvRHrrL7L00Mn40bBr3LnYi9wxt11GHRks165p7sdLDv+tE ITWAj3MqfvDfulksrZ5aTNAeiiVde4dg1QpfQ3BgZceCrGtOHwIJkU51hWPgqjbjfGdF yhEw== X-Gm-Message-State: AOJu0YwAlIaTIG5H68hCUJXKmJOcyZSM/Mxyxw8b6Aq8bEGUkPg93F1Z dvxrIp+xeEvbTzL0Un6jkK2+VOrVjlemGthPwfCBNI9cj5s2oKuIiXfENg== X-Google-Smtp-Source: AGHT+IEtqk8S5jeJ8CvqQ751+joo7CKvdQhYjwEKo2EKjZ41bixaZVaT/VYbhaSFRbZwLjt716rlwQ== X-Received: by 2002:a17:90b:1e0f:b0:2e2:abab:c458 with SMTP id 98e67ed59e1d1-2e9b16aabbbmr3411005a91.8.1731140936775; Sat, 09 Nov 2024 00:28:56 -0800 (PST) Received: from Thaum. ([163.47.68.2]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2e99a541c95sm7613007a91.17.2024.11.09.00.28.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 09 Nov 2024 00:28:56 -0800 (PST) Message-ID: <672f1d48.170a0220.4887.9d62@mx.google.com> X-Google-Original-Message-ID: Date: Sat, 9 Nov 2024 19:28:52 +1100 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill Subject: [PATCH v2 3/3] c++/modules: Prevent ICE when writing class-scope lambdas without mangling scope [PR116568] References: <672f1bca.050a0220.1f2cda.8a47@mx.google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <672f1bca.050a0220.1f2cda.8a47@mx.google.com> 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 Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? Alternatively, after this I'll work on an update of my P1815 (TU-local entities) patch series [1] which would also solve this ICE by erroring early due to attempting to emit a TU-local entity. As discussed in patch #1 I believe this is incorrect but also seems out of scope of this particular modification. I still think this patch would be useful however, if only for the clarification of the behaviour of streaming lambdas without an extra mangling scope. [1]: https://gcc.gnu.org/pipermail/gcc-patches/2024-October/665108.html -- >8 -- If a lambda doesn't have an extra mangling scope despite being in class scope (such as associated with a type alias, currently), we shouldn't ICE; this behaviour is fine as long as we don't need to merge. In the future such lambdas should be rejected as being TU-local, but for now this at least clarifies the intended behaviour if this edge case occurs again. PR c++/116568 gcc/cp/ChangeLog: * module.cc (trees_out::get_merge_kind): All lambdas without extra mangling scope now marked MK_unique. gcc/testsuite/ChangeLog: * g++.dg/modules/lambda-8.h: New test. * g++.dg/modules/lambda-8_a.H: New test. * g++.dg/modules/lambda-8_b.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/module.cc | 30 ++++++++++++++--------- gcc/testsuite/g++.dg/modules/lambda-8.h | 7 ++++++ gcc/testsuite/g++.dg/modules/lambda-8_a.H | 5 ++++ gcc/testsuite/g++.dg/modules/lambda-8_b.C | 5 ++++ 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/lambda-8.h create mode 100644 gcc/testsuite/g++.dg/modules/lambda-8_a.H create mode 100644 gcc/testsuite/g++.dg/modules/lambda-8_b.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 4eefb2d3584..877e442bc41 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -10737,18 +10737,24 @@ trees_out::get_merge_kind (tree decl, depset *dep) g++.dg/modules/lambda-6_a.C. */ if (DECL_IMPLICIT_TYPEDEF_P (STRIP_TEMPLATE (decl)) && LAMBDA_TYPE_P (TREE_TYPE (decl))) - if (tree scope = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl))) - { - /* Lambdas attached to fields are keyed to its class. */ - if (TREE_CODE (scope) == FIELD_DECL) - scope = TYPE_NAME (DECL_CONTEXT (scope)); - if (DECL_LANG_SPECIFIC (scope) - && DECL_MODULE_KEYED_DECLS_P (scope)) - { - mk = MK_keyed; - break; - } - } + { + if (tree scope = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl))) + { + /* Lambdas attached to fields are keyed to its class. */ + if (TREE_CODE (scope) == FIELD_DECL) + scope = TYPE_NAME (DECL_CONTEXT (scope)); + if (DECL_LANG_SPECIFIC (scope) + && DECL_MODULE_KEYED_DECLS_P (scope)) + { + mk = MK_keyed; + break; + } + } + /* Lambdas without extra mangling scope are unique to the TU, + and cannot be merged; make them unique. */ + mk = MK_unique; + break; + } if (TREE_CODE (decl) == TEMPLATE_DECL && DECL_UNINSTANTIATED_TEMPLATE_FRIEND_P (decl)) diff --git a/gcc/testsuite/g++.dg/modules/lambda-8.h b/gcc/testsuite/g++.dg/modules/lambda-8.h new file mode 100644 index 00000000000..0c66f053b20 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/lambda-8.h @@ -0,0 +1,7 @@ +template struct S { + template static constexpr auto x = []{}; + template using t = decltype([]{}); +}; + +inline auto x = S::x; +using t = S::t; diff --git a/gcc/testsuite/g++.dg/modules/lambda-8_a.H b/gcc/testsuite/g++.dg/modules/lambda-8_a.H new file mode 100644 index 00000000000..d20958ee140 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/lambda-8_a.H @@ -0,0 +1,5 @@ +// PR c++/116568 +// { dg-additional-options "-fmodules-ts -std=c++20" } +// { dg-module-cmi {} } + +#include "lambda-8.h" diff --git a/gcc/testsuite/g++.dg/modules/lambda-8_b.C b/gcc/testsuite/g++.dg/modules/lambda-8_b.C new file mode 100644 index 00000000000..05ea4afd8c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/lambda-8_b.C @@ -0,0 +1,5 @@ +// PR c++/116568 +// { dg-additional-options "-fmodules-ts -std=c++20" } + +#include "lambda-8.h" +import "lambda-8_a.H";