[llvm-branch-commits] [clang] ac97cff - [C++20] [Modules] Don't diagnose duplicated declarations in different modules which is not in file scope
Tom Stellard via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Feb 11 14:05:52 PST 2025
Author: Chuanqi Xu
Date: 2025-02-11T14:05:14-08:00
New Revision: ac97cff5a3684be98f4863191f0006cdf0fa89b4
URL: https://github.com/llvm/llvm-project/commit/ac97cff5a3684be98f4863191f0006cdf0fa89b4
DIFF: https://github.com/llvm/llvm-project/commit/ac97cff5a3684be98f4863191f0006cdf0fa89b4.diff
LOG: [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)
Added:
clang/test/Modules/pr126373.cppm
Modified:
clang/lib/Serialization/ASTReaderDecl.cpp
Removed:
################################################################################
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