[Sema] Don't warn about omitting unavailable enum constants in a switch

rdar://42717026

Differential revision: https://reviews.llvm.org/D51649

llvm-svn: 341490
This commit is contained in:
Erik Pilkington 2018-09-05 19:13:27 +00:00
parent 52a503d4f3
commit 3e4e3b17c1
2 changed files with 42 additions and 1 deletions

View File

@ -1164,7 +1164,21 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch,
SmallVector<DeclarationName,8> UnhandledNames;
for (EI = EnumVals.begin(); EI != EIEnd; EI++){
for (EI = EnumVals.begin(); EI != EIEnd; EI++) {
// Don't warn about omitted unavailable EnumConstantDecls.
switch (EI->second->getAvailability()) {
case AR_Deprecated:
// Omitting a deprecated constant is ok; it should never materialize.
case AR_Unavailable:
continue;
case AR_NotYetIntroduced:
// Partially available enum constants should be present. Note that we
// suppress -Wunguarded-availability diagnostics for such uses.
case AR_Available:
break;
}
// Drop unneeded case values
while (CI != CaseVals.end() && CI->first < EI->first)
CI++;

View File

@ -0,0 +1,27 @@
// RUN: %clang_cc1 -verify -Wswitch -triple x86_64-apple-macosx10.12 %s
enum SwitchOne {
Unavail __attribute__((availability(macos, unavailable))),
};
void testSwitchOne(enum SwitchOne so) {
switch (so) {} // no warning
}
enum SwitchTwo {
Ed __attribute__((availability(macos, deprecated=10.12))),
Vim __attribute__((availability(macos, deprecated=10.13))),
Emacs,
};
void testSwitchTwo(enum SwitchTwo st) {
switch (st) {} // expected-warning{{enumeration values 'Vim' and 'Emacs' not handled in switch}}
}
enum SwitchThree {
New __attribute__((availability(macos, introduced=1000))),
};
void testSwitchThree(enum SwitchThree st) {
switch (st) {} // expected-warning{{enumeration value 'New' not handled in switch}}
}