| 55 | } |
| 56 | |
| 57 | std::vector<Expr *> getArgExprs(Expr &E) { |
| 58 | std::vector<Expr *> Args; |
| 59 | if (auto *CE = dyn_cast<CallExpr>(&E)) { |
| 60 | for (size_t S = 0, E = CE->getNumArgs(); S < E; ++S) |
| 61 | Args.push_back(CE->getArg(S)); |
| 62 | } else if (auto *CMCE = dyn_cast<CXXMemberCallExpr>(&E)) { |
| 63 | for (size_t S = 0, E = CMCE->getNumArgs(); S < E; ++S) |
| 64 | Args.push_back(CMCE->getArg(S)); |
| 65 | } else if (auto *CCE = dyn_cast<CXXConstructExpr>(&E)) { |
| 66 | for (size_t S = 0, E = CCE->getNumArgs(); S < E; ++S) |
| 67 | Args.push_back(CCE->getArg(S)); |
| 68 | } else if (auto *CNE = dyn_cast<CXXNewExpr>(&E)) { |
| 69 | for (auto S = CNE->raw_arg_begin(), E = CNE->raw_arg_end(); S != E; ++S) { |
| 70 | assert(S && "Unexpected Program State"); |
| 71 | assert(isa<Expr>(*S) && "Unexpected Program State"); |
| 72 | Args.push_back(dyn_cast<Expr>(*S)); |
| 73 | } |
| 74 | |
| 75 | if (Args.size() > 0 && isa<CXXConstructExpr>(Args.back())) |
| 76 | Args.pop_back(); |
| 77 | } else if (auto *CDE = dyn_cast<CXXDeleteExpr>(&E)) { |
| 78 | Args.push_back(CDE->getArgument()); |
| 79 | } else |
| 80 | throw std::invalid_argument(""); |
| 81 | |
| 82 | return Args; |
| 83 | } |
| 84 | |
| 85 | clang::SourceLocation getDebugLoc(const clang::Stmt &S) { |
| 86 | if (const auto *E = dyn_cast<CXXOperatorCallExpr>(&S)) |