[PATCH] D43248: [Attr] Fix parameter indexing for attributes
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 1 11:09:22 PST 2018
aaron.ballman added inline comments.
================
Comment at: include/clang/AST/Attr.h:206
+
+ void cmpable(const ParamIdx &I) const {
+ assert(isValid() && I.isValid() &&
----------------
The name here can be improved. How about `checkInvariants()`? Might as well make this inline while you're at it.
================
Comment at: include/clang/AST/Attr.h:236
+ /// parameter.
+ ParamIdx(unsigned Idx, bool HasThis)
+ : Idx(Idx), HasThis(HasThis), IsValid(true) {}
----------------
Is this constructor used anywhere? I didn't see it being used, but I could have missed something. If it's not used, go ahead and remove it.
================
Comment at: include/clang/AST/Attr.h:267
+ assert(isValid() && "ParamIdx must be valid");
+ return Idx - 1 - HasThis;
+ }
----------------
Please assert that `Idx` won't wrap before doing the return.
================
Comment at: include/clang/AST/Attr.h:276
+ assert(isValid() && "ParamIdx must be valid");
+ return Idx - 1;
+ }
----------------
Likewise here.
================
Comment at: include/clang/AST/Attr.h:281-284
+ bool operator<(const ParamIdx &I) const { cmpable(I); return Idx < I.Idx; }
+ bool operator>(const ParamIdx &I) const { cmpable(I); return Idx > I.Idx; }
+ bool operator<=(const ParamIdx &I) const { cmpable(I); return Idx <= I.Idx; }
+ bool operator>=(const ParamIdx &I) const { cmpable(I); return Idx >= I.Idx; }
----------------
Are all of these operations required for the class?
================
Comment at: include/clang/Basic/Attr.td:172-174
+ // Whether the C++ implicit this parameter is allowed. Users that construct
+ // attributes from the source code use this information when validating
+ // parameter indices.
----------------
I still find the `AllowThis` parts to be hard to follow, so I want to be sure I understand your design properly. Everything that uses this new argument type sets `AllowsThis` to 0. As written, it sounds like setting that to 0 means that the parameter index cannot be used on a C++ instance method, and I know that's not the correct interpretation. Under what circumstances would this be set to 1 instead?
Looking at the existing code, the only circumstances under which `checkFunctionOrMethodParameterIndex()` was being passed `true` for "allow this" was for XRayLogArgs, which doesn't even use `ParamIdx`. Perhaps this member isn't necessary any longer?
================
Comment at: lib/Sema/SemaChecking.cpp:2622
- for (unsigned Val : NonNull->args()) {
- if (Val >= Args.size())
+ for (ParamIdx Idx : NonNull->args()) {
+ if (Idx.getASTIndex() >= Args.size())
----------------
`const ParamIdx &`
================
Comment at: lib/Sema/SemaChecking.cpp:10083
- for (unsigned ArgNo : NonNull->args()) {
- if (ArgNo == ParamNo) {
+ for (ParamIdx ArgNo : NonNull->args()) {
+ if (ArgNo.getASTIndex() == ParamNo) {
----------------
`const ParamIdx &`
================
Comment at: lib/Sema/SemaChecking.cpp:12244
}
- const Expr *TypeTagExpr = ExprArgs[Attr->getTypeTagIdx()];
+ const Expr *TypeTagExpr = ExprArgs[Attr->typeTagIdx().getASTIndex()];
bool FoundWrongKind;
----------------
Hoist the AST index so you don't have to call for it twice. (Same applies elsewhere.)
================
Comment at: lib/Sema/SemaDeclAttr.cpp:785-786
- const ParmVarDecl *Param = FD->getParamDecl(Idx);
- if (AllowDependentType && Param->getType()->isDependentType())
- return true;
if (!Param->getType()->isIntegerType() && !Param->getType()->isCharType()) {
----------------
Good catch about this not being needed any longer!
================
Comment at: lib/Sema/SemaDeclAttr.cpp:1650-1651
OwnershipAttr(AL.getLoc(), S.Context, nullptr, nullptr, 0,
- AL.getAttributeSpellingListIndex()).getOwnKind();
+ AL.getAttributeSpellingListIndex())
+ .getOwnKind();
----------------
This change looks to be unrelated to the patch?
================
Comment at: lib/Sema/SemaDeclAttr.cpp:4549-4551
+ if (ArgumentIdx.getASTIndex() >= getFunctionOrMethodNumParams(D) ||
+ !getFunctionOrMethodParamType(D, ArgumentIdx.getASTIndex())
+ ->isPointerType())
----------------
Is this formatting produced by clang-format?
================
Comment at: lib/StaticAnalyzer/Checkers/NonNullParamChecker.cpp:61
}
- for (unsigned Val : NonNull->args()) {
- if (Val >= NumArgs)
+ for (ParamIdx Idx : NonNull->args()) {
+ if (Idx.getASTIndex() >= NumArgs)
----------------
`const ParamIdx &`
https://reviews.llvm.org/D43248
More information about the cfe-commits
mailing list