Lines Matching defs:S
42 const Environment *StmtToEnvMap::getEnvironment(const Stmt &S) const {
43 auto BlockIt = ACFG.getStmtToBlock().find(&ignoreCFGOmittedNodes(S));
143 void VisitBinaryOperator(const BinaryOperator *S) {
144 const Expr *LHS = S->getLHS();
147 const Expr *RHS = S->getRHS();
154 if (S->isCompoundAssignmentOp())
155 propagateStorageLocation(*S->getLHS(), *S, Env);
157 switch (S->getOpcode()) {
171 Env.setStorageLocation(*S, *LHSLoc);
179 if (S->getOpcode() == BO_LAnd)
180 Env.setValue(*S, Env.makeAnd(LHSVal, RHSVal));
182 Env.setValue(*S, Env.makeOr(LHSVal, RHSVal));
188 Env.setValue(*S, S->getOpcode() == BO_EQ ? LHSEqRHSValue
193 propagateValueOrStorageLocation(*RHS, *S, Env);
201 void VisitDeclRefExpr(const DeclRefExpr *S) {
202 const ValueDecl *VD = S->getDecl();
214 if (!S->isGLValue())
221 Env.setStorageLocation(*S, *DeclLoc);
224 void VisitDeclStmt(const DeclStmt *S) {
227 const auto &D = *cast<VarDecl>(S->getSingleDecl());
285 void VisitImplicitCastExpr(const ImplicitCastExpr *S) {
286 const Expr *SubExpr = S->getSubExpr();
289 switch (S->getCastKind()) {
296 Env.setValue(*S, *SubExprVal);
300 Env.setValue(*S, Env.makeAtomicBoolValue());
311 Env.setValue(*S, *SubExprVal);
330 propagateValueOrStorageLocation(*SubExpr, *S, Env);
335 Env.getOrCreateNullPointerValue(S->getType()->getPointeeType());
336 Env.setValue(*S, NullPointerVal);
348 Env.setValue(*S, Env.create<PointerValue>(*PointeeLoc));
362 void VisitUnaryOperator(const UnaryOperator *S) {
363 const Expr *SubExpr = S->getSubExpr();
366 switch (S->getOpcode()) {
372 Env.setStorageLocation(*S, SubExprVal->getPointeeLoc());
377 if (S->getType()->isMemberPointerType())
381 Env.setValue(*S, Env.create<PointerValue>(*PointeeLoc));
389 Env.setValue(*S, Env.makeNot(*SubExprVal));
398 propagateStorageLocation(*S->getSubExpr(), *S, Env);
399 if (StorageLocation *Loc = Env.getStorageLocation(*S->getSubExpr()))
407 propagateValue(*S->getSubExpr(), *S, Env);
408 if (StorageLocation *Loc = Env.getStorageLocation(*S->getSubExpr()))
416 void VisitCXXThisExpr(const CXXThisExpr *S) {
423 Env.setValue(*S, Env.create<PointerValue>(*ThisPointeeLoc));
426 void VisitCXXNewExpr(const CXXNewExpr *S) {
427 if (Value *Val = Env.createValue(S->getType()))
428 Env.setValue(*S, *Val);
431 void VisitCXXDeleteExpr(const CXXDeleteExpr *S) {
438 void VisitReturnStmt(const ReturnStmt *S) {
442 auto *Ret = S->getRetValue();
466 void VisitMemberExpr(const MemberExpr *S) {
467 ValueDecl *Member = S->getMemberDecl();
484 Env.setStorageLocation(*S, *VarDeclLoc);
489 RecordStorageLocation *BaseLoc = getBaseObjectLocation(*S, Env);
496 Env.setStorageLocation(*S, *MemberLoc);
499 void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *S) {
500 const Expr *ArgExpr = S->getExpr();
502 propagateValueOrStorageLocation(*ArgExpr, *S, Env);
504 if (S->isPRValue() && S->getType()->isRecordType()) {
505 auto &Loc = Env.getResultObjectLocation(*S);
510 void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *S) {
511 const Expr *InitExpr = S->getExpr();
517 if (S->getType()->isRecordType() && S->isPRValue())
520 propagateValueOrStorageLocation(*InitExpr, *S, Env);
523 void VisitCXXConstructExpr(const CXXConstructExpr *S) {
524 const CXXConstructorDecl *ConstructorDecl = S->getConstructor();
530 if (!S->getType()->isRecordType()) {
531 transferInlineCall(S, ConstructorDecl);
535 RecordStorageLocation &Loc = Env.getResultObjectLocation(*S);
540 assert(S->getNumArgs() != 0);
542 const Expr *Arg = S->getArg(0);
556 Env.initializeFieldsWithValues(Loc, S->getType());
558 transferInlineCall(S, ConstructorDecl);
561 void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *S) {
562 if (S->getOperator() == OO_Equal) {
563 assert(S->getNumArgs() == 2);
565 const Expr *Arg0 = S->getArg(0);
568 const Expr *Arg1 = S->getArg(1);
573 dyn_cast_or_null<CXXMethodDecl>(S->getDirectCallee());
596 if (S->getType().getCanonicalType().getUnqualifiedType() !=
598 auto ReturnDecl = S->getType()->getAsCXXRecordDecl();
606 if (S->isGLValue())
607 Env.setStorageLocation(*S, *LocDst);
609 copyRecord(*LocDst, Env.getResultObjectLocation(*S), Env);
616 VisitCallExpr(S);
623 void VisitCallExpr(const CallExpr *S) {
627 if (S->isCallToStdMove()) {
628 assert(S->getNumArgs() == 1);
630 const Expr *Arg = S->getArg(0);
637 Env.setStorageLocation(*S, *ArgLoc);
638 } else if (S->getDirectCallee() != nullptr &&
639 S->getDirectCallee()->getBuiltinID() ==
641 assert(S->getNumArgs() > 0);
642 assert(S->getArg(0) != nullptr);
643 auto *ArgVal = Env.getValue(*S->getArg(0));
646 Env.setValue(*S, *ArgVal);
647 } else if (const FunctionDecl *F = S->getDirectCallee()) {
648 transferInlineCall(S, F);
652 if (S->getType()->isRecordType() && S->isPRValue()) {
653 RecordStorageLocation &Loc = Env.getResultObjectLocation(*S);
659 void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *S) {
660 const Expr *SubExpr = S->getSubExpr();
663 StorageLocation &Loc = Env.createStorageLocation(*S);
664 Env.setStorageLocation(*S, Loc);
675 void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *S) {
676 const Expr *SubExpr = S->getSubExpr();
679 propagateValue(*SubExpr, *S, Env);
682 void VisitCXXStaticCastExpr(const CXXStaticCastExpr *S) {
683 if (S->getCastKind() == CK_NoOp) {
684 const Expr *SubExpr = S->getSubExpr();
687 propagateValueOrStorageLocation(*SubExpr, *S, Env);
691 void VisitConditionalOperator(const ConditionalOperator *S) {
692 const Environment *TrueEnv = StmtToEnv.getEnvironment(*S->getTrueExpr());
693 const Environment *FalseEnv = StmtToEnv.getEnvironment(*S->getFalseExpr());
703 if (S->isGLValue()) {
704 StorageLocation *TrueLoc = TrueEnv->getStorageLocation(*S->getTrueExpr());
706 FalseEnv->getStorageLocation(*S->getFalseExpr());
708 Env.setStorageLocation(*S, *TrueLoc);
709 } else if (!S->getType()->isRecordType()) {
726 S->getType(), TrueEnv->getValue(*S->getTrueExpr()), *TrueEnv,
727 FalseEnv->getValue(*S->getFalseExpr()), *FalseEnv, Env, Model))
728 Env.setValue(*S, *Val);
732 void VisitInitListExpr(const InitListExpr *S) {
733 QualType Type = S->getType();
738 if (!Type->isArrayType() && S->getNumInits() == 1)
739 propagateValueOrStorageLocation(*S->getInit(0), *S, Env);
744 if (S->isSemanticForm() && S->isTransparent())
747 RecordStorageLocation &Loc = Env.getResultObjectLocation(*S);
754 RecordInitListHelper InitListHelper(S);
794 void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *S) {
795 Env.setValue(*S, Env.getBoolLiteralValue(S->getValue()));
798 void VisitIntegerLiteral(const IntegerLiteral *S) {
799 Env.setValue(*S, Env.getIntLiteralValue(S->getValue()));
802 void VisitParenExpr(const ParenExpr *S) {
806 auto *SubExpr = S->getSubExpr();
811 void VisitExprWithCleanups(const ExprWithCleanups *S) {
815 auto *SubExpr = S->getSubExpr();
847 // `F` of `S`. The type `E` must be either `CallExpr` or `CXXConstructExpr`.
849 void transferInlineCall(const E *S, const FunctionDecl *F) {
861 // holding `S` itself.
865 auto CalleeEnv = Env.pushCall(S);
881 Env.popCall(S, ExitState->Env);
891 void transfer(const StmtToEnvMap &StmtToEnv, const Stmt &S, Environment &Env,
893 TransferVisitor(StmtToEnv, Env, Model).Visit(&S);