1//===--- SwitchMissingDefaultCaseCheck.cpp - clang-tidy -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "SwitchMissingDefaultCaseCheck.h"
10#include "clang/AST/ASTContext.h"
11
12using namespace clang::ast_matchers;
13
14namespace clang::tidy::bugprone {
15
16namespace {
17
18AST_MATCHER(SwitchStmt, hasDefaultCase) {
19 const SwitchCase *Case = Node.getSwitchCaseList();
20 while (Case) {
21 if (DefaultStmt::classof(T: Case))
22 return true;
23
24 Case = Case->getNextSwitchCase();
25 }
26 return false;
27}
28} // namespace
29
30void SwitchMissingDefaultCaseCheck::registerMatchers(MatchFinder *Finder) {
31 Finder->addMatcher(
32 NodeMatch: switchStmt(hasCondition(InnerMatcher: expr(unless(isInstantiationDependent()),
33 hasType(InnerMatcher: qualType(hasCanonicalType(
34 InnerMatcher: unless(hasDeclaration(InnerMatcher: enumDecl()))))))),
35 unless(hasDefaultCase()))
36 .bind(ID: "switch"),
37 Action: this);
38}
39
40void SwitchMissingDefaultCaseCheck::check(
41 const ast_matchers::MatchFinder::MatchResult &Result) {
42 const auto *Switch = Result.Nodes.getNodeAs<SwitchStmt>(ID: "switch");
43
44 diag(Loc: Switch->getSwitchLoc(), Description: "switching on non-enum value without "
45 "default case may not cover all cases");
46}
47} // namespace clang::tidy::bugprone
48

source code of clang-tools-extra/clang-tidy/bugprone/SwitchMissingDefaultCaseCheck.cpp