[clang] [clang] Restrict -Wnrvo to C++ code only. (PR #157059)

Javier Muñoz Kirschberg via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 8 14:50:56 PDT 2025


https://github.com/javiermunozkirschberg updated https://github.com/llvm/llvm-project/pull/157059

>From b81368b2a7dcc8e998e9ffae8109c622faee6bcc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Javier=20Mu=C3=B1oz=20Kirschberg?=
 <javier.munoz.kirschberg at ericsson.com>
Date: Fri, 5 Sep 2025 10:57:24 +0200
Subject: [PATCH 1/2] [clang] Restrict -Wnrvo to C++ code only.

Change-Id: Iaadd60f072c176972a5210c1fd1a6f0499d3ff39
---
 clang/docs/ReleaseNotes.rst            |  1 +
 clang/lib/Sema/SemaDecl.cpp            |  2 ++
 clang/test/SemaCXX/no-warn-nrvo-on-c.c | 41 ++++++++++++++++++++++++++
 3 files changed, 44 insertions(+)
 create mode 100644 clang/test/SemaCXX/no-warn-nrvo-on-c.c

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 780e8a31cae6d..1a4d1b9e26d4d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -223,6 +223,7 @@ Deprecated Compiler Flags
 Modified Compiler Flags
 -----------------------
 - The `-gkey-instructions` compiler flag is now enabled by default when DWARF is emitted for plain C/C++ and optimizations are enabled. (#GH149509)
+- The `-Wnrvo` compiler flag will not apply for C language.
 
 Removed Compiler Flags
 -------------------------
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 12bedae05f6f3..0c96e9dd16b07 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -16169,6 +16169,8 @@ void Sema::applyFunctionAttributesBeforeParsingBody(Decl *FD) {
 }
 
 void Sema::computeNRVO(Stmt *Body, FunctionScopeInfo *Scope) {
+  if (!getLangOpts().CPlusPlus)
+    return;
   ReturnStmt **Returns = Scope->Returns.data();
 
   for (unsigned I = 0, E = Scope->Returns.size(); I != E; ++I) {
diff --git a/clang/test/SemaCXX/no-warn-nrvo-on-c.c b/clang/test/SemaCXX/no-warn-nrvo-on-c.c
new file mode 100644
index 0000000000000..a8173e51faceb
--- /dev/null
+++ b/clang/test/SemaCXX/no-warn-nrvo-on-c.c
@@ -0,0 +1,41 @@
+// RUN: %clang -std=c23 -Wnrvo -Xclang -verify %s
+// expected-no-diagnostics
+
+#include <stdlib.h>
+
+#define SIZE 20
+
+typedef struct String_s {
+    char*  buf;
+    size_t len;
+} String;
+
+
+void clean(String* s) {
+    free(s->buf);
+}
+
+String randomString() {
+    String s = {};
+
+    s.buf = malloc(SIZE);
+    s.len = SIZE;
+
+    if (!s.buf) {
+        goto fail;
+    }
+
+    return s;
+
+fail:
+    clean(&s);
+    return (String){};
+}
+
+int main(int argc, char** argv)
+{
+    String s= randomString();
+    clean(&s);
+
+    return 0;
+}

>From 47565bea9591a5dd61a5c70463a7341a58c8310f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Javier=20Mu=C3=B1oz=20Kirschberg?=
 <javier.munoz.kirschberg at ericsson.com>
Date: Mon, 8 Sep 2025 23:30:59 +0200
Subject: [PATCH 2/2] Code review adjustments

Change-Id: Iae9d550fdb7adc0f7332c28dbb817f1a6d585d78
---
 clang/docs/ReleaseNotes.rst | 3 ++-
 clang/lib/Sema/SemaDecl.cpp | 8 ++++----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1a4d1b9e26d4d..cf7224ee6f46b 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -223,7 +223,6 @@ Deprecated Compiler Flags
 Modified Compiler Flags
 -----------------------
 - The `-gkey-instructions` compiler flag is now enabled by default when DWARF is emitted for plain C/C++ and optimizations are enabled. (#GH149509)
-- The `-Wnrvo` compiler flag will not apply for C language.
 
 Removed Compiler Flags
 -------------------------
@@ -280,6 +279,8 @@ Improvements to Clang's diagnostics
   ``ACQUIRED_AFTER(...)`` have been moved to the stable feature set and no
   longer require ``-Wthread-safety-beta`` to be used.
 
+- The `-Wnrvo` compiler flag is now ignored in C mode.
+
 Improvements to Clang's time-trace
 ----------------------------------
 
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 0c96e9dd16b07..f89a2c36484cb 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -16169,15 +16169,15 @@ void Sema::applyFunctionAttributesBeforeParsingBody(Decl *FD) {
 }
 
 void Sema::computeNRVO(Stmt *Body, FunctionScopeInfo *Scope) {
-  if (!getLangOpts().CPlusPlus)
-    return;
   ReturnStmt **Returns = Scope->Returns.data();
 
   for (unsigned I = 0, E = Scope->Returns.size(); I != E; ++I) {
     if (const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
       if (!NRVOCandidate->isNRVOVariable()) {
-        Diag(Returns[I]->getRetValue()->getExprLoc(),
-             diag::warn_not_eliding_copy_on_return);
+        if (getLangOpts().CPlusPlus) {
+          Diag(Returns[I]->getRetValue()->getExprLoc(),
+               diag::warn_not_eliding_copy_on_return);
+        }
         Returns[I]->setNRVOCandidate(nullptr);
       }
     }



More information about the cfe-commits mailing list