//===- ReachableCode.h -----------------------------------------*- C++ --*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
// A flow-sensitive, path-insensitive analysis of unreachable code.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_REACHABLECODE_H
 
#define LLVM_CLANG_ANALYSIS_ANALYSES_REACHABLECODE_H
 
 
 
#include "clang/Basic/SourceLocation.h"
 
 
 
//===----------------------------------------------------------------------===//
 
// Forward declarations.
 
//===----------------------------------------------------------------------===//
 
 
 
namespace llvm {
 
  class BitVector;
 
}
 
 
 
namespace clang {
 
  class AnalysisDeclContext;
 
  class CFGBlock;
 
  class Preprocessor;
 
}
 
 
 
//===----------------------------------------------------------------------===//
 
// API.
 
//===----------------------------------------------------------------------===//
 
 
 
namespace clang {
 
namespace reachable_code {
 
 
 
/// Classifications of unreachable code.
 
enum UnreachableKind {
 
  UK_Return,
 
  UK_Break,
 
  UK_Loop_Increment,
 
  UK_Other
 
};
 
 
 
class Callback {
 
  virtual void anchor();
 
public:
 
  virtual ~Callback() {}
 
  virtual void HandleUnreachable(UnreachableKind UK,
 
                                 SourceLocation L,
 
                                 SourceRange ConditionVal,
 
                                 SourceRange R1,
 
                                 SourceRange R2) = 0;
 
};
 
 
 
/// ScanReachableFromBlock - Mark all blocks reachable from Start.
 
/// Returns the total number of blocks that were marked reachable.
 
unsigned ScanReachableFromBlock(const CFGBlock *Start,
 
                                llvm::BitVector &Reachable);
 
 
 
void FindUnreachableCode(AnalysisDeclContext &AC, Preprocessor &PP,
 
                         Callback &CB);
 
 
 
}} // end namespace clang::reachable_code
 
 
 
#endif