[clang] 99daf6b - [C++20] [Modules] Don't handle no linkage entities when overloading
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 26 06:08:13 PDT 2022
Author: Chuanqi Xu
Date: 2022-07-26T21:07:41+08:00
New Revision: 99daf6b2636245446cab0a7800e36fd34777e599
URL: https://github.com/llvm/llvm-project/commit/99daf6b2636245446cab0a7800e36fd34777e599
DIFF: https://github.com/llvm/llvm-project/commit/99daf6b2636245446cab0a7800e36fd34777e599.diff
LOG: [C++20] [Modules] Don't handle no linkage entities when overloading
The original implementation uses `ND->getFormalLinkage() <=
Linkage::InternalLinkage`. It is not right since the spec only says
internal linkage and it doesn't mention 'no linkage'. This matters when
we consider constructors. According to [class.ctor.general]p1,
constructors have no name so constructors have no linkage too.
Added:
clang/test/Modules/ctor.arg.dep.cppm
Modified:
clang/lib/Sema/SemaOverload.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 7207ce7c4d21e..5dc0aadb2d5f3 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -6413,7 +6413,7 @@ void Sema::AddOverloadCandidate(
if (auto *SpecInfo = Function->getTemplateSpecializationInfo())
ND = SpecInfo->getTemplate();
- if (ND->getFormalLinkage() <= Linkage::InternalLinkage) {
+ if (ND->getFormalLinkage() == Linkage::InternalLinkage) {
Candidate.Viable = false;
Candidate.FailureKind = ovl_fail_module_mismatched;
return;
diff --git a/clang/test/Modules/ctor.arg.dep.cppm b/clang/test/Modules/ctor.arg.dep.cppm
new file mode 100644
index 0000000000000..0e5b1a694f6a5
--- /dev/null
+++ b/clang/test/Modules/ctor.arg.dep.cppm
@@ -0,0 +1,44 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: cd %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/A.cppm -I%t -emit-module-interface -o %t/A.pcm
+// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -verify -fsyntax-only
+//
+//--- foo.h
+
+namespace ns {
+
+struct T {
+ T(void*);
+};
+
+struct A {
+ template <typename F>
+ A(F f) : t(&f) {}
+
+ T t;
+};
+
+template <typename T>
+void foo(T) {
+ auto f = [](){};
+ ns::A a(f);
+}
+}
+
+//--- A.cppm
+module;
+#include "foo.h"
+export module A;
+export namespace ns {
+ using ns::A;
+ using ns::foo;
+}
+
+//--- Use.cpp
+// expected-no-diagnostics
+import A;
+void test() {
+ ns::foo(5);
+}
More information about the cfe-commits
mailing list