summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp6
-rw-r--r--clang/test/SemaCXX/warn-everthing.cpp2
-rw-r--r--clang/test/SemaCXX/warn-unused-variables.cpp51
3 files changed, 57 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index c8973ae100e..a94ed532944 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1522,7 +1522,7 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
// White-list anything with an __attribute__((unused)) type.
- QualType Ty = VD->getType();
+ const auto *Ty = VD->getType().getTypePtr();
// Only look at the outermost level of typedef.
if (const TypedefType *TT = Ty->getAs<TypedefType>()) {
@@ -1535,6 +1535,10 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
if (Ty->isIncompleteType() || Ty->isDependentType())
return false;
+ // Look at the element type to ensure that the warning behaviour is
+ // consistent for both scalars and arrays.
+ Ty = Ty->getBaseElementTypeUnsafe();
+
if (const TagType *TT = Ty->getAs<TagType>()) {
const TagDecl *Tag = TT->getDecl();
if (Tag->hasAttr<UnusedAttr>())
diff --git a/clang/test/SemaCXX/warn-everthing.cpp b/clang/test/SemaCXX/warn-everthing.cpp
index ad3dd8a24d8..ff66c78cdf9 100644
--- a/clang/test/SemaCXX/warn-everthing.cpp
+++ b/clang/test/SemaCXX/warn-everthing.cpp
@@ -9,5 +9,5 @@ public:
};
void testPR12271() { // expected-warning {{no previous prototype for function 'testPR12271'}}
- PR12271 a[1][1]; // expected-warning {{unused variable 'a'}}
+ PR12271 a[1][1];
}
diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp
index 8dcbe7271d6..e40cf1a2c9c 100644
--- a/clang/test/SemaCXX/warn-unused-variables.cpp
+++ b/clang/test/SemaCXX/warn-unused-variables.cpp
@@ -150,3 +150,54 @@ namespace ctor_with_cleanups {
}
#include "Inputs/warn-unused-variables.h"
+
+namespace arrayRecords {
+
+int total = 0;
+
+class Adder {
+public:
+ Adder(int x); // out of line below
+ ~Adder() {}
+};
+
+Adder::Adder(int x) {
+ total += x;
+}
+
+struct Foo {
+ int x;
+ Foo(int x) : x(x) {}
+};
+
+struct S1 {
+ S1();
+};
+
+void foo(int size) {
+ S1 y; // no warning
+ S1 yarray[2]; // no warning
+ S1 dynArray[size]; // no warning
+ S1 nestedArray[1][2][3]; // no warning
+
+ Adder scalerInFuncScope = 134; // no warning
+ Adder arrayInFuncScope[] = { 135, 136 }; // no warning
+ Adder nestedArrayInFuncScope[2][2] = { {1,2}, {3,4} }; // no warning
+
+ Foo fooScalar = 1; // expected-warning {{unused variable 'fooScalar'}}
+ Foo fooArray[] = {1,2}; // expected-warning {{unused variable 'fooArray'}}
+ Foo fooNested[2][2] = { {1,2}, {3,4} }; // expected-warning {{unused variable 'fooNested'}}
+}
+
+template<int N>
+void bar() {
+ Adder scaler = 123; // no warning
+ Adder array[N] = {1,2}; // no warning
+}
+
+void test() {
+ foo(10);
+ bar<2>();
+}
+
+}
OpenPOWER on IntegriCloud