[clang] 7a0900f - [-Wunsafe-buffer-usage] Remove an unnecessary const-qualifier

Ziqing Luo via cfe-commits cfe-commits at lists.llvm.org
Mon May 15 11:21:07 PDT 2023


Hi,

It is, but sorry I didn't realize that I have a pre-commit hook that
clang-formats my patch.  This is why there are so many differences.
I will revert and re-commit this change.

-ziqing



On Mon, May 15, 2023 at 11:11 AM David Blaikie <dblaikie at gmail.com> wrote:

> Is this patch the right one for the commit message? This doesn't look like
> "removing an unnecessary const qualifier"
>
> On Fri, May 12, 2023 at 2:47 PM via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>>
>> Author: ziqingluo-90
>> Date: 2023-05-12T14:46:56-07:00
>> New Revision: 7a0900fd3e2d34bc1d513a97cf8fbdc1754252d7
>>
>> URL:
>> https://github.com/llvm/llvm-project/commit/7a0900fd3e2d34bc1d513a97cf8fbdc1754252d7
>> DIFF:
>> https://github.com/llvm/llvm-project/commit/7a0900fd3e2d34bc1d513a97cf8fbdc1754252d7.diff
>>
>> LOG: [-Wunsafe-buffer-usage] Remove an unnecessary const-qualifier
>>
>> A follow-up change for 6d861d498de1320d22771c329ec69f9419ef06b7:
>> remove an unnecessary const-qualifier so that the code doesn't have to
>> remove the qualifier explicitly using `std::remove_const_t`, which
>> triggers a warning at some bots (e.g.,
>> https://lab.llvm.org/buildbot/#/builders/247/builds/4442).
>>
>> Added:
>>
>>
>> Modified:
>>     clang/include/clang/Sema/AnalysisBasedWarnings.h
>>     clang/lib/Sema/AnalysisBasedWarnings.cpp
>>
>> Removed:
>>
>>
>>
>>
>> ################################################################################
>> diff  --git a/clang/include/clang/Sema/AnalysisBasedWarnings.h
>> b/clang/include/clang/Sema/AnalysisBasedWarnings.h
>> index c73506894db9d..7d0fa9541c352 100644
>> --- a/clang/include/clang/Sema/AnalysisBasedWarnings.h
>> +++ b/clang/include/clang/Sema/AnalysisBasedWarnings.h
>> @@ -24,7 +24,7 @@ class FunctionDecl;
>>  class QualType;
>>  class Sema;
>>  namespace sema {
>> -  class FunctionScopeInfo;
>> +class FunctionScopeInfo;
>>  }
>>
>>  namespace sema {
>> @@ -38,6 +38,7 @@ class AnalysisBasedWarnings {
>>      unsigned enableCheckUnreachable : 1;
>>      unsigned enableThreadSafetyAnalysis : 1;
>>      unsigned enableConsumedAnalysis : 1;
>> +
>>    public:
>>      Policy();
>>      void disableCheckFallThrough() { enableCheckFallThrough = 0; }
>> @@ -51,7 +52,7 @@ class AnalysisBasedWarnings {
>>    std::unique_ptr<InterProceduralData> IPData;
>>
>>    enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
>> -  llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
>> +  llvm::DenseMap<const FunctionDecl *, VisitFlag> VisitedFD;
>>
>>    /// \name Statistics
>>    /// @{
>> @@ -93,11 +94,11 @@ class AnalysisBasedWarnings {
>>    AnalysisBasedWarnings(Sema &s);
>>    ~AnalysisBasedWarnings();
>>
>> -  void IssueWarnings(Policy P, FunctionScopeInfo *fscope,
>> -                     const Decl *D, QualType BlockType);
>> +  void IssueWarnings(Policy P, FunctionScopeInfo *fscope, const Decl *D,
>> +                     QualType BlockType);
>>
>>    // Issue warnings that require whole-translation-unit analysis.
>> -  void IssueWarnings(const TranslationUnitDecl *D);
>> +  void IssueWarnings(TranslationUnitDecl *D);
>>
>>    Policy getDefaultPolicy() { return DefaultPolicy; }
>>
>>
>> diff  --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp
>> b/clang/lib/Sema/AnalysisBasedWarnings.cpp
>> index 4d96f3b9ab32b..c2b6d362d966d 100644
>> --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
>> +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
>> @@ -1,4 +1,5 @@
>> -//=- AnalysisBasedWarnings.cpp - Sema warnings based on libAnalysis -*-
>> C++ -*-=//
>> +//=- AnalysisBasedWarnings.cpp - Sema warnings based on libAnalysis -*-
>> C++
>> +//-*-=//
>>  //
>>  // Part of the LLVM Project, under the Apache License v2.0 with LLVM
>> Exceptions.
>>  // See https://llvm.org/LICENSE.txt for license information.
>> @@ -26,7 +27,6 @@
>>  #include "clang/AST/StmtCXX.h"
>>  #include "clang/AST/StmtObjC.h"
>>  #include "clang/AST/StmtVisitor.h"
>> -#include "clang/AST/RecursiveASTVisitor.h"
>>  #include "clang/AST/Type.h"
>>  #include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h"
>>  #include "clang/Analysis/Analyses/CalledOnceCheck.h"
>> @@ -64,61 +64,60 @@ using namespace clang;
>>
>>  //===----------------------------------------------------------------------===//
>>
>>  namespace {
>> -  class UnreachableCodeHandler : public reachable_code::Callback {
>> -    Sema &S;
>> -    SourceRange PreviousSilenceableCondVal;
>> -
>> -  public:
>> -    UnreachableCodeHandler(Sema &s) : S(s) {}
>> -
>> -    void HandleUnreachable(reachable_code::UnreachableKind UK,
>> SourceLocation L,
>> -                           SourceRange SilenceableCondVal, SourceRange
>> R1,
>> -                           SourceRange R2, bool HasFallThroughAttr)
>> override {
>> -      // If the diagnosed code is `[[fallthrough]];` and
>> -      // `-Wunreachable-code-fallthrough` is  enabled, suppress `code
>> will never
>> -      // be executed` warning to avoid generating diagnostic twice
>> -      if (HasFallThroughAttr &&
>> -
>> !S.getDiagnostics().isIgnored(diag::warn_unreachable_fallthrough_attr,
>> -                                        SourceLocation()))
>> -        return;
>> -
>> -      // Avoid reporting multiple unreachable code diagnostics that are
>> -      // triggered by the same conditional value.
>> -      if (PreviousSilenceableCondVal.isValid() &&
>> -          SilenceableCondVal.isValid() &&
>> -          PreviousSilenceableCondVal == SilenceableCondVal)
>> -        return;
>> -      PreviousSilenceableCondVal = SilenceableCondVal;
>> -
>> -      unsigned diag = diag::warn_unreachable;
>> -      switch (UK) {
>> -        case reachable_code::UK_Break:
>> -          diag = diag::warn_unreachable_break;
>> -          break;
>> -        case reachable_code::UK_Return:
>> -          diag = diag::warn_unreachable_return;
>> -          break;
>> -        case reachable_code::UK_Loop_Increment:
>> -          diag = diag::warn_unreachable_loop_increment;
>> -          break;
>> -        case reachable_code::UK_Other:
>> -          break;
>> -      }
>> +class UnreachableCodeHandler : public reachable_code::Callback {
>> +  Sema &S;
>> +  SourceRange PreviousSilenceableCondVal;
>> +
>> +public:
>> +  UnreachableCodeHandler(Sema &s) : S(s) {}
>> +
>> +  void HandleUnreachable(reachable_code::UnreachableKind UK,
>> SourceLocation L,
>> +                         SourceRange SilenceableCondVal, SourceRange R1,
>> +                         SourceRange R2, bool HasFallThroughAttr)
>> override {
>> +    // If the diagnosed code is `[[fallthrough]];` and
>> +    // `-Wunreachable-code-fallthrough` is  enabled, suppress `code will
>> never
>> +    // be executed` warning to avoid generating diagnostic twice
>> +    if (HasFallThroughAttr &&
>> +
>> !S.getDiagnostics().isIgnored(diag::warn_unreachable_fallthrough_attr,
>> +                                      SourceLocation()))
>> +      return;
>> +
>> +    // Avoid reporting multiple unreachable code diagnostics that are
>> +    // triggered by the same conditional value.
>> +    if (PreviousSilenceableCondVal.isValid() &&
>> SilenceableCondVal.isValid() &&
>> +        PreviousSilenceableCondVal == SilenceableCondVal)
>> +      return;
>> +    PreviousSilenceableCondVal = SilenceableCondVal;
>> +
>> +    unsigned diag = diag::warn_unreachable;
>> +    switch (UK) {
>> +    case reachable_code::UK_Break:
>> +      diag = diag::warn_unreachable_break;
>> +      break;
>> +    case reachable_code::UK_Return:
>> +      diag = diag::warn_unreachable_return;
>> +      break;
>> +    case reachable_code::UK_Loop_Increment:
>> +      diag = diag::warn_unreachable_loop_increment;
>> +      break;
>> +    case reachable_code::UK_Other:
>> +      break;
>> +    }
>>
>> -      S.Diag(L, diag) << R1 << R2;
>> +    S.Diag(L, diag) << R1 << R2;
>>
>> -      SourceLocation Open = SilenceableCondVal.getBegin();
>> -      if (Open.isValid()) {
>> -        SourceLocation Close = SilenceableCondVal.getEnd();
>> -        Close = S.getLocForEndOfToken(Close);
>> -        if (Close.isValid()) {
>> -          S.Diag(Open, diag::note_unreachable_silence)
>> +    SourceLocation Open = SilenceableCondVal.getBegin();
>> +    if (Open.isValid()) {
>> +      SourceLocation Close = SilenceableCondVal.getEnd();
>> +      Close = S.getLocForEndOfToken(Close);
>> +      if (Close.isValid()) {
>> +        S.Diag(Open, diag::note_unreachable_silence)
>>              << FixItHint::CreateInsertion(Open, "/* DISABLES CODE */ (")
>>              << FixItHint::CreateInsertion(Close, ")");
>> -        }
>>        }
>>      }
>> -  };
>> +  }
>> +};
>>  } // anonymous namespace
>>
>>  /// CheckUnreachable - Check for unreachable code.
>> @@ -278,7 +277,8 @@ static void checkRecursiveFunction(Sema &S, const
>> FunctionDecl *FD,
>>      return;
>>
>>    CFG *cfg = AC.getCFG();
>> -  if (!cfg) return;
>> +  if (!cfg)
>> +    return;
>>
>>    // If the exit block is unreachable, skip processing the function.
>>    if (cfg->getExit().pred_empty())
>> @@ -314,10 +314,9 @@ static bool throwEscapes(Sema &S, const CXXThrowExpr
>> *E, CFGBlock &ThrowBlock,
>>        if (Succ->getBlockID() == Body->getExit().getBlockID())
>>          return true;
>>
>> -      if (auto *Catch =
>> -              dyn_cast_or_null<CXXCatchStmt>(Succ->getLabel())) {
>> +      if (auto *Catch =
>> dyn_cast_or_null<CXXCatchStmt>(Succ->getLabel())) {
>>          QualType Caught = Catch->getCaughtType();
>> -        if (Caught.isNull() || // catch (...) catches everything
>> +        if (Caught.isNull() ||  // catch (...) catches everything
>>              !E->getSubExpr() || // throw; is considered cuaght by any
>> handler
>>              S.handlerCanCatch(Caught, E->getSubExpr()->getType()))
>>            // Exception doesn't escape via this path.
>> @@ -336,7 +335,8 @@ static void visitReachableThrows(
>>      CFG *BodyCFG,
>>      llvm::function_ref<void(const CXXThrowExpr *, CFGBlock &)> Visit) {
>>    llvm::BitVector Reachable(BodyCFG->getNumBlockIDs());
>> -  clang::reachable_code::ScanReachableFromBlock(&BodyCFG->getEntry(),
>> Reachable);
>> +  clang::reachable_code::ScanReachableFromBlock(&BodyCFG->getEntry(),
>> +                                                Reachable);
>>    for (CFGBlock *B : *BodyCFG) {
>>      if (!Reachable[B->getBlockID()])
>>        continue;
>> @@ -359,8 +359,8 @@ static void EmitDiagForCXXThrowInNonThrowingFunc(Sema
>> &S, SourceLocation OpLoc,
>>          (isa<CXXDestructorDecl>(FD) ||
>>           FD->getDeclName().getCXXOverloadedOperator() == OO_Delete ||
>>           FD->getDeclName().getCXXOverloadedOperator() ==
>> OO_Array_Delete)) {
>> -      if (const auto *Ty = FD->getTypeSourceInfo()->getType()->
>> -                                         getAs<FunctionProtoType>())
>> +      if (const auto *Ty =
>> +
>> FD->getTypeSourceInfo()->getType()->getAs<FunctionProtoType>())
>>          S.Diag(FD->getLocation(), diag::note_throw_in_dtor)
>>              << !isa<CXXDestructorDecl>(FD) << !Ty->hasExceptionSpec()
>>              << FD->getExceptionSpecSourceRange();
>> @@ -377,10 +377,11 @@ static void checkThrowInNonThrowingFunc(Sema &S,
>> const FunctionDecl *FD,
>>      return;
>>    if (BodyCFG->getExit().pred_empty())
>>      return;
>> -  visitReachableThrows(BodyCFG, [&](const CXXThrowExpr *Throw, CFGBlock
>> &Block) {
>> -    if (throwEscapes(S, Throw, Block, BodyCFG))
>> -      EmitDiagForCXXThrowInNonThrowingFunc(S, Throw->getThrowLoc(), FD);
>> -  });
>> +  visitReachableThrows(
>> +      BodyCFG, [&](const CXXThrowExpr *Throw, CFGBlock &Block) {
>> +        if (throwEscapes(S, Throw, Block, BodyCFG))
>> +          EmitDiagForCXXThrowInNonThrowingFunc(S, Throw->getThrowLoc(),
>> FD);
>> +      });
>>  }
>>
>>  static bool isNoexcept(const FunctionDecl *FD) {
>> @@ -413,13 +414,14 @@ enum ControlFlowKind {
>>  /// will return.
>>  static ControlFlowKind CheckFallThrough(AnalysisDeclContext &AC) {
>>    CFG *cfg = AC.getCFG();
>> -  if (!cfg) return UnknownFallThrough;
>> +  if (!cfg)
>> +    return UnknownFallThrough;
>>
>>    // The CFG leaves in dead things, and we don't want the dead code
>> paths to
>>    // confuse us, so we mark all live things first.
>>    llvm::BitVector live(cfg->getNumBlockIDs());
>> -  unsigned count =
>> reachable_code::ScanReachableFromBlock(&cfg->getEntry(),
>> -                                                          live);
>> +  unsigned count =
>> +      reachable_code::ScanReachableFromBlock(&cfg->getEntry(), live);
>>
>>    bool AddEHEdges = AC.getAddEHEdges();
>>    if (!AddEHEdges && count != cfg->getNumBlockIDs())
>> @@ -472,7 +474,7 @@ static ControlFlowKind
>> CheckFallThrough(AnalysisDeclContext &AC) {
>>      // statement (if it exists).
>>      CFGBlock::const_reverse_iterator ri = B.rbegin(), re = B.rend();
>>
>> -    for ( ; ri != re ; ++ri)
>> +    for (; ri != re; ++ri)
>>        if (ri->getAs<CFGStmt>())
>>          break;
>>
>> @@ -546,14 +548,12 @@ struct CheckFallThroughDiagnostics {
>>    static CheckFallThroughDiagnostics MakeForFunction(const Decl *Func) {
>>      CheckFallThroughDiagnostics D;
>>      D.FuncLoc = Func->getLocation();
>> -    D.diag_MaybeFallThrough_HasNoReturn =
>> -      diag::warn_falloff_noreturn_function;
>> +    D.diag_MaybeFallThrough_HasNoReturn =
>> diag::warn_falloff_noreturn_function;
>>      D.diag_MaybeFallThrough_ReturnsNonVoid =
>> -      diag::warn_maybe_falloff_nonvoid_function;
>> -    D.diag_AlwaysFallThrough_HasNoReturn =
>> -      diag::warn_falloff_noreturn_function;
>> +        diag::warn_maybe_falloff_nonvoid_function;
>> +    D.diag_AlwaysFallThrough_HasNoReturn =
>> diag::warn_falloff_noreturn_function;
>>      D.diag_AlwaysFallThrough_ReturnsNonVoid =
>> -      diag::warn_falloff_nonvoid_function;
>> +        diag::warn_falloff_nonvoid_function;
>>
>>      // Don't suggest that virtual functions be marked "noreturn", since
>> they
>>      // might be overridden by non-noreturn functions.
>> @@ -567,8 +567,7 @@ struct CheckFallThroughDiagnostics {
>>        isTemplateInstantiation = Function->isTemplateInstantiation();
>>
>>      if (!isVirtualMethod && !isTemplateInstantiation)
>> -      D.diag_NeverFallThroughOrReturn =
>> -        diag::warn_suggest_noreturn_function;
>> +      D.diag_NeverFallThroughOrReturn =
>> diag::warn_suggest_noreturn_function;
>>      else
>>        D.diag_NeverFallThroughOrReturn = 0;
>>
>> @@ -593,13 +592,12 @@ struct CheckFallThroughDiagnostics {
>>    static CheckFallThroughDiagnostics MakeForBlock() {
>>      CheckFallThroughDiagnostics D;
>>      D.diag_MaybeFallThrough_HasNoReturn =
>> -      diag::err_noreturn_block_has_return_expr;
>> +        diag::err_noreturn_block_has_return_expr;
>>      D.diag_MaybeFallThrough_ReturnsNonVoid =
>> -      diag::err_maybe_falloff_nonvoid_block;
>> +        diag::err_maybe_falloff_nonvoid_block;
>>      D.diag_AlwaysFallThrough_HasNoReturn =
>> -      diag::err_noreturn_block_has_return_expr;
>> -    D.diag_AlwaysFallThrough_ReturnsNonVoid =
>> -      diag::err_falloff_nonvoid_block;
>> +        diag::err_noreturn_block_has_return_expr;
>> +    D.diag_AlwaysFallThrough_ReturnsNonVoid =
>> diag::err_falloff_nonvoid_block;
>>      D.diag_NeverFallThroughOrReturn = 0;
>>      D.funMode = Block;
>>      return D;
>> @@ -608,13 +606,12 @@ struct CheckFallThroughDiagnostics {
>>    static CheckFallThroughDiagnostics MakeForLambda() {
>>      CheckFallThroughDiagnostics D;
>>      D.diag_MaybeFallThrough_HasNoReturn =
>> -      diag::err_noreturn_lambda_has_return_expr;
>> +        diag::err_noreturn_lambda_has_return_expr;
>>      D.diag_MaybeFallThrough_ReturnsNonVoid =
>> -      diag::warn_maybe_falloff_nonvoid_lambda;
>> +        diag::warn_maybe_falloff_nonvoid_lambda;
>>      D.diag_AlwaysFallThrough_HasNoReturn =
>> -      diag::err_noreturn_lambda_has_return_expr;
>> -    D.diag_AlwaysFallThrough_ReturnsNonVoid =
>> -      diag::warn_falloff_nonvoid_lambda;
>> +        diag::err_noreturn_lambda_has_return_expr;
>> +    D.diag_AlwaysFallThrough_ReturnsNonVoid =
>> diag::warn_falloff_nonvoid_lambda;
>>      D.diag_NeverFallThroughOrReturn = 0;
>>      D.funMode = Lambda;
>>      return D;
>> @@ -666,14 +663,12 @@ static void CheckFallThroughForBody(Sema &S, const
>> Decl *D, const Stmt *Body,
>>      else
>>        ReturnsVoid = FD->getReturnType()->isVoidType();
>>      HasNoReturn = FD->isNoReturn();
>> -  }
>> -  else if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
>> +  } else if (const auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
>>      ReturnsVoid = MD->getReturnType()->isVoidType();
>>      HasNoReturn = MD->hasAttr<NoReturnAttr>();
>> -  }
>> -  else if (isa<BlockDecl>(D)) {
>> +  } else if (isa<BlockDecl>(D)) {
>>      if (const FunctionType *FT =
>> -          BlockType->getPointeeType()->getAs<FunctionType>()) {
>> +            BlockType->getPointeeType()->getAs<FunctionType>()) {
>>        if (FT->getReturnType()->isVoidType())
>>          ReturnsVoid = true;
>>        if (FT->getNoReturnAttr())
>> @@ -685,7 +680,7 @@ static void CheckFallThroughForBody(Sema &S, const
>> Decl *D, const Stmt *Body,
>>
>>    // Short circuit for compilation speed.
>>    if (CD.checkDiagnostics(Diags, ReturnsVoid, HasNoReturn))
>> -      return;
>> +    return;
>>    SourceLocation LBrace = Body->getBeginLoc(), RBrace =
>> Body->getEndLoc();
>>    auto EmitDiag = [&](SourceLocation Loc, unsigned DiagID) {
>>      if (IsCoroutine)
>> @@ -700,34 +695,34 @@ static void CheckFallThroughForBody(Sema &S, const
>> Decl *D, const Stmt *Body,
>>
>>    // Either in a function body compound statement, or a
>> function-try-block.
>>    switch (CheckFallThrough(AC)) {
>> -    case UnknownFallThrough:
>> -      break;
>> +  case UnknownFallThrough:
>> +    break;
>>
>> -    case MaybeFallThrough:
>> -      if (HasNoReturn)
>> -        EmitDiag(RBrace, CD.diag_MaybeFallThrough_HasNoReturn);
>> -      else if (!ReturnsVoid)
>> -        EmitDiag(RBrace, CD.diag_MaybeFallThrough_ReturnsNonVoid);
>> -      break;
>> -    case AlwaysFallThrough:
>> -      if (HasNoReturn)
>> -        EmitDiag(RBrace, CD.diag_AlwaysFallThrough_HasNoReturn);
>> -      else if (!ReturnsVoid)
>> -        EmitDiag(RBrace, CD.diag_AlwaysFallThrough_ReturnsNonVoid);
>> -      break;
>> -    case NeverFallThroughOrReturn:
>> -      if (ReturnsVoid && !HasNoReturn &&
>> CD.diag_NeverFallThroughOrReturn) {
>> -        if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
>> -          S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 0 << FD;
>> -        } else if (const ObjCMethodDecl *MD =
>> dyn_cast<ObjCMethodDecl>(D)) {
>> -          S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 1 << MD;
>> -        } else {
>> -          S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn);
>> -        }
>> +  case MaybeFallThrough:
>> +    if (HasNoReturn)
>> +      EmitDiag(RBrace, CD.diag_MaybeFallThrough_HasNoReturn);
>> +    else if (!ReturnsVoid)
>> +      EmitDiag(RBrace, CD.diag_MaybeFallThrough_ReturnsNonVoid);
>> +    break;
>> +  case AlwaysFallThrough:
>> +    if (HasNoReturn)
>> +      EmitDiag(RBrace, CD.diag_AlwaysFallThrough_HasNoReturn);
>> +    else if (!ReturnsVoid)
>> +      EmitDiag(RBrace, CD.diag_AlwaysFallThrough_ReturnsNonVoid);
>> +    break;
>> +  case NeverFallThroughOrReturn:
>> +    if (ReturnsVoid && !HasNoReturn && CD.diag_NeverFallThroughOrReturn)
>> {
>> +      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
>> +        S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 0 << FD;
>> +      } else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
>> {
>> +        S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn) << 1 << MD;
>> +      } else {
>> +        S.Diag(LBrace, CD.diag_NeverFallThroughOrReturn);
>>        }
>> -      break;
>> -    case NeverFallThrough:
>> -      break;
>> +    }
>> +    break;
>> +  case NeverFallThrough:
>> +    break;
>>    }
>>  }
>>
>> @@ -747,7 +742,7 @@ class ContainsReference : public
>> ConstEvaluatedExprVisitor<ContainsReference> {
>>    typedef ConstEvaluatedExprVisitor<ContainsReference> Inherited;
>>
>>    ContainsReference(ASTContext &Context, const DeclRefExpr *Needle)
>> -    : Inherited(Context), FoundReference(false), Needle(Needle) {}
>> +      : Inherited(Context), FoundReference(false), Needle(Needle) {}
>>
>>    void VisitExpr(const Expr *E) {
>>      // Stop evaluating if we already have a reference.
>> @@ -770,8 +765,7 @@ class ContainsReference : public
>> ConstEvaluatedExprVisitor<ContainsReference> {
>>
>>  static bool SuggestInitializationFixit(Sema &S, const VarDecl *VD) {
>>    QualType VariableTy = VD->getType().getCanonicalType();
>> -  if (VariableTy->isBlockPointerType() &&
>> -      !VD->hasAttr<BlocksAttr>()) {
>> +  if (VariableTy->isBlockPointerType() && !VD->hasAttr<BlocksAttr>()) {
>>      S.Diag(VD->getLocation(),
>> diag::note_block_var_fixit_add_initialization)
>>          << VD->getDeclName()
>>          << FixItHint::CreateInsertion(VD->getLocation(), "__block ");
>> @@ -793,16 +787,16 @@ static bool SuggestInitializationFixit(Sema &S,
>> const VarDecl *VD) {
>>    if (Init.empty())
>>      return false;
>>
>> -  S.Diag(Loc, diag::note_var_fixit_add_initialization) <<
>> VD->getDeclName()
>> -    << FixItHint::CreateInsertion(Loc, Init);
>> +  S.Diag(Loc, diag::note_var_fixit_add_initialization)
>> +      << VD->getDeclName() << FixItHint::CreateInsertion(Loc, Init);
>>    return true;
>>  }
>>
>>  /// Create a fixit to remove an if-like statement, on the assumption
>> that its
>>  /// condition is CondVal.
>>  static void CreateIfFixit(Sema &S, const Stmt *If, const Stmt *Then,
>> -                          const Stmt *Else, bool CondVal,
>> -                          FixItHint &Fixit1, FixItHint &Fixit2) {
>> +                          const Stmt *Else, bool CondVal, FixItHint
>> &Fixit1,
>> +                          FixItHint &Fixit2) {
>>    if (CondVal) {
>>      // If condition is always true, remove all but the 'then'.
>>      Fixit1 = FixItHint::CreateRemoval(
>> @@ -838,10 +832,10 @@ static void DiagUninitUse(Sema &S, const VarDecl
>> *VD, const UninitUse &Use,
>>    case UninitUse::AfterDecl:
>>    case UninitUse::AfterCall:
>>      S.Diag(VD->getLocation(), diag::warn_sometimes_uninit_var)
>> -      << VD->getDeclName() << IsCapturedByBlock
>> -      << (Use.getKind() == UninitUse::AfterDecl ? 4 : 5)
>> -      << const_cast<DeclContext*>(VD->getLexicalDeclContext())
>> -      << VD->getSourceRange();
>> +        << VD->getDeclName() << IsCapturedByBlock
>> +        << (Use.getKind() == UninitUse::AfterDecl ? 4 : 5)
>> +        << const_cast<DeclContext *>(VD->getLexicalDeclContext())
>> +        << VD->getSourceRange();
>>      S.Diag(Use.getUser()->getBeginLoc(), diag::note_uninit_var_use)
>>          << IsCapturedByBlock << Use.getUser()->getSourceRange();
>>      return;
>> @@ -870,9 +864,9 @@ static void DiagUninitUse(Sema &S, const VarDecl *VD,
>> const UninitUse &Use,
>>      // For all binary terminators, branch 0 is taken if the condition is
>> true,
>>      // and branch 1 is taken if the condition is false.
>>      int RemoveDiagKind = -1;
>> -    const char *FixitStr =
>> -        S.getLangOpts().CPlusPlus ? (I->Output ? "true" : "false")
>> -                                  : (I->Output ? "1" : "0");
>> +    const char *FixitStr = S.getLangOpts().CPlusPlus
>> +                               ? (I->Output ? "true" : "false")
>> +                               : (I->Output ? "1" : "0");
>>      FixItHint Fixit1, Fixit2;
>>
>>      switch (Term ? Term->getStmtClass() : Stmt::DeclStmtClass) {
>> @@ -888,8 +882,8 @@ static void DiagUninitUse(Sema &S, const VarDecl *VD,
>> const UninitUse &Use,
>>        Str = "if";
>>        Range = IS->getCond()->getSourceRange();
>>        RemoveDiagKind = 0;
>> -      CreateIfFixit(S, IS, IS->getThen(), IS->getElse(),
>> -                    I->Output, Fixit1, Fixit2);
>> +      CreateIfFixit(S, IS, IS->getThen(), IS->getElse(), I->Output,
>> Fixit1,
>> +                    Fixit2);
>>        break;
>>      }
>>      case Stmt::ConditionalOperatorClass: {
>> @@ -898,8 +892,8 @@ static void DiagUninitUse(Sema &S, const VarDecl *VD,
>> const UninitUse &Use,
>>        Str = "?:";
>>        Range = CO->getCond()->getSourceRange();
>>        RemoveDiagKind = 0;
>> -      CreateIfFixit(S, CO, CO->getTrueExpr(), CO->getFalseExpr(),
>> -                    I->Output, Fixit1, Fixit2);
>> +      CreateIfFixit(S, CO, CO->getTrueExpr(), CO->getFalseExpr(),
>> I->Output,
>> +                    Fixit1, Fixit2);
>>        break;
>>      }
>>      case Stmt::BinaryOperatorClass: {
>> @@ -974,13 +968,13 @@ static void DiagUninitUse(Sema &S, const VarDecl
>> *VD, const UninitUse &Use,
>>      }
>>
>>      S.Diag(Range.getBegin(), diag::warn_sometimes_uninit_var)
>> -      << VD->getDeclName() << IsCapturedByBlock << DiagKind
>> -      << Str << I->Output << Range;
>> +        << VD->getDeclName() << IsCapturedByBlock << DiagKind << Str
>> +        << I->Output << Range;
>>      S.Diag(User->getBeginLoc(), diag::note_uninit_var_use)
>>          << IsCapturedByBlock << User->getSourceRange();
>>      if (RemoveDiagKind != -1)
>>        S.Diag(Fixit1.RemoveRange.getBegin(),
>> diag::note_uninit_fixit_remove_cond)
>> -        << RemoveDiagKind << Str << I->Output << Fixit1 << Fixit2;
>> +          << RemoveDiagKind << Str << I->Output << Fixit1 << Fixit2;
>>
>>      Diagnosed = true;
>>    }
>> @@ -1055,81 +1049,77 @@ static bool DiagnoseUninitializedUse(Sema &S,
>> const VarDecl *VD,
>>  }
>>
>>  namespace {
>> -  class FallthroughMapper : public
>> RecursiveASTVisitor<FallthroughMapper> {
>> -  public:
>> -    FallthroughMapper(Sema &S)
>> -      : FoundSwitchStatements(false),
>> -        S(S) {
>> -    }
>> +class FallthroughMapper : public RecursiveASTVisitor<FallthroughMapper> {
>> +public:
>> +  FallthroughMapper(Sema &S) : FoundSwitchStatements(false), S(S) {}
>>
>> -    bool foundSwitchStatements() const { return FoundSwitchStatements; }
>> +  bool foundSwitchStatements() const { return FoundSwitchStatements; }
>>
>> -    void markFallthroughVisited(const AttributedStmt *Stmt) {
>> -      bool Found = FallthroughStmts.erase(Stmt);
>> -      assert(Found);
>> -      (void)Found;
>> -    }
>> +  void markFallthroughVisited(const AttributedStmt *Stmt) {
>> +    bool Found = FallthroughStmts.erase(Stmt);
>> +    assert(Found);
>> +    (void)Found;
>> +  }
>> +
>> +  typedef llvm::SmallPtrSet<const AttributedStmt *, 8> AttrStmts;
>> +
>> +  const AttrStmts &getFallthroughStmts() const { return
>> FallthroughStmts; }
>>
>> -    typedef llvm::SmallPtrSet<const AttributedStmt*, 8> AttrStmts;
>> +  void fillReachableBlocks(CFG *Cfg) {
>> +    assert(ReachableBlocks.empty() && "ReachableBlocks already filled");
>> +    std::deque<const CFGBlock *> BlockQueue;
>>
>> -    const AttrStmts &getFallthroughStmts() const {
>> -      return FallthroughStmts;
>> +    ReachableBlocks.insert(&Cfg->getEntry());
>> +    BlockQueue.push_back(&Cfg->getEntry());
>> +    // Mark all case blocks reachable to avoid problems with switching on
>> +    // constants, covered enums, etc.
>> +    // These blocks can contain fall-through annotations, and we don't
>> want to
>> +    // issue a warn_fallthrough_attr_unreachable for them.
>> +    for (const auto *B : *Cfg) {
>> +      const Stmt *L = B->getLabel();
>> +      if (L && isa<SwitchCase>(L) && ReachableBlocks.insert(B).second)
>> +        BlockQueue.push_back(B);
>>      }
>>
>> -    void fillReachableBlocks(CFG *Cfg) {
>> -      assert(ReachableBlocks.empty() && "ReachableBlocks already
>> filled");
>> -      std::deque<const CFGBlock *> BlockQueue;
>> -
>> -      ReachableBlocks.insert(&Cfg->getEntry());
>> -      BlockQueue.push_back(&Cfg->getEntry());
>> -      // Mark all case blocks reachable to avoid problems with switching
>> on
>> -      // constants, covered enums, etc.
>> -      // These blocks can contain fall-through annotations, and we don't
>> want to
>> -      // issue a warn_fallthrough_attr_unreachable for them.
>> -      for (const auto *B : *Cfg) {
>> -        const Stmt *L = B->getLabel();
>> -        if (L && isa<SwitchCase>(L) && ReachableBlocks.insert(B).second)
>> +    while (!BlockQueue.empty()) {
>> +      const CFGBlock *P = BlockQueue.front();
>> +      BlockQueue.pop_front();
>> +      for (const CFGBlock *B : P->succs()) {
>> +        if (B && ReachableBlocks.insert(B).second)
>>            BlockQueue.push_back(B);
>>        }
>> -
>> -      while (!BlockQueue.empty()) {
>> -        const CFGBlock *P = BlockQueue.front();
>> -        BlockQueue.pop_front();
>> -        for (const CFGBlock *B : P->succs()) {
>> -          if (B && ReachableBlocks.insert(B).second)
>> -            BlockQueue.push_back(B);
>> -        }
>> -      }
>>      }
>> +  }
>>
>> -    bool checkFallThroughIntoBlock(const CFGBlock &B, int &AnnotatedCnt,
>> -                                   bool IsTemplateInstantiation) {
>> -      assert(!ReachableBlocks.empty() && "ReachableBlocks empty");
>> +  bool checkFallThroughIntoBlock(const CFGBlock &B, int &AnnotatedCnt,
>> +                                 bool IsTemplateInstantiation) {
>> +    assert(!ReachableBlocks.empty() && "ReachableBlocks empty");
>>
>> -      int UnannotatedCnt = 0;
>> -      AnnotatedCnt = 0;
>> +    int UnannotatedCnt = 0;
>> +    AnnotatedCnt = 0;
>>
>> -      std::deque<const CFGBlock*> BlockQueue(B.pred_begin(),
>> B.pred_end());
>> -      while (!BlockQueue.empty()) {
>> -        const CFGBlock *P = BlockQueue.front();
>> -        BlockQueue.pop_front();
>> -        if (!P) continue;
>> +    std::deque<const CFGBlock *> BlockQueue(B.pred_begin(),
>> B.pred_end());
>> +    while (!BlockQueue.empty()) {
>> +      const CFGBlock *P = BlockQueue.front();
>> +      BlockQueue.pop_front();
>> +      if (!P)
>> +        continue;
>>
>> -        const Stmt *Term = P->getTerminatorStmt();
>> -        if (Term && isa<SwitchStmt>(Term))
>> -          continue; // Switch statement, good.
>> +      const Stmt *Term = P->getTerminatorStmt();
>> +      if (Term && isa<SwitchStmt>(Term))
>> +        continue; // Switch statement, good.
>>
>> -        const SwitchCase *SW =
>> dyn_cast_or_null<SwitchCase>(P->getLabel());
>> -        if (SW && SW->getSubStmt() == B.getLabel() && P->begin() ==
>> P->end())
>> -          continue; // Previous case label has no statements, good.
>> +      const SwitchCase *SW = dyn_cast_or_null<SwitchCase>(P->getLabel());
>> +      if (SW && SW->getSubStmt() == B.getLabel() && P->begin() ==
>> P->end())
>> +        continue; // Previous case label has no statements, good.
>>
>> -        const LabelStmt *L = dyn_cast_or_null<LabelStmt>(P->getLabel());
>> -        if (L && L->getSubStmt() == B.getLabel() && P->begin() ==
>> P->end())
>> -          continue; // Case label is preceded with a normal label, good.
>> +      const LabelStmt *L = dyn_cast_or_null<LabelStmt>(P->getLabel());
>> +      if (L && L->getSubStmt() == B.getLabel() && P->begin() == P->end())
>> +        continue; // Case label is preceded with a normal label, good.
>>
>> -        if (!ReachableBlocks.count(P)) {
>> -          for (const CFGElement &Elem : llvm::reverse(*P)) {
>> -            if (std::optional<CFGStmt> CS = Elem.getAs<CFGStmt>()) {
>> +      if (!ReachableBlocks.count(P)) {
>> +        for (const CFGElement &Elem : llvm::reverse(*P)) {
>> +          if (std::optional<CFGStmt> CS = Elem.getAs<CFGStmt>()) {
>>              if (const AttributedStmt *AS =
>> asFallThroughAttr(CS->getStmt())) {
>>                // Don't issue a warning for an unreachable fallthrough
>>                // attribute in template instantiations as it may not be
>> @@ -1142,110 +1132,109 @@ namespace {
>>                break;
>>              }
>>              // Don't care about other unreachable statements.
>> -            }
>>            }
>> -          // If there are no unreachable statements, this may be a
>> special
>> -          // case in CFG:
>> -          // case X: {
>> -          //    A a;  // A has a destructor.
>> -          //    break;
>> -          // }
>> -          // // <<<< This place is represented by a 'hanging' CFG block.
>> -          // case Y:
>> -          continue;
>> -        }
>> -
>> -        const Stmt *LastStmt = getLastStmt(*P);
>> -        if (const AttributedStmt *AS = asFallThroughAttr(LastStmt)) {
>> -          markFallthroughVisited(AS);
>> -          ++AnnotatedCnt;
>> -          continue; // Fallthrough annotation, good.
>> -        }
>> -
>> -        if (!LastStmt) { // This block contains no executable statements.
>> -          // Traverse its predecessors.
>> -          std::copy(P->pred_begin(), P->pred_end(),
>> -                    std::back_inserter(BlockQueue));
>> -          continue;
>>          }
>> +        // If there are no unreachable statements, this may be a special
>> +        // case in CFG:
>> +        // case X: {
>> +        //    A a;  // A has a destructor.
>> +        //    break;
>> +        // }
>> +        // // <<<< This place is represented by a 'hanging' CFG block.
>> +        // case Y:
>> +        continue;
>> +      }
>>
>> -        ++UnannotatedCnt;
>> +      const Stmt *LastStmt = getLastStmt(*P);
>> +      if (const AttributedStmt *AS = asFallThroughAttr(LastStmt)) {
>> +        markFallthroughVisited(AS);
>> +        ++AnnotatedCnt;
>> +        continue; // Fallthrough annotation, good.
>>        }
>> -      return !!UnannotatedCnt;
>> -    }
>>
>> -    // RecursiveASTVisitor setup.
>> -    bool shouldWalkTypesOfTypeLocs() const { return false; }
>> +      if (!LastStmt) { // This block contains no executable statements.
>> +        // Traverse its predecessors.
>> +        std::copy(P->pred_begin(), P->pred_end(),
>> +                  std::back_inserter(BlockQueue));
>> +        continue;
>> +      }
>>
>> -    bool VisitAttributedStmt(AttributedStmt *S) {
>> -      if (asFallThroughAttr(S))
>> -        FallthroughStmts.insert(S);
>> -      return true;
>> +      ++UnannotatedCnt;
>>      }
>> +    return !!UnannotatedCnt;
>> +  }
>>
>> -    bool VisitSwitchStmt(SwitchStmt *S) {
>> -      FoundSwitchStatements = true;
>> -      return true;
>> -    }
>> +  // RecursiveASTVisitor setup.
>> +  bool shouldWalkTypesOfTypeLocs() const { return false; }
>>
>> -    // We don't want to traverse local type declarations. We analyze
>> their
>> -    // methods separately.
>> -    bool TraverseDecl(Decl *D) { return true; }
>> +  bool VisitAttributedStmt(AttributedStmt *S) {
>> +    if (asFallThroughAttr(S))
>> +      FallthroughStmts.insert(S);
>> +    return true;
>> +  }
>>
>> -    // We analyze lambda bodies separately. Skip them here.
>> -    bool TraverseLambdaExpr(LambdaExpr *LE) {
>> -      // Traverse the captures, but not the body.
>> -      for (const auto C : zip(LE->captures(), LE->capture_inits()))
>> -        TraverseLambdaCapture(LE, &std::get<0>(C), std::get<1>(C));
>> -      return true;
>> -    }
>> +  bool VisitSwitchStmt(SwitchStmt *S) {
>> +    FoundSwitchStatements = true;
>> +    return true;
>> +  }
>>
>> -  private:
>> +  // We don't want to traverse local type declarations. We analyze their
>> +  // methods separately.
>> +  bool TraverseDecl(Decl *D) { return true; }
>>
>> -    static const AttributedStmt *asFallThroughAttr(const Stmt *S) {
>> -      if (const AttributedStmt *AS =
>> dyn_cast_or_null<AttributedStmt>(S)) {
>> -        if (hasSpecificAttr<FallThroughAttr>(AS->getAttrs()))
>> -          return AS;
>> -      }
>> -      return nullptr;
>> -    }
>> +  // We analyze lambda bodies separately. Skip them here.
>> +  bool TraverseLambdaExpr(LambdaExpr *LE) {
>> +    // Traverse the captures, but not the body.
>> +    for (const auto C : zip(LE->captures(), LE->capture_inits()))
>> +      TraverseLambdaCapture(LE, &std::get<0>(C), std::get<1>(C));
>> +    return true;
>> +  }
>>
>> -    static const Stmt *getLastStmt(const CFGBlock &B) {
>> -      if (const Stmt *Term = B.getTerminatorStmt())
>> -        return Term;
>> -      for (const CFGElement &Elem : llvm::reverse(B))
>> -        if (std::optional<CFGStmt> CS = Elem.getAs<CFGStmt>())
>> -          return CS->getStmt();
>> -      // Workaround to detect a statement thrown out by CFGBuilder:
>> -      //   case X: {} case Y:
>> -      //   case X: ; case Y:
>> -      if (const SwitchCase *SW =
>> dyn_cast_or_null<SwitchCase>(B.getLabel()))
>> -        if (!isa<SwitchCase>(SW->getSubStmt()))
>> -          return SW->getSubStmt();
>> -
>> -      return nullptr;
>> +private:
>> +  static const AttributedStmt *asFallThroughAttr(const Stmt *S) {
>> +    if (const AttributedStmt *AS = dyn_cast_or_null<AttributedStmt>(S)) {
>> +      if (hasSpecificAttr<FallThroughAttr>(AS->getAttrs()))
>> +        return AS;
>>      }
>> +    return nullptr;
>> +  }
>>
>> -    bool FoundSwitchStatements;
>> -    AttrStmts FallthroughStmts;
>> -    Sema &S;
>> -    llvm::SmallPtrSet<const CFGBlock *, 16> ReachableBlocks;
>> -  };
>> +  static const Stmt *getLastStmt(const CFGBlock &B) {
>> +    if (const Stmt *Term = B.getTerminatorStmt())
>> +      return Term;
>> +    for (const CFGElement &Elem : llvm::reverse(B))
>> +      if (std::optional<CFGStmt> CS = Elem.getAs<CFGStmt>())
>> +        return CS->getStmt();
>> +    // Workaround to detect a statement thrown out by CFGBuilder:
>> +    //   case X: {} case Y:
>> +    //   case X: ; case Y:
>> +    if (const SwitchCase *SW =
>> dyn_cast_or_null<SwitchCase>(B.getLabel()))
>> +      if (!isa<SwitchCase>(SW->getSubStmt()))
>> +        return SW->getSubStmt();
>> +
>> +    return nullptr;
>> +  }
>> +
>> +  bool FoundSwitchStatements;
>> +  AttrStmts FallthroughStmts;
>> +  Sema &S;
>> +  llvm::SmallPtrSet<const CFGBlock *, 16> ReachableBlocks;
>> +};
>>  } // anonymous namespace
>>
>>  static StringRef getFallthroughAttrSpelling(Preprocessor &PP,
>>                                              SourceLocation Loc) {
>> -  TokenValue FallthroughTokens[] = {
>> -    tok::l_square, tok::l_square,
>> -    PP.getIdentifierInfo("fallthrough"),
>> -    tok::r_square, tok::r_square
>> -  };
>> -
>> -  TokenValue ClangFallthroughTokens[] = {
>> -    tok::l_square, tok::l_square, PP.getIdentifierInfo("clang"),
>> -    tok::coloncolon, PP.getIdentifierInfo("fallthrough"),
>> -    tok::r_square, tok::r_square
>> -  };
>> +  TokenValue FallthroughTokens[] = {tok::l_square, tok::l_square,
>> +                                    PP.getIdentifierInfo("fallthrough"),
>> +                                    tok::r_square, tok::r_square};
>> +
>> +  TokenValue ClangFallthroughTokens[] = {tok::l_square,
>> +                                         tok::l_square,
>> +                                         PP.getIdentifierInfo("clang"),
>> +                                         tok::coloncolon,
>> +
>>  PP.getIdentifierInfo("fallthrough"),
>> +                                         tok::r_square,
>> +                                         tok::r_square};
>>
>>    bool PreferClangAttr = !PP.getLangOpts().CPlusPlus17 &&
>> !PP.getLangOpts().C2x;
>>
>> @@ -1360,13 +1349,12 @@ static bool isInLoop(const ASTContext &Ctx, const
>> ParentMap &PM,
>>
>>  static void diagnoseRepeatedUseOfWeak(Sema &S,
>>                                        const sema::FunctionScopeInfo
>> *CurFn,
>> -                                      const Decl *D,
>> -                                      const ParentMap &PM) {
>> +                                      const Decl *D, const ParentMap
>> &PM) {
>>    typedef sema::FunctionScopeInfo::WeakObjectProfileTy
>> WeakObjectProfileTy;
>>    typedef sema::FunctionScopeInfo::WeakObjectUseMap WeakObjectUseMap;
>>    typedef sema::FunctionScopeInfo::WeakUseVector WeakUseVector;
>>    typedef std::pair<const Stmt *, WeakObjectUseMap::const_iterator>
>> -  StmtUsesPair;
>> +      StmtUsesPair;
>>
>>    ASTContext &Ctx = S.getASTContext();
>>
>> @@ -1380,7 +1368,7 @@ static void diagnoseRepeatedUseOfWeak(Sema &S,
>>
>>      // Find the first read of the weak object.
>>      WeakUseVector::const_iterator UI = Uses.begin(), UE = Uses.end();
>> -    for ( ; UI != UE; ++UI) {
>> +    for (; UI != UE; ++UI) {
>>        if (UI->isUnsafe())
>>          break;
>>      }
>> @@ -1437,12 +1425,7 @@ static void diagnoseRepeatedUseOfWeak(Sema &S,
>>    // warn_arc_repeated_use_of_weak and
>> warn_arc_possible_repeated_use_of_weak.
>>    // FIXME: Should we use a common classification enum and the same set
>> of
>>    // possibilities all throughout Sema?
>> -  enum {
>> -    Function,
>> -    Method,
>> -    Block,
>> -    Lambda
>> -  } FunctionKind;
>> +  enum { Function, Method, Block, Lambda } FunctionKind;
>>
>>    if (isa<sema::BlockScopeInfo>(CurFn))
>>      FunctionKind = Block;
>> @@ -1473,12 +1456,7 @@ static void diagnoseRepeatedUseOfWeak(Sema &S,
>>      // Classify the weak object being accessed for better warning text.
>>      // This enum should stay in sync with the cases in
>>      // warn_arc_repeated_use_of_weak and
>> warn_arc_possible_repeated_use_of_weak.
>> -    enum {
>> -      Variable,
>> -      Property,
>> -      ImplicitProperty,
>> -      Ivar
>> -    } ObjectKind;
>> +    enum { Variable, Property, ImplicitProperty, Ivar } ObjectKind;
>>
>>      const NamedDecl *KeyProp = Key.getProperty();
>>      if (isa<VarDecl>(KeyProp))
>> @@ -1643,7 +1621,7 @@ class UninitValsDiagReporter : public
>> UninitVariablesHandler {
>>    }
>>
>>  private:
>> -  static bool hasAlwaysUninitializedUse(const UsesVec* vec) {
>> +  static bool hasAlwaysUninitializedUse(const UsesVec *vec) {
>>      return llvm::any_of(*vec, [](const UninitUse &U) {
>>        return U.getKind() == UninitUse::Always ||
>>               U.getKind() == UninitUse::AfterCall ||
>> @@ -1839,10 +1817,10 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>                 : getNotes();
>>    }
>>
>> - public:
>> +public:
>>    ThreadSafetyReporter(Sema &S, SourceLocation FL, SourceLocation FEL)
>> -    : S(S), FunLocation(FL), FunEndLocation(FEL),
>> -      CurrentFunction(nullptr), Verbose(false) {}
>> +      : S(S), FunLocation(FL), FunEndLocation(FEL),
>> CurrentFunction(nullptr),
>> +        Verbose(false) {}
>>
>>    void setVerbose(bool b) { Verbose = b; }
>>
>> @@ -1904,24 +1882,24 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>                                   LockErrorKind LEK) override {
>>      unsigned DiagID = 0;
>>      switch (LEK) {
>> -      case LEK_LockedSomePredecessors:
>> -        DiagID = diag::warn_lock_some_predecessors;
>> -        break;
>> -      case LEK_LockedSomeLoopIterations:
>> -        DiagID = diag::warn_expecting_lock_held_on_loop;
>> -        break;
>> -      case LEK_LockedAtEndOfFunction:
>> -        DiagID = diag::warn_no_unlock;
>> -        break;
>> -      case LEK_NotLockedAtEndOfFunction:
>> -        DiagID = diag::warn_expecting_locked;
>> -        break;
>> +    case LEK_LockedSomePredecessors:
>> +      DiagID = diag::warn_lock_some_predecessors;
>> +      break;
>> +    case LEK_LockedSomeLoopIterations:
>> +      DiagID = diag::warn_expecting_lock_held_on_loop;
>> +      break;
>> +    case LEK_LockedAtEndOfFunction:
>> +      DiagID = diag::warn_no_unlock;
>> +      break;
>> +    case LEK_NotLockedAtEndOfFunction:
>> +      DiagID = diag::warn_expecting_locked;
>> +      break;
>>      }
>>      if (LocEndOfScope.isInvalid())
>>        LocEndOfScope = FunEndLocation;
>>
>> -    PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID) << Kind
>> -                                                               <<
>> LockName);
>> +    PartialDiagnosticAt Warning(LocEndOfScope, S.PDiag(DiagID)
>> +                                                   << Kind << LockName);
>>      Warnings.emplace_back(std::move(Warning),
>>                            makeLockedHereNote(LocLocked, Kind));
>>    }
>> @@ -1941,11 +1919,11 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>                           AccessKind AK, SourceLocation Loc) override {
>>      assert((POK == POK_VarAccess || POK == POK_VarDereference) &&
>>             "Only works for variables");
>> -    unsigned DiagID = POK == POK_VarAccess?
>> -                        diag::warn_variable_requires_any_lock:
>> -                        diag::warn_var_deref_requires_any_lock;
>> +    unsigned DiagID = POK == POK_VarAccess
>> +                          ? diag::warn_variable_requires_any_lock
>> +                          : diag::warn_var_deref_requires_any_lock;
>>      PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID)
>> -      << D << getLockKindFromAccessKind(AK));
>> +                                         << D <<
>> getLockKindFromAccessKind(AK));
>>      Warnings.emplace_back(std::move(Warning), getNotes());
>>    }
>>
>> @@ -1956,25 +1934,24 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>      unsigned DiagID = 0;
>>      if (PossibleMatch) {
>>        switch (POK) {
>> -        case POK_VarAccess:
>> -          DiagID = diag::warn_variable_requires_lock_precise;
>> -          break;
>> -        case POK_VarDereference:
>> -          DiagID = diag::warn_var_deref_requires_lock_precise;
>> -          break;
>> -        case POK_FunctionCall:
>> -          DiagID = diag::warn_fun_requires_lock_precise;
>> -          break;
>> -        case POK_PassByRef:
>> -          DiagID = diag::warn_guarded_pass_by_reference;
>> -          break;
>> -        case POK_PtPassByRef:
>> -          DiagID = diag::warn_pt_guarded_pass_by_reference;
>> -          break;
>> +      case POK_VarAccess:
>> +        DiagID = diag::warn_variable_requires_lock_precise;
>> +        break;
>> +      case POK_VarDereference:
>> +        DiagID = diag::warn_var_deref_requires_lock_precise;
>> +        break;
>> +      case POK_FunctionCall:
>> +        DiagID = diag::warn_fun_requires_lock_precise;
>> +        break;
>> +      case POK_PassByRef:
>> +        DiagID = diag::warn_guarded_pass_by_reference;
>> +        break;
>> +      case POK_PtPassByRef:
>> +        DiagID = diag::warn_pt_guarded_pass_by_reference;
>> +        break;
>>        }
>> -      PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind
>> -                                                       << D
>> -                                                       << LockName <<
>> LK);
>> +      PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID)
>> +                                           << Kind << D << LockName <<
>> LK);
>>        PartialDiagnosticAt Note(Loc,
>> S.PDiag(diag::note_found_mutex_near_match)
>>                                          << *PossibleMatch);
>>        if (Verbose && POK == POK_VarAccess) {
>> @@ -1986,25 +1963,24 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>          Warnings.emplace_back(std::move(Warning), getNotes(Note));
>>      } else {
>>        switch (POK) {
>> -        case POK_VarAccess:
>> -          DiagID = diag::warn_variable_requires_lock;
>> -          break;
>> -        case POK_VarDereference:
>> -          DiagID = diag::warn_var_deref_requires_lock;
>> -          break;
>> -        case POK_FunctionCall:
>> -          DiagID = diag::warn_fun_requires_lock;
>> -          break;
>> -        case POK_PassByRef:
>> -          DiagID = diag::warn_guarded_pass_by_reference;
>> -          break;
>> -        case POK_PtPassByRef:
>> -          DiagID = diag::warn_pt_guarded_pass_by_reference;
>> -          break;
>> +      case POK_VarAccess:
>> +        DiagID = diag::warn_variable_requires_lock;
>> +        break;
>> +      case POK_VarDereference:
>> +        DiagID = diag::warn_var_deref_requires_lock;
>> +        break;
>> +      case POK_FunctionCall:
>> +        DiagID = diag::warn_fun_requires_lock;
>> +        break;
>> +      case POK_PassByRef:
>> +        DiagID = diag::warn_guarded_pass_by_reference;
>> +        break;
>> +      case POK_PtPassByRef:
>> +        DiagID = diag::warn_pt_guarded_pass_by_reference;
>> +        break;
>>        }
>> -      PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID) << Kind
>> -                                                       << D
>> -                                                       << LockName <<
>> LK);
>> +      PartialDiagnosticAt Warning(Loc, S.PDiag(DiagID)
>> +                                           << Kind << D << LockName <<
>> LK);
>>        if (Verbose && POK == POK_VarAccess) {
>>          PartialDiagnosticAt Note(D->getLocation(),
>>
>> S.PDiag(diag::note_guarded_by_declared_here));
>> @@ -2016,9 +1992,9 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>
>>    void handleNegativeNotHeld(StringRef Kind, Name LockName, Name Neg,
>>                               SourceLocation Loc) override {
>> -    PartialDiagnosticAt Warning(Loc,
>> -        S.PDiag(diag::warn_acquire_requires_negative_cap)
>> -        << Kind << LockName << Neg);
>> +    PartialDiagnosticAt Warning(
>> +        Loc, S.PDiag(diag::warn_acquire_requires_negative_cap)
>> +                 << Kind << LockName << Neg);
>>      Warnings.emplace_back(std::move(Warning), getNotes());
>>    }
>>
>> @@ -2038,22 +2014,20 @@ class ThreadSafetyReporter : public
>> clang::threadSafety::ThreadSafetyHandler {
>>
>>    void handleLockAcquiredBefore(StringRef Kind, Name L1Name, Name L2Name,
>>                                  SourceLocation Loc) override {
>> -    PartialDiagnosticAt Warning(Loc,
>> -      S.PDiag(diag::warn_acquired_before) << Kind << L1Name << L2Name);
>> +    PartialDiagnosticAt Warning(Loc, S.PDiag(diag::warn_acquired_before)
>> +                                         << Kind << L1Name << L2Name);
>>      Warnings.emplace_back(std::move(Warning), getNotes());
>>    }
>>
>>    void handleBeforeAfterCycle(Name L1Name, SourceLocation Loc) override {
>> -    PartialDiagnosticAt Warning(Loc,
>> -      S.PDiag(diag::warn_acquired_before_after_cycle) << L1Name);
>> +    PartialDiagnosticAt Warning(
>> +        Loc, S.PDiag(diag::warn_acquired_before_after_cycle) << L1Name);
>>      Warnings.emplace_back(std::move(Warning), getNotes());
>>    }
>>
>> -  void enterFunction(const FunctionDecl* FD) override {
>> -    CurrentFunction = FD;
>> -  }
>> +  void enterFunction(const FunctionDecl *FD) override { CurrentFunction
>> = FD; }
>>
>> -  void leaveFunction(const FunctionDecl* FD) override {
>> +  void leaveFunction(const FunctionDecl *FD) override {
>>      CurrentFunction = nullptr;
>>    }
>>  };
>> @@ -2074,7 +2048,6 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>    DiagList Warnings;
>>
>>  public:
>> -
>>    ConsumedWarningsHandler(Sema &S) : S(S) {}
>>
>>    void emitDiagnostics() override {
>> @@ -2088,8 +2061,8 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>
>>    void warnLoopStateMismatch(SourceLocation Loc,
>>                               StringRef VariableName) override {
>> -    PartialDiagnosticAt Warning(Loc,
>> S.PDiag(diag::warn_loop_state_mismatch) <<
>> -      VariableName);
>> +    PartialDiagnosticAt Warning(Loc,
>> S.PDiag(diag::warn_loop_state_mismatch)
>> +                                         << VariableName);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>> @@ -2099,9 +2072,9 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>                                          StringRef ExpectedState,
>>                                          StringRef ObservedState)
>> override {
>>
>> -    PartialDiagnosticAt Warning(Loc, S.PDiag(
>> -      diag::warn_param_return_typestate_mismatch) << VariableName <<
>> -        ExpectedState << ObservedState);
>> +    PartialDiagnosticAt Warning(
>> +        Loc, S.PDiag(diag::warn_param_return_typestate_mismatch)
>> +                 << VariableName << ExpectedState << ObservedState);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>> @@ -2109,16 +2082,18 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>    void warnParamTypestateMismatch(SourceLocation Loc, StringRef
>> ExpectedState,
>>                                    StringRef ObservedState) override {
>>
>> -    PartialDiagnosticAt Warning(Loc, S.PDiag(
>> -      diag::warn_param_typestate_mismatch) << ExpectedState <<
>> ObservedState);
>> +    PartialDiagnosticAt Warning(Loc,
>> +
>> S.PDiag(diag::warn_param_typestate_mismatch)
>> +                                    << ExpectedState << ObservedState);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>>
>>    void warnReturnTypestateForUnconsumableType(SourceLocation Loc,
>>                                                StringRef TypeName)
>> override {
>> -    PartialDiagnosticAt Warning(Loc, S.PDiag(
>> -      diag::warn_return_typestate_for_unconsumable_type) << TypeName);
>> +    PartialDiagnosticAt Warning(
>> +        Loc, S.PDiag(diag::warn_return_typestate_for_unconsumable_type)
>> +                 << TypeName);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>> @@ -2126,8 +2101,9 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>    void warnReturnTypestateMismatch(SourceLocation Loc, StringRef
>> ExpectedState,
>>                                     StringRef ObservedState) override {
>>
>> -    PartialDiagnosticAt Warning(Loc, S.PDiag(
>> -      diag::warn_return_typestate_mismatch) << ExpectedState <<
>> ObservedState);
>> +    PartialDiagnosticAt Warning(Loc,
>> +
>> S.PDiag(diag::warn_return_typestate_mismatch)
>> +                                    << ExpectedState << ObservedState);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>> @@ -2135,8 +2111,9 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>    void warnUseOfTempInInvalidState(StringRef MethodName, StringRef State,
>>                                     SourceLocation Loc) override {
>>
>> -    PartialDiagnosticAt Warning(Loc, S.PDiag(
>> -      diag::warn_use_of_temp_in_invalid_state) << MethodName << State);
>> +    PartialDiagnosticAt Warning(Loc,
>> +
>> S.PDiag(diag::warn_use_of_temp_in_invalid_state)
>> +                                    << MethodName << State);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>> @@ -2144,8 +2121,9 @@ class ConsumedWarningsHandler : public
>> ConsumedWarningsHandlerBase {
>>    void warnUseInInvalidState(StringRef MethodName, StringRef
>> VariableName,
>>                               StringRef State, SourceLocation Loc)
>> override {
>>
>> -    PartialDiagnosticAt Warning(Loc,
>> S.PDiag(diag::warn_use_in_invalid_state) <<
>> -                                MethodName << VariableName << State);
>> +    PartialDiagnosticAt Warning(Loc,
>> S.PDiag(diag::warn_use_in_invalid_state)
>> +                                         << MethodName << VariableName
>> +                                         << State);
>>
>>      Warnings.emplace_back(std::move(Warning), OptionalNotes());
>>    }
>> @@ -2340,7 +2318,7 @@ class CallableVisitor : public
>> RecursiveASTVisitor<CallableVisitor> {
>>  };
>>
>>  void clang::sema::AnalysisBasedWarnings::IssueWarnings(
>> -    const TranslationUnitDecl *TU) {
>> +    TranslationUnitDecl *TU) {
>>    if (!TU)
>>      return; // This is unexpected, give up quietly.
>>
>> @@ -2370,9 +2348,7 @@ void
>> clang::sema::AnalysisBasedWarnings::IssueWarnings(
>>    // reasoning. Check if any of them is enabled at all before scanning
>> the AST:
>>    if (!Diags.isIgnored(diag::warn_unsafe_buffer_operation,
>> SourceLocation()) ||
>>        !Diags.isIgnored(diag::warn_unsafe_buffer_variable,
>> SourceLocation())) {
>> -    CallableVisitor(CallAnalyzers)
>> -        .TraverseTranslationUnitDecl(
>> -            std::remove_const_t<TranslationUnitDecl *>(TU));
>> +    CallableVisitor(CallAnalyzers).TraverseTranslationUnitDecl(TU);
>>    }
>>  }
>>
>> @@ -2430,16 +2406,15 @@ void
>> clang::sema::AnalysisBasedWarnings::IssueWarnings(
>>        P.enableConsumedAnalysis) {
>>      // Unreachable code analysis and thread safety require a linearized
>> CFG.
>>      AC.getCFGBuildOptions().setAllAlwaysAdd();
>> -  }
>> -  else {
>> +  } else {
>>      AC.getCFGBuildOptions()
>> -      .setAlwaysAdd(Stmt::BinaryOperatorClass)
>> -      .setAlwaysAdd(Stmt::CompoundAssignOperatorClass)
>> -      .setAlwaysAdd(Stmt::BlockExprClass)
>> -      .setAlwaysAdd(Stmt::CStyleCastExprClass)
>> -      .setAlwaysAdd(Stmt::DeclRefExprClass)
>> -      .setAlwaysAdd(Stmt::ImplicitCastExprClass)
>> -      .setAlwaysAdd(Stmt::UnaryOperatorClass);
>> +        .setAlwaysAdd(Stmt::BinaryOperatorClass)
>> +        .setAlwaysAdd(Stmt::CompoundAssignOperatorClass)
>> +        .setAlwaysAdd(Stmt::BlockExprClass)
>> +        .setAlwaysAdd(Stmt::CStyleCastExprClass)
>> +        .setAlwaysAdd(Stmt::DeclRefExprClass)
>> +        .setAlwaysAdd(Stmt::ImplicitCastExprClass)
>> +        .setAlwaysAdd(Stmt::UnaryOperatorClass);
>>    }
>>
>>    // Install the logical handler.
>> @@ -2493,15 +2468,14 @@ void
>> clang::sema::AnalysisBasedWarnings::IssueWarnings(
>>    // Warning: check missing 'return'
>>    if (P.enableCheckFallThrough) {
>>      const CheckFallThroughDiagnostics &CD =
>> -        (isa<BlockDecl>(D)
>> -             ? CheckFallThroughDiagnostics::MakeForBlock()
>> -             : (isa<CXXMethodDecl>(D) &&
>> -                cast<CXXMethodDecl>(D)->getOverloadedOperator() ==
>> OO_Call &&
>> -                cast<CXXMethodDecl>(D)->getParent()->isLambda())
>> -                   ? CheckFallThroughDiagnostics::MakeForLambda()
>> -                   : (fscope->isCoroutine()
>> -                          ?
>> CheckFallThroughDiagnostics::MakeForCoroutine(D)
>> -                          :
>> CheckFallThroughDiagnostics::MakeForFunction(D)));
>> +        (isa<BlockDecl>(D) ? CheckFallThroughDiagnostics::MakeForBlock()
>> +         : (isa<CXXMethodDecl>(D) &&
>> +            cast<CXXMethodDecl>(D)->getOverloadedOperator() == OO_Call &&
>> +            cast<CXXMethodDecl>(D)->getParent()->isLambda())
>> +             ? CheckFallThroughDiagnostics::MakeForLambda()
>> +             : (fscope->isCoroutine()
>> +                    ? CheckFallThroughDiagnostics::MakeForCoroutine(D)
>> +                    : CheckFallThroughDiagnostics::MakeForFunction(D)));
>>      CheckFallThroughForBody(S, D, Body, BlockType, CD, AC, fscope);
>>    }
>>
>> @@ -2555,12 +2529,10 @@ void
>> clang::sema::AnalysisBasedWarnings::IssueWarnings(
>>          ++NumUninitAnalysisFunctions;
>>          NumUninitAnalysisVariables += stats.NumVariablesAnalyzed;
>>          NumUninitAnalysisBlockVisits += stats.NumBlockVisits;
>> -        MaxUninitAnalysisVariablesPerFunction =
>> -            std::max(MaxUninitAnalysisVariablesPerFunction,
>> -                     stats.NumVariablesAnalyzed);
>> -        MaxUninitAnalysisBlockVisitsPerFunction =
>> -            std::max(MaxUninitAnalysisBlockVisitsPerFunction,
>> -                     stats.NumBlockVisits);
>> +        MaxUninitAnalysisVariablesPerFunction = std::max(
>> +            MaxUninitAnalysisVariablesPerFunction,
>> stats.NumVariablesAnalyzed);
>> +        MaxUninitAnalysisBlockVisitsPerFunction = std::max(
>> +            MaxUninitAnalysisBlockVisitsPerFunction,
>> stats.NumBlockVisits);
>>        }
>>      }
>>    }
>> @@ -2589,7 +2561,6 @@ void
>> clang::sema::AnalysisBasedWarnings::IssueWarnings(
>>        !Diags.isIgnored(diag::warn_arc_repeated_use_of_weak,
>> D->getBeginLoc()))
>>      diagnoseRepeatedUseOfWeak(S, fscope, D, AC.getParentMap());
>>
>> -
>>    // Check for infinite self-recursion in functions
>>    if (!Diags.isIgnored(diag::warn_infinite_recursive_function,
>>                         D->getBeginLoc())) {
>> @@ -2617,8 +2588,8 @@ void
>> clang::sema::AnalysisBasedWarnings::IssueWarnings(
>>        // If we successfully built a CFG for this context, record some
>> more
>>        // detail information about it.
>>        NumCFGBlocks += cfg->getNumBlockIDs();
>> -      MaxCFGBlocksPerFunction = std::max(MaxCFGBlocksPerFunction,
>> -                                         cfg->getNumBlockIDs());
>> +      MaxCFGBlocksPerFunction =
>> +          std::max(MaxCFGBlocksPerFunction, cfg->getNumBlockIDs());
>>      } else {
>>        ++NumFunctionsWithBadCFGs;
>>      }
>> @@ -2630,7 +2601,7 @@ void
>> clang::sema::AnalysisBasedWarnings::PrintStats() const {
>>
>>    unsigned NumCFGsBuilt = NumFunctionsAnalyzed - NumFunctionsWithBadCFGs;
>>    unsigned AvgCFGBlocksPerFunction =
>> -      !NumCFGsBuilt ? 0 : NumCFGBlocks/NumCFGsBuilt;
>> +      !NumCFGsBuilt ? 0 : NumCFGBlocks / NumCFGsBuilt;
>>    llvm::errs() << NumFunctionsAnalyzed << " functions analyzed ("
>>                 << NumFunctionsWithBadCFGs << " w/o CFGs).\n"
>>                 << "  " << NumCFGBlocks << " CFG blocks built.\n"
>> @@ -2639,10 +2610,14 @@ void
>> clang::sema::AnalysisBasedWarnings::PrintStats() const {
>>                 << "  " << MaxCFGBlocksPerFunction
>>                 << " max CFG blocks per function.\n";
>>
>> -  unsigned AvgUninitVariablesPerFunction = !NumUninitAnalysisFunctions ?
>> 0
>> -      : NumUninitAnalysisVariables/NumUninitAnalysisFunctions;
>> -  unsigned AvgUninitBlockVisitsPerFunction = !NumUninitAnalysisFunctions
>> ? 0
>> -      : NumUninitAnalysisBlockVisits/NumUninitAnalysisFunctions;
>> +  unsigned AvgUninitVariablesPerFunction =
>> +      !NumUninitAnalysisFunctions
>> +          ? 0
>> +          : NumUninitAnalysisVariables / NumUninitAnalysisFunctions;
>> +  unsigned AvgUninitBlockVisitsPerFunction =
>> +      !NumUninitAnalysisFunctions
>> +          ? 0
>> +          : NumUninitAnalysisBlockVisits / NumUninitAnalysisFunctions;
>>    llvm::errs() << NumUninitAnalysisFunctions
>>                 << " functions analyzed for uninitialiazed variables\n"
>>                 << "  " << NumUninitAnalysisVariables << " variables
>> analyzed.\n"
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>

-- 
Ziqing Luo, Ph.D.
Computer & Information Science Department
Verified Software Lab
University of Delaware
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230515/beafcc9e/attachment-0001.html>


More information about the cfe-commits mailing list