diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp --- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -21,6 +21,7 @@ #include "clang/Analysis/FlowSensitive/Value.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" #include #include @@ -105,6 +106,15 @@ return &MergedEnv.makeOr(*Expr1, *Expr2); } + // FIXME: add unit tests that cover this statement. + if (auto *IndVal1 = dyn_cast(Val1)) { + auto *IndVal2 = cast(Val2); + assert(IndVal1->getKind() == IndVal2->getKind()); + if (&IndVal1->getPointeeLoc() == &IndVal2->getPointeeLoc()) { + return Val1; + } + } + // FIXME: Consider destroying `MergedValue` immediately if `ValueModel::merge` // returns false to avoid storing unneeded values in `DACtx`. if (Value *MergedVal = MergedEnv.createValue(Type))