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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to