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