diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 780e8a31cae6d..cf7224ee6f46b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -279,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 12bedae05f6f3..f89a2c36484cb 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -16174,8 +16174,10 @@ 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()) { - 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); } } 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 + +#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; +}