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); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits