https://github.com/charmitro updated https://github.com/llvm/llvm-project/pull/74510
>From 0be0d65a74cf7a6a06150362b68adff122a3a39b Mon Sep 17 00:00:00 2001 From: Charalampos Mitrodimas <charmi...@posteo.net> Date: Tue, 5 Dec 2023 11:46:56 +0200 Subject: [PATCH] [clang] Disable missing definition warning on pure virtual functions Warning '-Wundefined-func-template' incorrectly indicates that no definition is available for a pure virtual function. However, a definition is not needed for a pure virtual function. Fixes #74016 Signed-off-by: Charalampos Mitrodimas <charmi...@posteo.net> --- .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 3 ++- .../instantiate-pure-virtual-function.cpp | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index d768bb72e07c0..e6704c6f80808 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4952,7 +4952,8 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, std::make_pair(Function, PointOfInstantiation)); } else if (TSK == TSK_ImplicitInstantiation) { if (AtEndOfTU && !getDiagnostics().hasErrorOccurred() && - !getSourceManager().isInSystemHeader(PatternDecl->getBeginLoc())) { + !getSourceManager().isInSystemHeader(PatternDecl->getBeginLoc()) && + !Function->isVirtualAsWritten() && !Function->isPure()) { Diag(PointOfInstantiation, diag::warn_func_template_missing) << Function; Diag(PatternDecl->getLocation(), diag::note_forward_template_decl); diff --git a/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp b/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp new file mode 100644 index 0000000000000..46aaf70c7efa4 --- /dev/null +++ b/clang/test/SemaTemplate/instantiate-pure-virtual-function.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wundefined-func-template %s +// expected-no-diagnostics + +namespace GH74016 { + template <typename T> class B { + public: + constexpr void foo(const T &) { bar(1); } + virtual constexpr void bar(unsigned int) = 0; + }; + + template <typename T> class D : public B<T> { + public: + constexpr void bar(unsigned int) override {} + }; + + void test() { + auto t = D<int>(); + t.foo(0); + } +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits