https://github.com/vinayakdsci updated https://github.com/llvm/llvm-project/pull/81127
>From f2f9ba7a5399f259f4970f78803a02dc5689daff Mon Sep 17 00:00:00 2001 From: Vinayak Dev <vinayakdev....@gmail.com> Date: Thu, 8 Feb 2024 17:29:44 +0530 Subject: [PATCH] [Clang][Sema]: Allow copy constructor side effects --- clang/docs/ReleaseNotes.rst | 4 +++ clang/lib/Sema/SemaDecl.cpp | 3 +- clang/test/SemaCXX/warn-unused-variables.cpp | 33 ++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index df3ad20f955eab..5f9f915c97d78e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -173,6 +173,10 @@ Bug Fixes in This Version for logical operators in C23. Fixes (`#64356 <https://github.com/llvm/llvm-project/issues/64356>`_). +- Clang now doesn't produce false-positive warning `-Wunused-variable` + for variables created through copy initialization having side-effects. + Fixes (`#79518 <https://github.com/llvm/llvm-project/issues/79518>`_). + Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 2c526cd0d0e675..898d07e1c32ded 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2044,7 +2044,8 @@ static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts, return false; if (Init) { - const auto *Construct = dyn_cast<CXXConstructExpr>(Init); + const auto *Construct = + dyn_cast<CXXConstructExpr>(Init->IgnoreImpCasts()); if (Construct && !Construct->isElidable()) { const CXXConstructorDecl *CD = Construct->getConstructor(); if (!CD->isTrivial() && !RD->hasAttr<WarnUnusedAttr>() && diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp index b649c7d8089355..c86fb12d0d6298 100644 --- a/clang/test/SemaCXX/warn-unused-variables.cpp +++ b/clang/test/SemaCXX/warn-unused-variables.cpp @@ -1,5 +1,7 @@ // RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify %s // RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify -std=gnu++11 %s +// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify -std=gnu++14 %s +// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify -std=gnu++17 %s template<typename T> void f() { T t; t = 17; @@ -183,7 +185,12 @@ void foo(int size) { NonTriviallyDestructible array[2]; // no warning NonTriviallyDestructible nestedArray[2][2]; // no warning + // Copy initialzation gives warning before C++17 +#if __cplusplus <= 201402L Foo fooScalar = 1; // expected-warning {{unused variable 'fooScalar'}} +#else + Foo fooScalar = 1; // no warning +#endif Foo fooArray[] = {1,2}; // expected-warning {{unused variable 'fooArray'}} Foo fooNested[2][2] = { {1,2}, {3,4} }; // expected-warning {{unused variable 'fooNested'}} } @@ -297,3 +304,29 @@ void RAIIWrapperTest() { } } // namespace gh54489 + +// Ensure that -Wunused-variable does not emit warning +// on copy constructors with side effects (C++17 and later) +#if __cplusplus >= 201703L +namespace gh79518 { + +struct S { + S(int); +}; + +// With an initializer list +struct A { + int x; + A(int x) : x(x) {} +}; + +void foo() { + S s(0); // no warning + S s2 = 0; // no warning + S s3{0}; // no warning + + A a = 1; // no warning +} + +} // namespace gh79518 +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits