[clang] [clang] Disable missing definition warning on pure virtual functions (PR #74510)
Charalampos Mitrodimas via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 5 11:52:30 PST 2023
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 <charmitro at 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 <charmitro at 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);
+ }
+};
More information about the cfe-commits
mailing list