SemaTemplateInstantiateDecl mistakenly issuing diag::warn_func_template_missing for templated deduction guides
Mário Feroldi via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 25 06:17:10 PDT 2017
Following compilation shows the issue:
$ clang++ --version
clang version 6.0.0 (trunk 316414)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/compiler-explorer/clang-trunk/bin
$ cat a.cpp
template <typename T>
struct S
{
template <typename U>
S(U&&) {}
};
template <typename T>
S(T) -> S<T>;
int main()
{
S s(42);
}
$ clang++ -std=c++17 -Wundefined-func-template a.cpp
a.cpp:13:7: warning: instantiation of function '<deduction guide for
S><int>' required here, but no definition is available
[-Wundefined-func-template]
S s(42);
^
a.cpp:9:1: note: forward declaration of template entity is here
S(T) -> S<T>;
^
a.cpp:13:7: note: add an explicit instantiation declaration to suppress
this warning if '<deduction guide for S><int>' is explicitly instantiated
in another translation unit
S s(42);
^
I found out that this warning occurs at
lib/Sema/SemaTemplateInstantiateDecl.cpp:3809:
else if (TSK == TSK_ExplicitInstantiationDefinition) {
// Try again at the end of the translation unit (at which point a
// definition will be required).
assert(!Recursive);
Function->setInstantiationIsPending(true);
PendingInstantiations.push_back(
std::make_pair(Function, PointOfInstantiation));
} else if (TSK == TSK_ImplicitInstantiation) { //< here
if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
Diag(PointOfInstantiation, diag::warn_func_template_missing)
<< Function;
Diag(PatternDecl->getLocation(), diag::note_forward_template_decl);
if (getLangOpts().CPlusPlus11)
Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
<< Function;
}
}
Shouldn't that check whether it's a deduction guide?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171025/d2d74d48/attachment.html>
More information about the cfe-commits
mailing list