================ @@ -751,12 +751,27 @@ std::string MemRegion::getDescriptiveName(bool UseQuotes) const { } // Get variable name. - if (R && R->canPrintPrettyAsExpr()) { - R->printPrettyAsExpr(os); - if (UseQuotes) - return (llvm::Twine("'") + os.str() + ArrayIndices + "'").str(); - else + if (R) { + // MemRegion can be pretty printed. + if (R->canPrintPrettyAsExpr()) { + R->printPrettyAsExpr(os); + if (UseQuotes) + return (llvm::Twine("'") + os.str() + ArrayIndices + "'").str(); return (llvm::Twine(os.str()) + ArrayIndices).str(); + } + + // FieldRegion may have ElementRegion as SuperRegion. + if (const clang::ento::FieldRegion *FR = + R->getAs<clang::ento::FieldRegion>()) { + std::string Super = FR->getSuperRegion()->getDescriptiveName(false); ---------------- T-Gruber wrote:
I completely agree with you. It really is a bit messy and confusing. I'm currently working with a workaround that looks like this: ```Cpp std::string getDescriptiveNameFixed(const clang::ento::MemRegion *R) { if (const auto *ER = R->getAs<clang::ento::ElementRegion>()) { std::string ArrayIndices; // Index is a ConcreteInt. if (auto CI = ER->getIndex().getAs<clang::ento::nonloc::ConcreteInt>()) { llvm::SmallString<2> Idx; CI->getValue().toString(Idx); ArrayIndices = (llvm::Twine("[") + Idx.str() + "]" + ArrayIndices).str(); } // Index is symbolic, but may have a descriptive name. else { auto SI = ER->getIndex().getAs<clang::ento::nonloc::SymbolVal>(); if (!SI) return ""; const clang::ento::MemRegion *OR = SI->getAsSymbol()->getOriginRegion(); if (!OR) return ""; std::string Idx = OR->getDescriptiveName(false); if (Idx.empty()) return ""; ArrayIndices = (llvm::Twine("[") + Idx + "]" + ArrayIndices).str(); } // Get descriptive name of SuperRegion. std::string Super = getDescriptiveNameFixed(ER->getSuperRegion()); if (Super.empty()) return ""; return Super + ArrayIndices; } if (const auto *FR = R->getAs<clang::ento::FieldRegion>()) { // Get descriptive name of SuperRegion. std::string Super = getDescriptiveNameFixed(FR->getSuperRegion()); if (Super.empty()) return ""; return Super + "." + FR->getDecl()->getNameAsString(); } // MemRegion is one of: NonParamVarRegion, ParamVarRegion, ObjCIvarRegion, // CXXBaseObjectRegion or CXXDerivedObjectRegion. if (R && R->canPrintPrettyAsExpr()) { llvm::SmallString<50> buf; llvm::raw_svector_ostream os(buf); R->printPrettyAsExpr(os); return os.str().str(); } return ""; } ``` In my opinion it's much clearer and easier to understand. What do you think? https://github.com/llvm/llvm-project/pull/112313 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits