From patchwork Thu Mar 13 15:16:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathaniel Shead X-Patchwork-Id: 107836 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 F2D833857B98 for ; Thu, 13 Mar 2025 15:19:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F2D833857B98 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=O0Si3KJ1 X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id C12A43858D39 for ; Thu, 13 Mar 2025 15:16:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C12A43858D39 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 C12A43858D39 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::636 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1741879002; cv=none; b=iixqZsdB64ge+J3+ahT4ZQ6Zkf0qeaoLMu0eEV93OhbxGGC0whNHGzksOnY2QXkpebBlT6vPO7DEAtsyZv/gBOOecIDjA1Nrg4UnBgbeeorar4T6XcWGCbFieMuK3u3V7JdJWIDBdmG7/QgEHpE+DbCQQP/ZNJAW9PX2N9t4Nmc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1741879002; c=relaxed/simple; bh=OMCps8aF40ztTIjjobhABeC1nW0TTOZaKL/294bPjjQ=; h=DKIM-Signature:Message-ID:Date:From:To:Subject:MIME-Version; b=ZJ3VK3ez4BTNjPw1aPj8K6emG5wSvML1CoEbuj7zgfzjlzGbXui0fRMZYXIjju4tTL/g4rYSu7jJxo3ksHXMdouqMnFUCIP/xf87J0N8Hiz8N9Jl2Qxzd6xhnUx5bvJRqkJtajyua14GYhpTZYBTA3xssUxEN+GFMC8MDSll1Ys= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-2240b4de10eso3149735ad.1 for ; Thu, 13 Mar 2025 08:16:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741879000; x=1742483800; darn=gcc.gnu.org; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=7faflka2jC0/XXvhVScZzWV3dcBjQ6z1Z69oHJQKstQ=; b=O0Si3KJ1o9jrCmZHqNj3ymlsEjL08WwA6aLsetvNJ22DMZzn5nyAUQ6bsQ+e08JYBn rAEvQHv2biMPsPNfMU2w9uoXP5E2tBXUKM5KkHWtVZKBkI2xkvBQhH3d092exAPJhT94 e619zflgOhjLfDyBRjpGLSzCpR7S1U33zpXgd8SK+FKBYJkTIRGDAc0ykjp2XxUEduEk XT6KOr7L8o0yRSmPCY5lxnRZxMYjBnALAGU8UctueVVq6/Qv5WbEjiOn7D9r3WsHVCgy 0hUurCs4L95REE5JI9rPQNYa8328UIyeG4iVeruA2bIiQM3QW/v/kLPZolorTp2DYCbv 3dMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741879000; x=1742483800; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7faflka2jC0/XXvhVScZzWV3dcBjQ6z1Z69oHJQKstQ=; b=RN3yB5YUOGawFiTLkjtfew3THeW6Yw46rH2NKyM+QUtyqp/doDYOgH77fXYNxNGP7P jHVUgakeOEbxbxcILnr3n5lhZa19Cxz3+2GAm5bAx0Tefl3NNeoAAFxu57pzECPYOTYB vnDKp32pP0uHW5NSucYehTNUVYKDJXdicZZGiFL4qKajjJpw/EtmcgJwGEpn+EvaAazy 0iQHTuN8UBR5mzsXtS8gbstEhwZQxzCc7fNQdZgyBjGv7+lAY1SFcsKG1ysgY2HPz0JW a47FqtTms3zlCmYVCgV4wKG+ZJTuwhSI2Iir8blXwHBxjBH3K9WMDDT6mupJjcaqmxCL NHnA== X-Gm-Message-State: AOJu0YzW9dMLRzoA0iKfGoSYjUxc04smnaYphRet25hOi7GmOjzKB5pH ZObjmhuLZFMm3YIvVOttuf5kx+CIiljQOgX8gTf7mv5d/IjxJqx8RpYPzg== X-Gm-Gg: ASbGnctuuOc67mwp1webEhEgfOM7Om4zv0MzX+XeZrqJeDoDMQwh4boMysRG9OD5/37 8DWu6MERXS8krTtlFhaWkcw3iFek5GkHjB+UJXBUUlazM7vETUwpoHDCnUwZMcYEcCx2yG61HW6 tbekUGLnHS7BbJWfQ88kPx2BaC5MAkS1GQ7n4RI7nIncH7psNBOKPqzY7g72BCLuUqPzNPFMPXi LV+t3pIZUJf7iSEiZJEjQJiVTGzk+90HWo96wKzFsgvfRVcz+RrvAlNRqvNunaN7IUxd6ZUnzxP rivRtLLTn6oCQAogblZwR+3Hiqx2RpaeZ37zPwSLln45u2pK3E+ePC6i/PVIQcjMFCHO3dG9ZXZ leOUUc6LW+QyJ62RMap3bFTA= X-Google-Smtp-Source: AGHT+IF0OhR/HiJXUxORjX7Np1SdOc9yQJCpWCL8q1v5gIj3m7ldpjl2Hcbkw66aKr278HM9+E/MZQ== X-Received: by 2002:a17:902:d584:b0:224:1212:7da1 with SMTP id d9443c01a7336-2259330060fmr61335065ad.13.1741878999995; Thu, 13 Mar 2025 08:16:39 -0700 (PDT) Received: from Thaum. (163-47-68-46.ipv4.originbroadband.com.au. [163.47.68.46]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-225c68a47c1sm14556325ad.68.2025.03.13.08.16.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 08:16:39 -0700 (PDT) Message-ID: <67d2f6d7.170a0220.5992f.ecc4@mx.google.com> X-Google-Original-Message-ID: Date: Fri, 14 Mar 2025 02:16:34 +1100 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill Subject: [PATCH] c++: Make explicit instantiations not vague linkage 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, 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 I discovered from some further testing that I broke 'import std' in some cases with my last patch; this fixes that. This still isn't sufficient I've found to fix PR119154 completely, as there's still more cases where this assert fires due to performing import_export_decl on non-DECL_REALLY_EXTERN at EOF. I'll continue trying to reduce and find each case. But either way I think this is a needed improvement; bootstrapped and regtested on x86_64-pc-linux-gnu (so far just modules.exp), OK for trunk if full regtest succeeds? -- >8 -- My change in r15-8012 for PR c++/119154 caused a bug with explicit instantation declarations. The change cleared DECL_INTERFACE_KNOWN for all vague-linkage entities, including explicit instantiations. When we then perform lazy loading at EOF (due to processing deferred function bodies), expand_or_defer_fn ends up calling import_export_decl which will error because DECL_INTERFACE_KNOWN is still unset but no definition is available in the file, violating some assertions. It turns out that for function templates marked inline we would not respect an 'extern template' imported in general, either; this patch fixes both of these issues by always treating explicit instantiations as external, and so marking DECL_INTERFACE_KNOWN eagerly. For an explicit instantiation declaration we don't want to emit the body of the function as it must be emitted in a different TU anyway. And for explicit instantiation definitions we similarly know that it will have been emitted in the interface TU we streamed it in from, so there's no need to emit it. gcc/cp/ChangeLog: * decl2.cc (vague_linkage_p): Explicit instantiations are not vague linkage. gcc/testsuite/ChangeLog: * g++.dg/modules/extern-tpl-3_a.C: New test. * g++.dg/modules/extern-tpl-3_b.C: New test. * g++.dg/modules/extern-tpl-4_a.C: New test. * g++.dg/modules/extern-tpl-4_b.C: New test. Signed-off-by: Nathaniel Shead Signed-off-by: Nathaniel Shead --- gcc/cp/decl2.cc | 3 ++ gcc/testsuite/g++.dg/modules/extern-tpl-3_a.C | 11 +++++ gcc/testsuite/g++.dg/modules/extern-tpl-3_b.C | 12 +++++ gcc/testsuite/g++.dg/modules/extern-tpl-4_a.C | 24 ++++++++++ gcc/testsuite/g++.dg/modules/extern-tpl-4_b.C | 46 +++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 gcc/testsuite/g++.dg/modules/extern-tpl-3_a.C create mode 100644 gcc/testsuite/g++.dg/modules/extern-tpl-3_b.C create mode 100644 gcc/testsuite/g++.dg/modules/extern-tpl-4_a.C create mode 100644 gcc/testsuite/g++.dg/modules/extern-tpl-4_b.C diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc index 4a9fb1c3c00..712fdc45d40 100644 --- a/gcc/cp/decl2.cc +++ b/gcc/cp/decl2.cc @@ -2480,6 +2480,9 @@ vague_linkage_p (tree decl) /* Unfortunately, import_export_decl has not always been called before the function is processed, so we cannot simply check DECL_COMDAT. */ + if (DECL_LANG_SPECIFIC (decl) + && DECL_EXPLICIT_INSTANTIATION (decl)) + return false; if (DECL_COMDAT (decl) || (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl) diff --git a/gcc/testsuite/g++.dg/modules/extern-tpl-3_a.C b/gcc/testsuite/g++.dg/modules/extern-tpl-3_a.C new file mode 100644 index 00000000000..def3cd1413d --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/extern-tpl-3_a.C @@ -0,0 +1,11 @@ +// { dg-additional-options "-fmodules -Wno-global-module" } +// { dg-module-cmi M } + +module; +template +struct S { + S() {} +}; +export module M; +extern template class S; +S s; diff --git a/gcc/testsuite/g++.dg/modules/extern-tpl-3_b.C b/gcc/testsuite/g++.dg/modules/extern-tpl-3_b.C new file mode 100644 index 00000000000..5d96937ce02 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/extern-tpl-3_b.C @@ -0,0 +1,12 @@ +// { dg-additional-options "-fmodules" } + +template +struct S { + S() {} +}; + +void foo() { S x;} + +import M; + +// Lazy loading of extern S at EOF should not ICE diff --git a/gcc/testsuite/g++.dg/modules/extern-tpl-4_a.C b/gcc/testsuite/g++.dg/modules/extern-tpl-4_a.C new file mode 100644 index 00000000000..16f1b041307 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/extern-tpl-4_a.C @@ -0,0 +1,24 @@ +// { dg-additional-options "-fmodules" } +// { dg-module-cmi M } + +export module M; + +export template inline void a() {} +extern template void a(); +extern template void a(); +template void a(); + +export template void b() {} +extern template void b(); +extern template void b(); +template void b(); + +export template inline int c = 123; +extern template int c; +extern template int c; +template int c; + +export template int d = 123; +extern template int d; +extern template int d; +template int d; diff --git a/gcc/testsuite/g++.dg/modules/extern-tpl-4_b.C b/gcc/testsuite/g++.dg/modules/extern-tpl-4_b.C new file mode 100644 index 00000000000..1dd4afe9f6b --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/extern-tpl-4_b.C @@ -0,0 +1,46 @@ +// { dg-additional-options "-fmodules" } + +import M; + +int main() { + a(); + a(); + a(); + + b(); + b(); + b(); + + int x = c + c + c; + int y = d + d + d; + return x + y; +} + +// 'int': imported explicit instantiation decls should not be emitted here: +// { dg-final { scan-assembler-not "_ZW1M1aIiEvv:" } } +// { dg-final { scan-assembler-not "_ZW1M1bIiEvv:" } } +// { dg-final { scan-assembler-not "_ZW1M1cIiE:" } } +// { dg-final { scan-assembler-not "_ZW1M1dIiE:" } } + +// 'char': explicit instantiation definitions don't need to be emitted here: +// { dg-final { scan-assembler-not "_ZW1M1aIcEvv:" } } +// { dg-final { scan-assembler-not "_ZW1M1bIcEvv:" } } +// { dg-final { scan-assembler-not "_ZW1M1cIcE:" } } +// { dg-final { scan-assembler-not "_ZW1M1dIcE:" } } + +// 'double': these are not explicitly instantiated and should be emitted here: +// { dg-final { scan-assembler "_ZW1M1aIdEvv:" } } +// { dg-final { scan-assembler "_ZW1M1bIdEvv:" } } +// { dg-final { scan-assembler "_ZW1M1cIdE:" } } +// { dg-final { scan-assembler "_ZW1M1dIdE:" } } + +template void a(); +template void b(); +template int c; +template int d; + +// 'bool': instantiated in this file, and so must be emitted here: +// { dg-final { scan-assembler "_ZW1M1aIbEvv:" } } +// { dg-final { scan-assembler "_ZW1M1bIbEvv:" } } +// { dg-final { scan-assembler "_ZW1M1cIbE:" } } +// { dg-final { scan-assembler "_ZW1M1dIbE:" } }