44 Expected<EntityPointerLevelSet>> {
56 "attempt to translate %s to EntityPointerLevels",
57 E->getStmtClassName());
58 return EntityPointerLevelSet{};
62 createEntityPointerLevelFor(
const NamedDecl *ND) {
63 std::optional<EntityId> Id = Extractor.
addEntity(ND);
65 return makeErrAtNode(Ctx, ND,
"failed to create EntityId for %s",
67 return EntityPointerLevel{buildEntityPointerLevel(*Id, 1)};
70 Expected<EntityPointerLevel>
71 createEntityPointerLevelForReturn(
const FunctionDecl *FD) {
72 std::optional<EntityId> Id = Extractor.addEntityForReturn(FD);
74 return makeErrAtNode(Ctx, FD,
"failed to create EntityId for function %s",
77 return EntityPointerLevel{buildEntityPointerLevel(*Id, 1)};
82 Expected<EntityPointerLevelSet> translateDereferencePointer(
const Expr *Ptr) {
85 Expected<EntityPointerLevelSet> SubResult =
Visit(Ptr);
87 return SubResult.takeError();
90 return EntityPointerLevelSet{Incremented.begin(), Incremented.end()};
93 TUSummaryExtractor &Extractor;
98 : Extractor(Extractor), Ctx(Ctx) {}
103 return createEntityPointerLevelFor(D);
105 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
106 return createEntityPointerLevelForReturn(FD);
108 return makeErrAtNode(Ctx, D,
"attempt to get entity for return of %s",
113 return EntityPointerLevel({E.getEntity(), E.getPointerLevel() + 1});
117 assert(E.getPointerLevel() > 0);
118 return EntityPointerLevel({E.getEntity(), E.getPointerLevel() - 1});
138 case clang::BO_AddAssign:
139 case clang::BO_SubAssign:
140 case clang::BO_Assign:
142 case clang::BO_Comma:
155 Expected<EntityPointerLevelSet> VisitUnaryOperator(
const UnaryOperator *E) {
157 case clang::UO_PostInc:
158 case clang::UO_PostDec:
159 case clang::UO_PreInc:
160 case clang::UO_PreDec:
162 case clang::UO_AddrOf: {
165 return SubResult.takeError();
168 return EntityPointerLevelSet{Decremented.begin(), Decremented.end()};
170 case clang::UO_Deref:
171 return translateDereferencePointer(E->
getSubExpr());
181 Expected<EntityPointerLevelSet> VisitCastExpr(
const CastExpr *E) {
184 return EntityPointerLevelSet{};
189 Expected<EntityPointerLevelSet> VisitCallExpr(
const CallExpr *E) {
191 if (
auto ReturnId = Extractor.addEntityForReturn(FD))
192 return EntityPointerLevelSet{buildEntityPointerLevel(*ReturnId, 1)};
194 return EntityPointerLevelSet{};
198 Expected<EntityPointerLevelSet>
199 VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
200 return translateDereferencePointer(E->
getBase());
204 Expected<EntityPointerLevelSet>
205 VisitAbstractConditionalOperator(
const AbstractConditionalOperator *E) {
210 ReT->insert(ReF->begin(), ReF->end());
214 return llvm::joinErrors(ReT.takeError(), ReF.takeError());
216 return ReF.takeError();
217 return ReT.takeError();
220 Expected<EntityPointerLevelSet> VisitParenExpr(
const ParenExpr *E) {
225 Expected<EntityPointerLevelSet> VisitStringLiteral(
const StringLiteral *E) {
226 return EntityPointerLevelSet{};
230 Expected<EntityPointerLevelSet> VisitPredefinedExpr(
const PredefinedExpr *E) {
231 return EntityPointerLevelSet{};
235 Expected<EntityPointerLevelSet> VisitIntegerLiteral(
const IntegerLiteral *E) {
236 return EntityPointerLevelSet{};
240 Expected<EntityPointerLevelSet> VisitDeclRefExpr(
const DeclRefExpr *E) {
241 auto Res = createEntityPointerLevelFor(E->
getDecl());
243 return Res.takeError();
244 return EntityPointerLevelSet{*Res};
248 Expected<EntityPointerLevelSet> VisitMemberExpr(
const MemberExpr *E) {
251 return Res.takeError();
252 return EntityPointerLevelSet{*Res};
256 Expected<EntityPointerLevelSet>
257 VisitCXXDefaultArgExpr(
const CXXDefaultArgExpr *E) {
262 Expected<EntityPointerLevelSet>
263 VisitOpaqueValueExpr(
const OpaqueValueExpr *S) {
268 Expected<EntityPointerLevelSet>
269 VisitExprWithCleanups(
const ExprWithCleanups *S) {
274 Expected<EntityPointerLevelSet>
275 VisitMaterializeTemporaryExpr(
const MaterializeTemporaryExpr *S) {
280 Expected<EntityPointerLevelSet>
281 VisitCXXDefaultInitExpr(
const CXXDefaultInitExpr *E) {
286 Expected<EntityPointerLevelSet>
287 VisitCXXNullPtrLiteralExpr(
const CXXNullPtrLiteralExpr *S) {
288 return EntityPointerLevelSet{};
292 Expected<EntityPointerLevelSet> VisitCXXThisExpr(
const CXXThisExpr *S) {
293 return EntityPointerLevelSet{};
297 Expected<EntityPointerLevelSet> VisitCXXNewExpr(
const CXXNewExpr *S) {
298 return EntityPointerLevelSet{};
304 Expected<EntityPointerLevelSet>
305 VisitImplicitValueInitExpr(
const ImplicitValueInitExpr *S) {
306 return EntityPointerLevelSet{};
311 Expected<EntityPointerLevelSet> VisitInitListExpr(
const InitListExpr *E) {
313 return EntityPointerLevelSet{};
316 return llvm::createStringError(
317 "Cannot translate an InitListExpr to EntityPointerLevels if it is not "
318 "an empty or singleton list that initializes a pointer scalar");
326 Expected<EntityPointerLevelSet>
327 VisitCXXConstructExpr(
const CXXConstructExpr *E) {
329 return EntityPointerLevelSet{};
335 Expected<EntityPointerLevelSet>
336 VisitCXXScalarValueInitExpr(
const CXXScalarValueInitExpr *E) {
337 return EntityPointerLevelSet{};
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...