[PATCH] D43248: [Attr] Fix parameter indexing for attributes
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 25 13:00:48 PST 2018
aaron.ballman added a comment.
(Review is incomplete, but here are some initial comments.)
================
Comment at: include/clang/AST/Attr.h:210-212
+ unsigned Idx;
+ bool HasThis;
+ bool IsValid;
----------------
I think it might be best to mash these together using bit-fields:
```
unsigned Idx : 30;
unsigned HasThis : 1;
unsigned IsValid : 1;
```
================
Comment at: include/clang/AST/Attr.h:218
+ ParamIdx() : Idx(0), HasThis(false), IsValid(false) {}
+ /// \param Idx is the parameter index as it is normally specified in
+ /// attributes in the source: one-origin including any C++ implicit this
----------------
Add some newlines between the various declarations in the class -- everything is condensed a bit too much without it.
================
Comment at: include/clang/AST/Attr.h:225
+ ParamIdx(unsigned Idx, const Decl *D) : Idx(Idx), IsValid(true) {
+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
+ HasThis = FD->isCXXInstanceMember();
----------------
`const auto *`
================
Comment at: include/clang/AST/Attr.h:227-228
+ HasThis = FD->isCXXInstanceMember();
+ else
+ HasThis = false;
+ }
----------------
Might as well move this into the member initializer.
================
Comment at: include/clang/AST/Attr.h:238-243
+ ParamIdx &operator=(const ParamIdx &I) {
+ Idx = I.Idx;
+ HasThis = I.HasThis;
+ IsValid = I.IsValid;
+ return *this;
+ }
----------------
Is this necessary? There should be an implicit copy assignment operator for this class, and it's a bit strange to have a copy assignment but no copy constructor.
================
Comment at: include/clang/AST/Attr.h:264
+ /// constructing new attributes from a source-like specification.
+ unsigned atSrc() const {
+ assert(isValid() && "ParamIdx must be valid");
----------------
I'd prefer more clear names, like "getSourceIndex()" and "getASTIndex()".
================
Comment at: include/clang/AST/Attr.h:282
+ /// This is the encoding primarily used in CodeGen.
+ unsigned atLLVM() const {
+ assert(isValid() && "ParamIdx must be valid");
----------------
Perhaps `getLLVMIndex()` for this one.
================
Comment at: include/clang/AST/Attr.h:291-292
+template <typename DerivedT, typename ValueT>
+class ParamIdxItrBase : public std::iterator<std::input_iterator_tag, ValueT,
+ ptrdiff_t, ValueT *, ValueT &> {
+ DerivedT &der() { return *static_cast<DerivedT *>(this); }
----------------
`std::iterator` was deprecated in C++17, so you should manually expose these fields.
https://reviews.llvm.org/D43248
More information about the cfe-commits
mailing list