[PATCH] D99517: Implemented [[clang::musttail]] attribute for guaranteed tail calls.
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 9 05:55:15 PDT 2021
aaron.ballman added a comment.
Mostly just nits from me, but the attribute portions look good to me.
================
Comment at: clang/include/clang/AST/IgnoreExpr.h:127
+ if (CCE && CCE->isElidable() && !isa<CXXTemporaryObjectExpr>(CCE)) {
+ auto NumArgs = CCE->getNumArgs();
+ if ((NumArgs == 1 ||
----------------
================
Comment at: clang/lib/Sema/SemaStmt.cpp:628
+
+ const CallExpr *CE =
+ dyn_cast_or_null<CallExpr>(IgnoreParenImplicitAsWritten(Ex));
----------------
================
Comment at: clang/lib/Sema/SemaStmt.cpp:636-637
+
+ if (!CE->getCalleeDecl()) {
+ assert(hasUncompilableErrorOccurred() && "expected previous error");
+ return false;
----------------
This worries me slightly -- not all `CallExpr` objects have a callee declaration (https://github.com/llvm/llvm-project/blob/main/clang/lib/AST/Expr.cpp#L1367). That said, I'm struggling to come up with an example that isn't covered so this may be fine.
================
Comment at: clang/lib/Sema/SemaStmt.cpp:641
+
+ if (const ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(Ex)) {
+ if (EWC->cleanupsHaveSideEffects()) {
----------------
================
Comment at: clang/lib/Sema/SemaStmt.cpp:655
+
+ const FunctionDecl *CallerDecl = dyn_cast<FunctionDecl>(CurContext);
+
----------------
================
Comment at: clang/lib/Sema/SemaStmt.cpp:659
+ bool IsCallee) -> bool {
+ if (isa<CXXConstructorDecl>(CMD) || isa<CXXDestructorDecl>(CMD)) {
+ Diag(St->getBeginLoc(), diag::err_musttail_structors_forbidden) << &MTA;
----------------
================
Comment at: clang/lib/Sema/SemaStmt.cpp:682
+ return false;
+ } else if (const CXXMethodDecl *CMD = dyn_cast<CXXMethodDecl>(CurContext)) {
+ // Caller is a class/struct method.
----------------
================
Comment at: clang/lib/Sema/SemaStmt.cpp:700
+ // Call is: obj->*method_ptr or obj.*method_ptr
+ const MemberPointerType *MPT = VD->getType()->castAs<MemberPointerType>();
+ CalleeType.This = QualType(MPT->getClass(), 0);
----------------
It'd be better not to go through the cast machinery twice -- you cast to the `MemberPointerType` and then cast to the same thing again (but in a different way).
================
Comment at: clang/lib/Sema/SemaStmtAttr.cpp:214
+ SourceRange Range) {
+ MustTailAttr MTA(S.Context, A);
+
----------------
This can be removed entirely.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99517/new/
https://reviews.llvm.org/D99517
More information about the cfe-commits
mailing list