================ @@ -315,6 +315,62 @@ static bool isFunctionMacroExpansion(SourceLocation Loc, return EInfo.isFunctionMacroExpansion(); } +static const LocationContext *getFirstNonCtorCall(const LocationContext *LCtx) { + while (llvm::isa_and_nonnull<CXXConstructorDecl>(LCtx->getDecl())) + LCtx = LCtx->getParent(); + return LCtx; +} + +static const MemRegion *getInitializerRegion(const PostInitializer &PI) { + return reinterpret_cast<const MemRegion *>(PI.getLocationValue()); +} + +/// Based largely on isInitializationOfVar(). Checks if N initializes FR. +static bool isInitializationOfField(const ExplodedNode *N, + const FieldRegion *FR) { + std::optional<PostInitializer> P = N->getLocationAs<PostInitializer>(); + if (!P) + return false; + + const MemRegion *InitR = getInitializerRegion(*P); + + if (FR != InitR) + return false; + + const MemSpaceRegion *FRSpace = FR->getMemorySpace(); + const auto *FRCtx = dyn_cast<StackSpaceRegion>(FRSpace); + + if (!FRCtx) + return true; + + // The stack frame of N is the constructor, but the FieldRegion is not local + // to the constructor, but rather to the caller function. + const LocationContext *CallerCtx = + getFirstNonCtorCall(N->getLocationContext()); + + return FRCtx->getStackFrame() == CallerCtx->getStackFrame(); ---------------- NagyDonat wrote:
This looks like you are calling the same method on two different objects of the same type, but IIUC their types are unrelated: `FRCtx` is a `StackSpaceRegion` while `CallerCtx` is a `LocationContext`. I think it would be helpful to rename `FRCtx` to `FRStackSpace` or something similar to emphasize that it's *not* a (location) context object. https://github.com/llvm/llvm-project/pull/106982 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits