[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