[clang] f0f395e - Revert "Reland "[Clang][SemaCXX] Add unused warning for variables declared in condition expressions""
Nick Desaulniers via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 31 11:58:47 PDT 2023
Author: Nick Desaulniers
Date: 2023-08-31T11:58:41-07:00
New Revision: f0f395e00e2ec3f1f20ca9021d1554fde73d56c9
URL: https://github.com/llvm/llvm-project/commit/f0f395e00e2ec3f1f20ca9021d1554fde73d56c9
DIFF: https://github.com/llvm/llvm-project/commit/f0f395e00e2ec3f1f20ca9021d1554fde73d56c9.diff
LOG: Revert "Reland "[Clang][SemaCXX] Add unused warning for variables declared in condition expressions""
This reverts commit 92023b15099012a657da07ebf49dd7d94a260f84.
Further issues were uncovered:
- False positive -Wunused-variable on function-static variables with the
used attribute. https://github.com/ClangBuiltLinux/linux/issues/1926
A test case needs to be added for this.
- Request for a new flag for these.
https://reviews.llvm.org/D152495#4628877
https://reviews.llvm.org/D152495#4628887
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaDecl.cpp
clang/lib/Sema/SemaExprCXX.cpp
clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
clang/test/SemaCXX/warn-unused-variables.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 138730336f7426..15d318ef75f05a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -162,9 +162,6 @@ Improvements to Clang's diagnostics
(`#64871: <https://github.com/llvm/llvm-project/issues/64871>`_).
Also clang no longer emits false positive warnings about the output length of
``%g`` format specifier.
-- Clang now warns on unused variables declared and initialized in condition
- expressions.
- (`#61681: <https://github.com/llvm/llvm-project/issues/61681>`_)
Bug Fixes in This Version
-------------------------
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 9facf2187f76a5..2ee216fffaa275 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1995,7 +1995,7 @@ static bool ShouldDiagnoseUnusedDecl(const LangOptions &LangOpts,
return false;
} else if (!D->getDeclName()) {
return false;
- } else if (D->isReferenced() || (!isa<VarDecl>(D) && D->isUsed())) {
+ } else if (D->isReferenced() || D->isUsed()) {
return false;
}
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index e3b3b7bdad4a89..472fbdbdb5d0e6 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -4021,10 +4021,6 @@ ExprResult Sema::CheckConditionVariable(VarDecl *ConditionVar,
ConditionVar, ConditionVar->getType().getNonReferenceType(), VK_LValue,
ConditionVar->getLocation());
- // Ensure that `-Wunused-variable` will be emitted for condition variables
- // that are not referenced later. e.g.: if (int var = init());
- ConditionVar->setReferenced(/*R=*/false);
-
switch (CK) {
case ConditionKind::Boolean:
return CheckBooleanCondition(StmtLoc, Condition.get());
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index bb8ea187ecf91c..63f022d5c2ff09 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -5353,7 +5353,7 @@ void Sema::BuildVariableInstantiation(
// will have been deferred.
if (!NewVar->isInvalidDecl() &&
NewVar->getDeclContext()->isFunctionOrMethod() &&
- OldVar->getType()->isDependentType() && !OldVar->isImplicit())
+ OldVar->getType()->isDependentType())
DiagnoseUnusedDecl(NewVar);
}
diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp
index db33086436d3af..4db8bdf12e5de0 100644
--- a/clang/test/SemaCXX/warn-unused-variables.cpp
+++ b/clang/test/SemaCXX/warn-unused-variables.cpp
@@ -1,5 +1,5 @@
// 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++14-extensions -Wno-c++17-extensions -verify -std=c++11 %s
+// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify -std=c++11 %s
template<typename T> void f() {
T t;
t = 17;
@@ -294,115 +294,3 @@ void RAIIWrapperTest() {
}
} // namespace gh54489
-
-namespace inside_condition {
- void ifs() {
- if (int hoge = 0) // expected-warning {{unused variable 'hoge'}}
- return;
- if (const int const_hoge = 0) // expected-warning {{unused variable 'const_hoge'}}
- return;
- else if (int fuga = 0)
- (void)fuga;
- else if (int used = 1; int catched = used) // expected-warning {{unused variable 'catched'}}
- return;
- else if (int refed = 1; int used = refed)
- (void)used;
- else if (int unused1 = 2; int unused2 = 3) // expected-warning {{unused variable 'unused1'}} \
- // expected-warning {{unused variable 'unused2'}}
- return;
- else if (int unused = 4; int used = 5) // expected-warning {{unused variable 'unused'}}
- (void)used;
- else if (int used = 6; int unused = 7) // expected-warning {{unused variable 'unused'}}
- (void)used;
- else if (int used1 = 8; int used2 = 9)
- (void)(used1 + used2);
- else if (auto [a, b] = (int[2]){ 1, 2 }; 1) // expected-warning {{unused variable '[a, b]'}}
- return;
- else if (auto [a, b] = (int[2]){ 1, 2 }; a)
- return;
- }
-
- void fors() {
- for (int i = 0;int unused = 0;); // expected-warning {{unused variable 'i'}} \
- // expected-warning {{unused variable 'unused'}}
- for (int i = 0;int used = 0;) // expected-warning {{unused variable 'i'}}
- (void)used;
- while(int var = 1) // expected-warning {{unused variable 'var'}}
- return;
- }
-
- void whiles() {
- while(int unused = 1) // expected-warning {{unused variable 'unused'}}
- return;
- while(int used = 1)
- (void)used;
- }
-
-
- void switches() {
- switch(int unused = 1) { // expected-warning {{unused variable 'unused'}}
- case 1: return;
- }
- switch(constexpr int used = 3; int unused = 4) { // expected-warning {{unused variable 'unused'}}
- case used: return;
- }
- switch(int used = 3; int unused = 4) { // expected-warning {{unused variable 'unused'}}
- case 3: (void)used;
- }
- switch(constexpr int used1 = 0; constexpr int used2 = 6) {
- case (used1+used2): return;
- }
- switch(auto [a, b] = (int[2]){ 1, 2 }; 1) { // expected-warning {{unused variable '[a, b]'}}
- case 1: return;
- }
- switch(auto [a, b] = (int[2]){ 1, 2 }; b) {
- case 1: return;
- }
- switch(auto [a, b] = (int[2]){ 1, 2 }; 1) {
- case 1: (void)a;
- }
- }
- template <typename T>
- struct Vector {
- void doIt() {
- for (auto& e : elements){} // expected-warning {{unused variable 'e'}}
- }
- T elements[10];
- };
- void ranged_for() {
- Vector<int> vector;
- vector.doIt(); // expected-note {{here}}
- }
-
-
- struct RAII {
- int &x;
- RAII(int &ref) : x(ref) {}
- ~RAII() { x = 0;}
- operator int() const { return 1; }
- };
- void aggregate() {
- int x = 10;
- int y = 10;
- if (RAII var = x) {}
- for(RAII var = x; RAII var2 = y;) {}
- while (RAII var = x) {}
- switch (RAII var = x) {}
- }
-
- struct TrivialDtor{
- int &x;
- TrivialDtor(int &ref) : x(ref) { ref = 32; }
- operator int() const { return 1; }
- };
- void trivial_dtor() {
- int x = 10;
- int y = 10;
- if (TrivialDtor var = x) {} // expected-warning {{unused variable 'var'}}
- for(TrivialDtor var = x; TrivialDtor var2 = y;) {} // expected-warning {{unused variable 'var'}} \
- // expected-warning {{unused variable 'var2'}}
- while (TrivialDtor var = x) {} // expected-warning {{unused variable 'var'}}
- switch (TrivialDtor var = x) {} // expected-warning {{unused variable 'var'}}
- }
-
-} // namespace inside_condition
More information about the cfe-commits
mailing list