diff options
author | David Blaikie <dblaikie@gmail.com> | 2019-05-02 16:30:49 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2019-05-02 16:30:49 +0000 |
commit | 39c763f34df97613dbe191833e704122831d7d30 (patch) | |
tree | 9e81ec6ef5d961ef090768694b335d817e546e8f | |
parent | 15e8bd3ce55bc36e6e359d069e472464c798d55f (diff) |
Do not warn on switches over enums that do not use [[maybe_unused]] enumerators
PR36231, [dcl.attr.unused]p3
Reviewers: aaron.ballman
Differential Revision: https://reviews.llvm.org/D61444
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359800 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 3 | ||||
-rw-r--r-- | test/CXX/dcl.dcl/dcl.attr/dcl.attr.unused/p3.cpp | 18 |
2 files changed, 19 insertions, 2 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 9055eb7d71..feb0052d42 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1162,6 +1162,9 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, break; } + if (EI->second->hasAttr<UnusedAttr>()) + continue; + // Drop unneeded case values while (CI != CaseVals.end() && CI->first < EI->first) CI++; diff --git a/test/CXX/dcl.dcl/dcl.attr/dcl.attr.unused/p3.cpp b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.unused/p3.cpp index 551df38a81..5f715a1ec2 100644 --- a/test/CXX/dcl.dcl/dcl.attr/dcl.attr.unused/p3.cpp +++ b/test/CXX/dcl.dcl/dcl.attr/dcl.attr.unused/p3.cpp @@ -5,9 +5,17 @@ static_assert(__has_cpp_attribute(maybe_unused) == 201603, ""); struct [[maybe_unused]] S {}; +enum E1 { + EnumVal [[maybe_unused]], + UsedEnumVal, +}; + void f() { int x; // expected-warning {{unused variable}} typedef int I; // expected-warning {{unused typedef 'I'}} + E1 e; + switch (e) { // expected-warning {{enumeration value 'UsedEnumVal' not handled in switch}} + } // Should not warn about these due to not being used. [[maybe_unused]] int y; @@ -17,10 +25,16 @@ void f() { S s; maybe_unused_int test; y = 12; + switch (e) { + case UsedEnumVal: + break; + } } #ifdef EXT // expected-warning@6 {{use of the 'maybe_unused' attribute is a C++17 extension}} -// expected-warning@13 {{use of the 'maybe_unused' attribute is a C++17 extension}} -// expected-warning@14 {{use of the 'maybe_unused' attribute is a C++17 extension}} +// expected-warning@9 {{use of the 'maybe_unused' attribute is a C++17 extension}} +// expected-warning@9 {{attributes on an enumerator declaration are a C++17 extension}} +// expected-warning@21 {{use of the 'maybe_unused' attribute is a C++17 extension}} +// expected-warning@22 {{use of the 'maybe_unused' attribute is a C++17 extension}} #endif |