|
@@ -6568,33 +6568,19 @@ static bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee) {
|
|
|
if (auto *Conv = dyn_cast_or_null<CXXConversionDecl>(Callee))
|
|
|
if (isRecordWithAttr<PointerAttr>(Conv->getConversionType()))
|
|
|
return true;
|
|
|
- if (!Callee->getParent()->isInStdNamespace())
|
|
|
+ if (!Callee->getParent()->isInStdNamespace() || !Callee->getIdentifier())
|
|
|
return false;
|
|
|
if (!isRecordWithAttr<PointerAttr>(Callee->getThisObjectType()) &&
|
|
|
!isRecordWithAttr<OwnerAttr>(Callee->getThisObjectType()))
|
|
|
return false;
|
|
|
- if (Callee->getReturnType()->isPointerType() ||
|
|
|
- isRecordWithAttr<PointerAttr>(Callee->getReturnType())) {
|
|
|
- if (!Callee->getIdentifier())
|
|
|
- return false;
|
|
|
- return llvm::StringSwitch<bool>(Callee->getName())
|
|
|
- .Cases("begin", "rbegin", "cbegin", "crbegin", true)
|
|
|
- .Cases("end", "rend", "cend", "crend", true)
|
|
|
- .Cases("c_str", "data", "get", true)
|
|
|
- // Map and set types.
|
|
|
- .Cases("find", "equal_range", "lower_bound", "upper_bound", true)
|
|
|
- .Default(false);
|
|
|
- } else if (Callee->getReturnType()->isReferenceType()) {
|
|
|
- if (!Callee->getIdentifier()) {
|
|
|
- auto OO = Callee->getOverloadedOperator();
|
|
|
- return OO == OverloadedOperatorKind::OO_Subscript ||
|
|
|
- OO == OverloadedOperatorKind::OO_Star;
|
|
|
- }
|
|
|
- return llvm::StringSwitch<bool>(Callee->getName())
|
|
|
- .Cases("front", "back", "at", true)
|
|
|
- .Default(false);
|
|
|
- }
|
|
|
- return false;
|
|
|
+ if (!isRecordWithAttr<PointerAttr>(Callee->getReturnType()) &&
|
|
|
+ !Callee->getReturnType()->isPointerType())
|
|
|
+ return false;
|
|
|
+ return llvm::StringSwitch<bool>(Callee->getName())
|
|
|
+ .Cases("begin", "rbegin", "cbegin", "crbegin", true)
|
|
|
+ .Cases("end", "rend", "cend", "crend", true)
|
|
|
+ .Cases("c_str", "data", "get", true)
|
|
|
+ .Default(false);
|
|
|
}
|
|
|
|
|
|
static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call,
|
|
@@ -6614,12 +6600,6 @@ static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call,
|
|
|
if (MD && shouldTrackImplicitObjectArg(MD))
|
|
|
VisitPointerArg(MD, MCE->getImplicitObjectArgument());
|
|
|
return;
|
|
|
- } else if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(Call)) {
|
|
|
- FunctionDecl *Callee = OCE->getDirectCallee();
|
|
|
- if (Callee->isCXXInstanceMember() &&
|
|
|
- shouldTrackImplicitObjectArg(cast<CXXMethodDecl>(Callee)))
|
|
|
- VisitPointerArg(Callee, OCE->getArg(0));
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
if (auto *CCE = dyn_cast<CXXConstructExpr>(Call)) {
|