forked from OSchip/llvm-project
[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.
This commit is contained in:
parent
0d191b7553
commit
99daf6b263
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue