https://github.com/necto updated https://github.com/llvm/llvm-project/pull/121781
>From 08b838adf275f1e0eaf2ab3e3d4b2b6d89bf4ed6 Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 14:37:08 +0100 Subject: [PATCH 01/11] [NFC] Replace getRegionValueSymbol with get<SymbolRegionValue> This should generalize to all get<symbol> methods handled in subsequent commits --- .../Core/PathSensitive/SymbolManager.h | 17 +++++++++++++++-- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 14 -------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index c530dff495238b..d1c6cf98358046 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -525,8 +525,8 @@ class SymbolManager { static bool canSymbolicate(QualType T); - /// Make a unique symbol for MemRegion R according to its kind. - const SymbolRegionValue* getRegionValueSymbol(const TypedValueRegion* R); + template <typename T, typename... Args> + const T *get(Args &&...args); const SymbolConjured* conjureSymbol(const Stmt *E, const LocationContext *LCtx, @@ -707,6 +707,19 @@ class SymbolVisitor { virtual bool VisitMemRegion(const MemRegion *) { return true; } }; +template <typename T, typename... Args> +const T *SymbolManager::get(Args &&...args) { + llvm::FoldingSetNodeID profile; + T::Profile(profile, std::forward<Args>(args)...); + void *InsertPos; + SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); + if (!SD) { + SD = Alloc.make<T>(std::forward<Args>(args)...); + DataSet.InsertNode(SD, InsertPos); + } + return cast<T>(SD); +} + } // namespace ento } // namespace clang diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index 2b855801863818..d20d7ea3eff6cd 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -143,7 +143,7 @@ SValBuilder::getRegionValueSymbolVal(const TypedValueRegion *region) { if (!SymbolManager::canSymbolicate(T)) return UnknownVal(); - SymbolRef sym = SymMgr.getRegionValueSymbol(region); + SymbolRef sym = SymMgr.get<SymbolRegionValue>(region); if (Loc::isLocType(T)) return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym)); diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 738b6a175ce6de..7caedb678218fd 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,20 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymbolRegionValue* -SymbolManager::getRegionValueSymbol(const TypedValueRegion* R) { - llvm::FoldingSetNodeID profile; - SymbolRegionValue::Profile(profile, R); - void *InsertPos; - SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); - if (!SD) { - SD = Alloc.make<SymbolRegionValue>(R); - DataSet.InsertNode(SD, InsertPos); - } - - return cast<SymbolRegionValue>(SD); -} - const SymbolConjured* SymbolManager::conjureSymbol(const Stmt *E, const LocationContext *LCtx, QualType T, >From 5213d1b9f9723d90397dbba1969ebb4d04119fe7 Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 14:44:20 +0100 Subject: [PATCH 02/11] [NFC] Redefine conjureSymbol via get<SymbolConjured> --- .../Core/PathSensitive/SymbolManager.h | 12 +++++++----- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 17 ----------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index d1c6cf98358046..2acf40616ade48 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -113,10 +113,10 @@ class SymbolConjured : public SymbolData { void dumpToStream(raw_ostream &os) const override; - static void Profile(llvm::FoldingSetNodeID& profile, const Stmt *S, - QualType T, unsigned Count, const LocationContext *LCtx, + static void Profile(llvm::FoldingSetNodeID &profile, const Stmt *S, + const LocationContext *LCtx, QualType T, unsigned Count, const void *SymbolTag) { - profile.AddInteger((unsigned) SymbolConjuredKind); + profile.AddInteger((unsigned)SymbolConjuredKind); profile.AddPointer(S); profile.AddPointer(LCtx); profile.Add(T); @@ -125,7 +125,7 @@ class SymbolConjured : public SymbolData { } void Profile(llvm::FoldingSetNodeID& profile) override { - Profile(profile, S, T, Count, LCtx, SymbolTag); + Profile(profile, S, LCtx, T, Count, SymbolTag); } // Implement isa<T> support. @@ -532,7 +532,9 @@ class SymbolManager { const LocationContext *LCtx, QualType T, unsigned VisitCount, - const void *SymbolTag = nullptr); + const void *SymbolTag = nullptr) { + return get<SymbolConjured>(E, LCtx, T, VisitCount, SymbolTag); + } const SymbolConjured* conjureSymbol(const Expr *E, const LocationContext *LCtx, diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 7caedb678218fd..cc666ef85f9c94 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,23 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymbolConjured* SymbolManager::conjureSymbol(const Stmt *E, - const LocationContext *LCtx, - QualType T, - unsigned Count, - const void *SymbolTag) { - llvm::FoldingSetNodeID profile; - SymbolConjured::Profile(profile, E, T, Count, LCtx, SymbolTag); - void *InsertPos; - SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); - if (!SD) { - SD = Alloc.make<SymbolConjured>(E, LCtx, T, Count, SymbolTag); - DataSet.InsertNode(SD, InsertPos); - } - - return cast<SymbolConjured>(SD); -} - const SymbolDerived* SymbolManager::getDerivedSymbol(SymbolRef parentSymbol, const TypedValueRegion *R) { >From cd94ceda7afe92ef18170bedeea0a59cb5ca0d6d Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 14:48:00 +0100 Subject: [PATCH 03/11] [NFC] Replace getDerivedSymbol with get<SymbolDerived> --- .../Core/PathSensitive/SymbolManager.h | 3 --- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 15 --------------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 2acf40616ade48..86babeb893223a 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -543,9 +543,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - const SymbolDerived *getDerivedSymbol(SymbolRef parentSymbol, - const TypedValueRegion *R); - const SymbolExtent *getExtentSymbol(const SubRegion *R); /// Creates a metadata symbol associated with a specific region. diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index d20d7ea3eff6cd..34b32e1b2225d4 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -264,7 +264,7 @@ SValBuilder::getDerivedRegionValueSymbolVal(SymbolRef parentSymbol, if (!SymbolManager::canSymbolicate(T)) return UnknownVal(); - SymbolRef sym = SymMgr.getDerivedSymbol(parentSymbol, region); + SymbolRef sym = SymMgr.get<SymbolDerived>(parentSymbol, region); if (Loc::isLocType(T)) return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym)); diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index cc666ef85f9c94..7fc237cc8d0c90 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,21 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymbolDerived* -SymbolManager::getDerivedSymbol(SymbolRef parentSymbol, - const TypedValueRegion *R) { - llvm::FoldingSetNodeID profile; - SymbolDerived::Profile(profile, parentSymbol, R); - void *InsertPos; - SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); - if (!SD) { - SD = Alloc.make<SymbolDerived>(parentSymbol, R); - DataSet.InsertNode(SD, InsertPos); - } - - return cast<SymbolDerived>(SD); -} - const SymbolExtent* SymbolManager::getExtentSymbol(const SubRegion *R) { llvm::FoldingSetNodeID profile; >From 605ee807879a73009a09fdf31d76d79a8209ae66 Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 14:50:20 +0100 Subject: [PATCH 04/11] [NFC] Replace getExtentSymbol with get<SymbolExtent> --- .../Core/PathSensitive/SymbolManager.h | 2 -- clang/lib/StaticAnalyzer/Core/MemRegion.cpp | 6 +++--- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 14 -------------- 4 files changed, 4 insertions(+), 20 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 86babeb893223a..180f25ae74b093 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -543,8 +543,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - const SymbolExtent *getExtentSymbol(const SubRegion *R); - /// Creates a metadata symbol associated with a specific region. /// /// VisitCount can be used to differentiate regions corresponding to diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp index 559c80634c12e5..326cc7fd451ee6 100644 --- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -811,7 +811,7 @@ DefinedOrUnknownSVal MemRegionManager::getStaticSize(const MemRegion *MR, switch (SR->getKind()) { case MemRegion::AllocaRegionKind: case MemRegion::SymbolicRegionKind: - return nonloc::SymbolVal(SymMgr.getExtentSymbol(SR)); + return nonloc::SymbolVal(SymMgr.get<SymbolExtent>(SR)); case MemRegion::StringRegionKind: return SVB.makeIntVal( cast<StringRegion>(SR)->getStringLiteral()->getByteLength() + 1, @@ -829,7 +829,7 @@ DefinedOrUnknownSVal MemRegionManager::getStaticSize(const MemRegion *MR, case MemRegion::ObjCStringRegionKind: { QualType Ty = cast<TypedValueRegion>(SR)->getDesugaredValueType(Ctx); if (isa<VariableArrayType>(Ty)) - return nonloc::SymbolVal(SymMgr.getExtentSymbol(SR)); + return nonloc::SymbolVal(SymMgr.get<SymbolExtent>(SR)); if (Ty->isIncompleteType()) return UnknownVal(); @@ -897,7 +897,7 @@ DefinedOrUnknownSVal MemRegionManager::getStaticSize(const MemRegion *MR, case MemRegion::BlockDataRegionKind: case MemRegion::BlockCodeRegionKind: case MemRegion::FunctionCodeRegionKind: - return nonloc::SymbolVal(SymMgr.getExtentSymbol(SR)); + return nonloc::SymbolVal(SymMgr.get<SymbolExtent>(SR)); default: llvm_unreachable("Unhandled region"); } diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index 34b32e1b2225d4..7741a3bbd50083 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -724,7 +724,7 @@ class EvalCastVisitor : public SValVisitor<EvalCastVisitor, SVal> { // because there are no generic region address metadata // symbols to use, only content metadata. return nonloc::SymbolVal( - VB.getSymbolManager().getExtentSymbol(FTR)); + VB.getSymbolManager().get<SymbolExtent>(FTR)); if (const SymbolicRegion *SymR = R->getSymbolicBase()) { SymbolRef Sym = SymR->getSymbol(); diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 7fc237cc8d0c90..221ab58992fd8a 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,20 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymbolExtent* -SymbolManager::getExtentSymbol(const SubRegion *R) { - llvm::FoldingSetNodeID profile; - SymbolExtent::Profile(profile, R); - void *InsertPos; - SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); - if (!SD) { - SD = Alloc.make<SymbolExtent>(R); - DataSet.InsertNode(SD, InsertPos); - } - - return cast<SymbolExtent>(SD); -} - const SymbolMetadata * SymbolManager::getMetadataSymbol(const MemRegion* R, const Stmt *S, QualType T, const LocationContext *LCtx, >From 883a6e3f3f579d605c80de8a701bbafcc990d109 Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 14:56:05 +0100 Subject: [PATCH 05/11] [NFC] Replace getMetadataSymbol with get<SymbolMetadata> --- .../Core/PathSensitive/SymbolManager.h | 12 ++---------- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 16 ---------------- 3 files changed, 3 insertions(+), 27 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 180f25ae74b093..dc48b90099f29e 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -224,6 +224,8 @@ class SymbolMetadata : public SymbolData { const Stmt *S; QualType T; const LocationContext *LCtx; + /// Count can be used to differentiate regions corresponding to + /// different loop iterations, thus, making the symbol path-dependent. unsigned Count; const void *Tag; @@ -543,16 +545,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - /// Creates a metadata symbol associated with a specific region. - /// - /// VisitCount can be used to differentiate regions corresponding to - /// different loop iterations, thus, making the symbol path-dependent. - const SymbolMetadata *getMetadataSymbol(const MemRegion *R, const Stmt *S, - QualType T, - const LocationContext *LCtx, - unsigned VisitCount, - const void *SymbolTag = nullptr); - const SymbolCast* getCastSymbol(const SymExpr *Operand, QualType From, QualType To); diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index 7741a3bbd50083..dbfba049ffca21 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -245,7 +245,7 @@ DefinedSVal SValBuilder::getMetadataSymbolVal(const void *symbolTag, assert(SymbolManager::canSymbolicate(type) && "Invalid metadata symbol type"); SymbolRef sym = - SymMgr.getMetadataSymbol(region, expr, type, LCtx, count, symbolTag); + SymMgr.get<SymbolMetadata>(region, expr, type, LCtx, count, symbolTag); if (Loc::isLocType(type)) return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym)); diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 221ab58992fd8a..94e16831311efb 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,22 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymbolMetadata * -SymbolManager::getMetadataSymbol(const MemRegion* R, const Stmt *S, QualType T, - const LocationContext *LCtx, - unsigned Count, const void *SymbolTag) { - llvm::FoldingSetNodeID profile; - SymbolMetadata::Profile(profile, R, S, T, LCtx, Count, SymbolTag); - void *InsertPos; - SymExpr *SD = DataSet.FindNodeOrInsertPos(profile, InsertPos); - if (!SD) { - SD = Alloc.make<SymbolMetadata>(R, S, T, LCtx, Count, SymbolTag); - DataSet.InsertNode(SD, InsertPos); - } - - return cast<SymbolMetadata>(SD); -} - const SymbolCast* SymbolManager::getCastSymbol(const SymExpr *Op, QualType From, QualType To) { >From dd41465d0138da364ddce0a89fca1d99d12b605a Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 14:59:12 +0100 Subject: [PATCH 06/11] [NFC] Replace getCastSybol with get<SymbolCast> --- .../Core/PathSensitive/SymbolManager.h | 3 --- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 15 --------------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index dc48b90099f29e..6a7182a66773fa 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -545,9 +545,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - const SymbolCast* getCastSymbol(const SymExpr *Operand, - QualType From, QualType To); - const SymIntExpr *getSymIntExpr(const SymExpr *lhs, BinaryOperator::Opcode op, APSIntPtr rhs, QualType t); diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index dbfba049ffca21..c6d2fc6b3e575a 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -111,7 +111,7 @@ nonloc::SymbolVal SValBuilder::makeNonLoc(const SymExpr *operand, assert(!Loc::isLocType(toTy)); if (fromTy == toTy) return nonloc::SymbolVal(operand); - return nonloc::SymbolVal(SymMgr.getCastSymbol(operand, fromTy, toTy)); + return nonloc::SymbolVal(SymMgr.get<SymbolCast>(operand, fromTy, toTy)); } SVal SValBuilder::convertToArrayIndex(SVal val) { diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 94e16831311efb..9bab9aefaf90c3 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,21 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymbolCast* -SymbolManager::getCastSymbol(const SymExpr *Op, - QualType From, QualType To) { - llvm::FoldingSetNodeID ID; - SymbolCast::Profile(ID, Op, From, To); - void *InsertPos; - SymExpr *data = DataSet.FindNodeOrInsertPos(ID, InsertPos); - if (!data) { - data = Alloc.make<SymbolCast>(Op, From, To); - DataSet.InsertNode(data, InsertPos); - } - - return cast<SymbolCast>(data); -} - const SymIntExpr *SymbolManager::getSymIntExpr(const SymExpr *lhs, BinaryOperator::Opcode op, APSIntPtr v, QualType t) { >From 71d05bb4c1845104756fd5eb01190a4229e3610b Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 15:10:09 +0100 Subject: [PATCH 07/11] [NFC] Replace getSymIntExpr with get<SymIntExpr> --- .../Core/PathSensitive/SymbolManager.h | 8 -------- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- .../StaticAnalyzer/Core/SimpleSValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 16 ---------------- 4 files changed, 2 insertions(+), 26 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 6a7182a66773fa..b584a34d7cf0f4 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -545,14 +545,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - const SymIntExpr *getSymIntExpr(const SymExpr *lhs, BinaryOperator::Opcode op, - APSIntPtr rhs, QualType t); - - const SymIntExpr *getSymIntExpr(const SymExpr &lhs, BinaryOperator::Opcode op, - APSIntPtr rhs, QualType t) { - return getSymIntExpr(&lhs, op, rhs, t); - } - const IntSymExpr *getIntSymExpr(APSIntPtr lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t); diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index c6d2fc6b3e575a..eac9b930d2400f 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -79,7 +79,7 @@ nonloc::SymbolVal SValBuilder::makeNonLoc(const SymExpr *lhs, APSIntPtr rhs, QualType type) { assert(lhs); assert(!Loc::isLocType(type)); - return nonloc::SymbolVal(SymMgr.getSymIntExpr(lhs, op, rhs, type)); + return nonloc::SymbolVal(SymMgr.get<SymIntExpr>(lhs, op, rhs, type)); } nonloc::SymbolVal SValBuilder::makeNonLoc(APSIntPtr lhs, diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index 455621739f6935..d77050e61c1898 100644 --- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -351,7 +351,7 @@ static NonLoc doRearrangeUnchecked(ProgramStateRef State, } APSIntPtr PersistentResultInt = BV.getValue(ResultInt); return nonloc::SymbolVal( - SymMgr.getSymIntExpr(ResultSym, ResultOp, PersistentResultInt, ResultTy)); + SymMgr.get<SymIntExpr>(ResultSym, ResultOp, PersistentResultInt, ResultTy)); } // Rearrange if symbol type matches the result type and if the operator is a diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 9bab9aefaf90c3..656cdccd0bc402 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,22 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymIntExpr *SymbolManager::getSymIntExpr(const SymExpr *lhs, - BinaryOperator::Opcode op, - APSIntPtr v, QualType t) { - llvm::FoldingSetNodeID ID; - SymIntExpr::Profile(ID, lhs, op, v, t); - void *InsertPos; - SymExpr *data = DataSet.FindNodeOrInsertPos(ID, InsertPos); - - if (!data) { - data = Alloc.make<SymIntExpr>(lhs, op, v, t); - DataSet.InsertNode(data, InsertPos); - } - - return cast<SymIntExpr>(data); -} - const IntSymExpr *SymbolManager::getIntSymExpr(APSIntPtr lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t) { >From 8dc8cfd0aac39da3592b50987bc5a18de9b99d0d Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 15:13:41 +0100 Subject: [PATCH 08/11] [NFC] Replace getIntSymExpr with get<IntSymExpr> --- .../Core/PathSensitive/SymbolManager.h | 3 --- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 16 ---------------- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index b584a34d7cf0f4..0b77f4163ad052 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -545,9 +545,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - const IntSymExpr *getIntSymExpr(APSIntPtr lhs, BinaryOperator::Opcode op, - const SymExpr *rhs, QualType t); - const SymSymExpr *getSymSymExpr(const SymExpr *lhs, BinaryOperator::Opcode op, const SymExpr *rhs, QualType t); diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index eac9b930d2400f..6b470453e5d9a5 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -87,7 +87,7 @@ nonloc::SymbolVal SValBuilder::makeNonLoc(APSIntPtr lhs, const SymExpr *rhs, QualType type) { assert(rhs); assert(!Loc::isLocType(type)); - return nonloc::SymbolVal(SymMgr.getIntSymExpr(lhs, op, rhs, type)); + return nonloc::SymbolVal(SymMgr.get<IntSymExpr>(lhs, op, rhs, type)); } nonloc::SymbolVal SValBuilder::makeNonLoc(const SymExpr *lhs, diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 656cdccd0bc402..502a41db1d282f 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,22 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const IntSymExpr *SymbolManager::getIntSymExpr(APSIntPtr lhs, - BinaryOperator::Opcode op, - const SymExpr *rhs, QualType t) { - llvm::FoldingSetNodeID ID; - IntSymExpr::Profile(ID, lhs, op, rhs, t); - void *InsertPos; - SymExpr *data = DataSet.FindNodeOrInsertPos(ID, InsertPos); - - if (!data) { - data = Alloc.make<IntSymExpr>(lhs, op, rhs, t); - DataSet.InsertNode(data, InsertPos); - } - - return cast<IntSymExpr>(data); -} - const SymSymExpr *SymbolManager::getSymSymExpr(const SymExpr *lhs, BinaryOperator::Opcode op, const SymExpr *rhs, >From 207ff9b5093b67cb413587988b14f5233abcfeae Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 16:34:47 +0100 Subject: [PATCH 09/11] [NFC] Replace getSymSymExpr with get<SymSymExpr> --- .../Core/PathSensitive/SymbolManager.h | 2 -- .../Core/RangeConstraintManager.cpp | 8 ++++---- .../Core/RangedConstraintManager.cpp | 8 ++++---- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- .../StaticAnalyzer/Core/SimpleSValBuilder.cpp | 6 +++--- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 17 ----------------- 6 files changed, 12 insertions(+), 31 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 0b77f4163ad052..6670287671be29 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -545,8 +545,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - const SymSymExpr *getSymSymExpr(const SymExpr *lhs, BinaryOperator::Opcode op, - const SymExpr *rhs, QualType t); const UnarySymExpr *getUnarySymExpr(const SymExpr *operand, UnaryOperator::Opcode op, QualType t); diff --git a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp index c39fa81109c853..4b67a543db2335 100644 --- a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp @@ -1471,7 +1471,7 @@ class SymbolicRangeInferrer return getRangeForNegatedExpr( [SSE, State = this->State]() -> SymbolRef { if (SSE->getOpcode() == BO_Sub) - return State->getSymbolManager().getSymSymExpr( + return State->getSymbolManager().get<SymSymExpr>( SSE->getRHS(), BO_Sub, SSE->getLHS(), SSE->getType()); return nullptr; }, @@ -1495,7 +1495,7 @@ class SymbolicRangeInferrer if (!IsCommutative) return std::nullopt; - SymbolRef Commuted = State->getSymbolManager().getSymSymExpr( + SymbolRef Commuted = State->getSymbolManager().get<SymSymExpr>( SSE->getRHS(), Op, SSE->getLHS(), SSE->getType()); if (const RangeSet *Range = getConstraint(State, Commuted)) return *Range; @@ -1540,7 +1540,7 @@ class SymbolicRangeInferrer // Let's find an expression e.g. (x < y). BinaryOperatorKind QueriedOP = OperatorRelationsTable::getOpFromIndex(i); - const SymSymExpr *SymSym = SymMgr.getSymSymExpr(LHS, QueriedOP, RHS, T); + const SymSymExpr *SymSym = SymMgr.get<SymSymExpr>(LHS, QueriedOP, RHS, T); const RangeSet *QueriedRangeSet = getConstraint(State, SymSym); // If ranges were not previously found, @@ -1548,7 +1548,7 @@ class SymbolicRangeInferrer if (!QueriedRangeSet) { const BinaryOperatorKind ROP = BinaryOperator::reverseComparisonOp(QueriedOP); - SymSym = SymMgr.getSymSymExpr(RHS, ROP, LHS, T); + SymSym = SymMgr.get<SymSymExpr>(RHS, ROP, LHS, T); QueriedRangeSet = getConstraint(State, SymSym); } diff --git a/clang/lib/StaticAnalyzer/Core/RangedConstraintManager.cpp b/clang/lib/StaticAnalyzer/Core/RangedConstraintManager.cpp index 4bbe933be2129e..4fe80711dbea12 100644 --- a/clang/lib/StaticAnalyzer/Core/RangedConstraintManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RangedConstraintManager.cpp @@ -62,8 +62,8 @@ ProgramStateRef RangedConstraintManager::assumeSym(ProgramStateRef State, SymbolManager &SymMgr = getSymbolManager(); QualType DiffTy = SymMgr.getContext().getPointerDiffType(); - SymbolRef Subtraction = - SymMgr.getSymSymExpr(SSE->getRHS(), BO_Sub, SSE->getLHS(), DiffTy); + SymbolRef Subtraction = SymMgr.get<SymSymExpr>(SSE->getRHS(), BO_Sub, + SSE->getLHS(), DiffTy); const llvm::APSInt &Zero = getBasicVals().getValue(0, DiffTy); Op = BinaryOperator::reverseComparisonOp(Op); @@ -76,8 +76,8 @@ ProgramStateRef RangedConstraintManager::assumeSym(ProgramStateRef State, SymbolManager &SymMgr = getSymbolManager(); QualType ExprType = SSE->getType(); - SymbolRef CanonicalEquality = - SymMgr.getSymSymExpr(SSE->getLHS(), BO_EQ, SSE->getRHS(), ExprType); + SymbolRef CanonicalEquality = SymMgr.get<SymSymExpr>( + SSE->getLHS(), BO_EQ, SSE->getRHS(), ExprType); bool WasEqual = SSE->getOpcode() == BO_EQ; bool IsExpectedEqual = WasEqual == Assumption; diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index 6b470453e5d9a5..7ffe5cabc32c73 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -95,7 +95,7 @@ nonloc::SymbolVal SValBuilder::makeNonLoc(const SymExpr *lhs, const SymExpr *rhs, QualType type) { assert(lhs && rhs); assert(!Loc::isLocType(type)); - return nonloc::SymbolVal(SymMgr.getSymSymExpr(lhs, op, rhs, type)); + return nonloc::SymbolVal(SymMgr.get<SymSymExpr>(lhs, op, rhs, type)); } NonLoc SValBuilder::makeNonLoc(const SymExpr *operand, UnaryOperator::Opcode op, diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index d77050e61c1898..1622d2726a2ead 100644 --- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -328,16 +328,16 @@ static NonLoc doRearrangeUnchecked(ProgramStateRef State, // FIXME: Maybe it'd be better to have consistency in // "$x - $y" vs. "$y - $x" because those are solver's keys. if (LInt > RInt) { - ResultSym = SymMgr.getSymSymExpr(RSym, BO_Sub, LSym, SymTy); + ResultSym = SymMgr.get<SymSymExpr>(RSym, BO_Sub, LSym, SymTy); ResultOp = BinaryOperator::reverseComparisonOp(Op); ResultInt = LInt - RInt; // Opposite order! } else { - ResultSym = SymMgr.getSymSymExpr(LSym, BO_Sub, RSym, SymTy); + ResultSym = SymMgr.get<SymSymExpr>(LSym, BO_Sub, RSym, SymTy); ResultOp = Op; ResultInt = RInt - LInt; // Opposite order! } } else { - ResultSym = SymMgr.getSymSymExpr(LSym, Op, RSym, SymTy); + ResultSym = SymMgr.get<SymSymExpr>(LSym, Op, RSym, SymTy); ResultInt = (Op == BO_Add) ? (LInt + RInt) : (LInt - RInt); ResultOp = BO_Add; // Bring back the cosmetic difference. diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index 502a41db1d282f..cff6792734477b 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,23 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const SymSymExpr *SymbolManager::getSymSymExpr(const SymExpr *lhs, - BinaryOperator::Opcode op, - const SymExpr *rhs, - QualType t) { - llvm::FoldingSetNodeID ID; - SymSymExpr::Profile(ID, lhs, op, rhs, t); - void *InsertPos; - SymExpr *data = DataSet.FindNodeOrInsertPos(ID, InsertPos); - - if (!data) { - data = Alloc.make<SymSymExpr>(lhs, op, rhs, t); - DataSet.InsertNode(data, InsertPos); - } - - return cast<SymSymExpr>(data); -} - const UnarySymExpr *SymbolManager::getUnarySymExpr(const SymExpr *Operand, UnaryOperator::Opcode Opc, QualType T) { >From 824649120ac51ac75ad22a7276f7380f801e6db6 Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 16:36:06 +0100 Subject: [PATCH 10/11] [NFC] Replace getUnarySymExpr with get<UnarySymExpr> --- .../Core/PathSensitive/SymbolManager.h | 4 ---- .../Core/RangeConstraintManager.cpp | 4 ++-- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp | 2 +- clang/lib/StaticAnalyzer/Core/SymbolManager.cpp | 15 --------------- 4 files changed, 3 insertions(+), 22 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index 6670287671be29..e83164c9b42618 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -545,10 +545,6 @@ class SymbolManager { return conjureSymbol(E, LCtx, E->getType(), VisitCount, SymbolTag); } - - const UnarySymExpr *getUnarySymExpr(const SymExpr *operand, - UnaryOperator::Opcode op, QualType t); - QualType getType(const SymExpr *SE) const { return SE->getType(); } diff --git a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp index 4b67a543db2335..2b85421036326e 100644 --- a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp @@ -1481,8 +1481,8 @@ class SymbolicRangeInferrer std::optional<RangeSet> getRangeForNegatedSym(SymbolRef Sym) { return getRangeForNegatedExpr( [Sym, State = this->State]() { - return State->getSymbolManager().getUnarySymExpr(Sym, UO_Minus, - Sym->getType()); + return State->getSymbolManager().get<UnarySymExpr>(Sym, UO_Minus, + Sym->getType()); }, Sym->getType()); } diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index 7ffe5cabc32c73..e65c4b2e3bb9d0 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -102,7 +102,7 @@ NonLoc SValBuilder::makeNonLoc(const SymExpr *operand, UnaryOperator::Opcode op, QualType type) { assert(operand); assert(!Loc::isLocType(type)); - return nonloc::SymbolVal(SymMgr.getUnarySymExpr(operand, op, type)); + return nonloc::SymbolVal(SymMgr.get<UnarySymExpr>(operand, op, type)); } nonloc::SymbolVal SValBuilder::makeNonLoc(const SymExpr *operand, diff --git a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp index cff6792734477b..a4648f5922ef11 100644 --- a/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/SymbolManager.cpp @@ -163,21 +163,6 @@ void SymExpr::symbol_iterator::expand() { llvm_unreachable("unhandled expansion case"); } -const UnarySymExpr *SymbolManager::getUnarySymExpr(const SymExpr *Operand, - UnaryOperator::Opcode Opc, - QualType T) { - llvm::FoldingSetNodeID ID; - UnarySymExpr::Profile(ID, Operand, Opc, T); - void *InsertPos; - SymExpr *data = DataSet.FindNodeOrInsertPos(ID, InsertPos); - if (!data) { - data = Alloc.make<UnarySymExpr>(Operand, Opc, T); - DataSet.InsertNode(data, InsertPos); - } - - return cast<UnarySymExpr>(data); -} - QualType SymbolConjured::getType() const { return T; } >From 3ed3a3434ba65ab61690c4823dbdafb0be50598f Mon Sep 17 00:00:00 2001 From: Arseniy Zaostrovnykh <necto...@gmail.com> Date: Mon, 6 Jan 2025 16:57:31 +0100 Subject: [PATCH 11/11] [NFC] fix formatting --- .../StaticAnalyzer/Core/PathSensitive/SymbolManager.h | 8 +++----- clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h index e83164c9b42618..a96b2fd85fff0b 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h @@ -527,12 +527,10 @@ class SymbolManager { static bool canSymbolicate(QualType T); - template <typename T, typename... Args> - const T *get(Args &&...args); + template <typename T, typename... Args> const T *get(Args &&...args); - const SymbolConjured* conjureSymbol(const Stmt *E, - const LocationContext *LCtx, - QualType T, + const SymbolConjured *conjureSymbol(const Stmt *E, + const LocationContext *LCtx, QualType T, unsigned VisitCount, const void *SymbolTag = nullptr) { return get<SymbolConjured>(E, LCtx, T, VisitCount, SymbolTag); diff --git a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index 1622d2726a2ead..9c6222e8822f90 100644 --- a/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -350,8 +350,8 @@ static NonLoc doRearrangeUnchecked(ProgramStateRef State, } } APSIntPtr PersistentResultInt = BV.getValue(ResultInt); - return nonloc::SymbolVal( - SymMgr.get<SymIntExpr>(ResultSym, ResultOp, PersistentResultInt, ResultTy)); + return nonloc::SymbolVal(SymMgr.get<SymIntExpr>( + ResultSym, ResultOp, PersistentResultInt, ResultTy)); } // Rearrange if symbol type matches the result type and if the operator is a _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits