Index: cfe/trunk/lib/Sema/SemaDecl.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp +++ cfe/trunk/lib/Sema/SemaDecl.cpp @@ -1522,7 +1522,7 @@ if (const VarDecl *VD = dyn_cast(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()) { @@ -1535,6 +1535,10 @@ 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()) { const TagDecl *Tag = TT->getDecl(); if (Tag->hasAttr()) Index: cfe/trunk/test/SemaCXX/warn-everthing.cpp =================================================================== --- cfe/trunk/test/SemaCXX/warn-everthing.cpp +++ cfe/trunk/test/SemaCXX/warn-everthing.cpp @@ -9,5 +9,5 @@ }; void testPR12271() { // expected-warning {{no previous prototype for function 'testPR12271'}} - PR12271 a[1][1]; // expected-warning {{unused variable 'a'}} + PR12271 a[1][1]; } Index: cfe/trunk/test/SemaCXX/warn-unused-variables.cpp =================================================================== --- cfe/trunk/test/SemaCXX/warn-unused-variables.cpp +++ cfe/trunk/test/SemaCXX/warn-unused-variables.cpp @@ -150,3 +150,54 @@ } #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 +void bar() { + Adder scaler = 123; // no warning + Adder array[N] = {1,2}; // no warning +} + +void test() { + foo(10); + bar<2>(); +} + +}