[llvm-branch-commits] [clang] release/20.x: [C++20] [Modules] Don't diagnose duplicated declarations in different modules which is not in file scope (PR #126685)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Feb 11 14:05:37 PST 2025


https://github.com/llvmbot updated https://github.com/llvm/llvm-project/pull/126685

>From ac97cff5a3684be98f4863191f0006cdf0fa89b4 Mon Sep 17 00:00:00 2001
From: Chuanqi Xu <yedeng.yd at linux.alibaba.com>
Date: Tue, 11 Feb 2025 14:08:47 +0800
Subject: [PATCH] [C++20] [Modules] Don't diagnose duplicated declarations in
 different modules which is not in file scope

Close https://github.com/llvm/llvm-project/issues/126373

Although the root problems should be we shouldn't place the friend
declaration to the incorrect module, let's avoid bleeding the edge by
stoping diagnosing declarations not in file scope.

(cherry picked from commit 569e94f8f1c3e6998860e2b2ff577870433bdac9)
---
 clang/lib/Serialization/ASTReaderDecl.cpp |  7 +++++
 clang/test/Modules/pr126373.cppm          | 34 +++++++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 clang/test/Modules/pr126373.cppm

diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 1aa94d5a22abe..8fbb0a8d3edd8 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -3751,6 +3751,13 @@ void ASTDeclReader::checkMultipleDefinitionInNamedModules(ASTReader &Reader,
   if (D->getFriendObjectKind() || Previous->getFriendObjectKind())
     return;
 
+  // Skip diagnosing in-class declarations.
+  if (!Previous->getLexicalDeclContext()
+           ->getNonTransparentContext()
+           ->isFileContext() ||
+      !D->getLexicalDeclContext()->getNonTransparentContext()->isFileContext())
+    return;
+
   Module *M = Previous->getOwningModule();
   if (!M)
     return;
diff --git a/clang/test/Modules/pr126373.cppm b/clang/test/Modules/pr126373.cppm
new file mode 100644
index 0000000000000..f176a587b51ce
--- /dev/null
+++ b/clang/test/Modules/pr126373.cppm
@@ -0,0 +1,34 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/module1.cppm -emit-module-interface -o %t/module1.pcm
+// RUN: %clang_cc1 -std=c++20 -fmodule-file=module1=%t/module1.pcm  %t/module2.cppm \
+// RUN:     -emit-module-interface -o %t/module2.pcm
+// RUN: %clang_cc1 -std=c++20 %t/module2.pcm -fmodule-file=module1=%t/module1.pcm \
+// RUN:     -emit-llvm -o - | FileCheck %t/module2.cppm
+
+//--- test.h
+template<typename T>
+struct Test {
+  template<typename U>
+  friend class Test;
+};
+
+//--- module1.cppm
+module;
+#include "test.h"
+export module module1;
+export void f1(Test<int>) {}
+
+//--- module2.cppm
+module;
+#include "test.h"
+export module module2;
+import module1;
+export void f2(Test<float>) {}
+
+extern "C" void func() {}
+
+// Fine enough to check the IR is emitted correctly.
+// CHECK: define{{.*}}@func



More information about the llvm-branch-commits mailing list