[clang] [clang] Add new warning: not eliding copy on return (missed NRVO) (PR #139973)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 14 15:43:10 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Grigory Pastukhov (grigorypas)
<details>
<summary>Changes</summary>
This PR aims at adding warning similar to the one in GCC (-Wnrvo) that targets missed opportunities for Named Return Value Optimization (NRVO). The warning is not enabled by default.
cc: @<!-- -->WenleiHe
---
Full diff: https://github.com/llvm/llvm-project/pull/139973.diff
3 Files Affected:
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+4)
- (modified) clang/lib/Sema/SemaDecl.cpp (+4-1)
- (added) clang/test/SemaCXX/warn-nrvo.cpp (+16)
``````````diff
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 6e940a318b61d..f47d1447d5b60 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12417,6 +12417,10 @@ def warn_zero_as_null_pointer_constant : Warning<
"zero as null pointer constant">,
InGroup<DiagGroup<"zero-as-null-pointer-constant">>, DefaultIgnore;
+def warn_not_eliding_copy_on_return : Warning<
+ "not eliding copy on return">,
+ InGroup<DiagGroup<"nrvo">>, DefaultIgnore;
+
def err_nullability_cs_multilevel : Error<
"nullability keyword %0 cannot be applied to multi-level pointer type %1">;
def note_nullability_type_specifier : Note<
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index a7d59ec232b64..6dae243b520f0 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -16093,8 +16093,11 @@ void Sema::computeNRVO(Stmt *Body, FunctionScopeInfo *Scope) {
for (unsigned I = 0, E = Scope->Returns.size(); I != E; ++I) {
if (const VarDecl *NRVOCandidate = Returns[I]->getNRVOCandidate()) {
- if (!NRVOCandidate->isNRVOVariable())
+ if (!NRVOCandidate->isNRVOVariable()) {
+ Diag(Returns[I]->getRetValue()->getExprLoc(),
+ diag::warn_not_eliding_copy_on_return);
Returns[I]->setNRVOCandidate(nullptr);
+ }
}
}
}
diff --git a/clang/test/SemaCXX/warn-nrvo.cpp b/clang/test/SemaCXX/warn-nrvo.cpp
new file mode 100644
index 0000000000000..4552891fd4ab6
--- /dev/null
+++ b/clang/test/SemaCXX/warn-nrvo.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -fsyntax-only -Wnrvo -verify %s
+struct MyClass {
+ int value;
+ int c;
+ MyClass(int v) : value(v), c(0) {}
+ MyClass(const MyClass& other) : value(other.value) { c++; }
+};
+
+MyClass create_object(bool condition) {
+ MyClass obj1(1);
+ MyClass obj2(2);
+ if (condition) {
+ return obj1; // expected-warning{{not eliding copy on return}}
+ }
+ return obj2; // expected-warning{{not eliding copy on return}}
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/139973
More information about the cfe-commits
mailing list