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 @@ -353,6 +354,16 @@ continue; } + // FIXME: add unit tests that cover this statement. + if (auto *IndVal1 = dyn_cast(Val)) { + auto *IndVal2 = cast(It->second); + assert(IndVal1->getKind() == IndVal2->getKind()); + if (&IndVal1->getPointeeLoc() == &IndVal2->getPointeeLoc()) { + JoinedEnv.LocToVal.insert({Loc, Val}); + continue; + } + } + if (Value *MergedVal = mergeDistinctValues( Loc->getType(), Val, *this, It->second, Other, JoinedEnv, Model)) JoinedEnv.LocToVal.insert({Loc, MergedVal});