https://github.com/PlutoDog95 updated 
https://github.com/llvm/llvm-project/pull/196593

>From d015c1db7fd4716aea18204a7acad502c817f6f4 Mon Sep 17 00:00:00 2001
From: Vineet Agarwal <[email protected]>
Date: Fri, 8 May 2026 22:56:40 +0530
Subject: [PATCH] [clang] Suppress -Wunneeded-internal-declaration for
 referenced constexpr functions

Referenced constexpr functions used during constant evaluation may not
be odr-used and therefore do not require emission, but they are still
semantically necessary.

Suppress -Wunneeded-internal-declaration for referenced constexpr
functions, analogous to the existing handling for variables usable in
constant expressions.

Add a regression test for constexpr function usage in a dependent return
type.
---
 clang/docs/ReleaseNotes.rst                   |  4 ++++
 clang/lib/Sema/Sema.cpp                       |  5 ++++
 .../warn-unused-constexpr-function.cpp        | 24 +++++++++++++++++++
 3 files changed, 33 insertions(+)
 create mode 100644 clang/test/SemaCXX/warn-unused-constexpr-function.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index fa19d4b576575..ec9582de92bf0 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -455,6 +455,10 @@ Improvements to Clang's diagnostics
 - Clang now emits ``-Wsizeof-pointer-memaccess`` when snprintf/vsnprintf use 
the sizeof
   the destination buffer(dynamically allocated) in the len parameter(#GH162366)
 
+- Fixed a false positive ``-Wunneeded-internal-declaration`` warning for
+  referenced ``constexpr`` functions used during constant evaluation.
+  (#GH196564)
+
 - Added ``-Wmodule-map-path-outside-directory`` (off by default) to warn on
   header and umbrella directory paths that use ``..`` to refer outside the 
module
   directory in module maps found via implicit search
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 8a68f2f19bf3d..9c8a84668454a 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -891,6 +891,11 @@ static bool ShouldRemoveFromUnused(Sema *SemaRef, const 
DeclaratorDecl *D) {
     return true;
 
   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
+    // If a constexpr function is referenced for constant evaluation,
+    // don't warn even if it is not odr-used.
+    if (FD->isReferenced() && FD->isConstexpr())
+      return true;
+
     // If this is a function template and none of its specializations is used,
     // we should warn.
     if (FunctionTemplateDecl *Template = FD->getDescribedFunctionTemplate())
diff --git a/clang/test/SemaCXX/warn-unused-constexpr-function.cpp 
b/clang/test/SemaCXX/warn-unused-constexpr-function.cpp
new file mode 100644
index 0000000000000..329cfe954c1a6
--- /dev/null
+++ b/clang/test/SemaCXX/warn-unused-constexpr-function.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -std=c++14 -Wunused-function -fsyntax-only %s
+
+static constexpr bool returnInt(int) { return true; }
+
+template <bool B>
+struct select;
+
+template <>
+struct select<true> {
+  using type = int;
+};
+
+template <>
+struct select<false> {
+  using type = float;
+};
+
+template <typename T>
+typename select<returnInt(T{})>::type make() {
+  return T{};
+}
+
+int makeInt() { return make<int>(); }
+float makeFloat() { return make<float>(); }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to