[PATCH] D63954: Add lifetime categories attributes
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 1 07:08:25 PDT 2019
aaron.ballman added a comment.
In D63954#1562928 <https://reviews.llvm.org/D63954#1562928>, @erik.pilkington wrote:
> > We explicitly allow to add an annotation after
> > the definition of the class to allow adding annotations
> > to external source from by the user, e.g.
> >
> > #include <vector>
> >
> > namespace std {
> > template<typename T, typename Alloc>
> > class [[gsl::Owner(T)]] vector;
> > }
>
> Wait, does that even work? What if the vector was declared in an inline namespace in the header? Seems like a strange recommendation for users. Is there some reason you can't just add these annotations to standard libraries? I doubt libcxx would have a problem with getting better warnings on their types.
We do not want to encourage users to redeclare things within namespace std like this -- I believe that is UB.
================
Comment at: clang/include/clang/Basic/Attr.td:2770
+def Owner : InheritableAttr {
+ let Spellings = [CXX11<"gsl", "Owner">];
+ let Subjects = SubjectList<[CXXRecord]>;
----------------
Has Microsoft already added support for this? We had an unfortunate problem with `gsl::suppress` where we introduced the attribute first and MSVC introduced it under a different, incompatible syntax. I would strongly like to avoid repeating that.
================
Comment at: clang/include/clang/Basic/AttrDocs.td:4167
+pointer/reference to the data owned by ``O``. The owned data is assumed to end
+its lifetime once the owning object's lifetime end.
+
----------------
the owning object's lifetime end -> the owning object's lifetime ends
================
Comment at: clang/include/clang/Basic/AttrDocs.td:4177
+ let Content = [{
+When annotating a class ``P`` with ``[[gsl::Pointer(T)]]``, it assumed to be a
+non-owning type whose objects can point to ``T`` type objects or dangle.
----------------
You don't reference `P` in the rest of the docs, is that intentional?
================
Comment at: clang/include/clang/Basic/AttrDocs.td:4186
+}
\ No newline at end of file
----------------
Please keep the newline at the end of the file.
================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:4537
+static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
+ if (!AL.hasParsedType()) {
+ S.Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
----------------
Under what circumstances is this check needed? I believe this is already automatically handled for you.
================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:4546-4547
+
+ if (ParmType->isVoidType()) {
+ S.Diag(AL.getLoc(), diag::err_attribute_invalid_argument) << "'void'" << AL;
+ return;
----------------
Is `void` really the only problematic type? What about incomplete types, for instance?
================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:4553
+ // we always add (and check) the attribute to the cannonical decl.
+ D = D->getCanonicalDecl();
+ if(AL.getKind() == ParsedAttr::AT_Owner) {
----------------
Will this work? What happens if we see a forward declaration with this attribute first and then see the canonical declaration later? I suspect this work needs to be done when merging declaration attributes instead.
================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:4554
+ D = D->getCanonicalDecl();
+ if(AL.getKind() == ParsedAttr::AT_Owner) {
+ if (checkAttrMutualExclusion<PointerAttr>(S, D, AL))
----------------
Formatting.
================
Comment at: clang/lib/Sema/SemaDeclAttr.cpp:4557
+ return;
+ if (const auto *Attr = D->getAttr<OwnerAttr>()) {
+ if (Attr->getDerefType().getTypePtr() != ParmType.getTypePtr()) {
----------------
Please use a name other than `Attr` (as that's a type name).
================
Comment at: clang/test/SemaCXX/attr-gsl-owner-pointer.cpp:61
+class [[gsl::Owner(int)]] AddTheSameLater;
\ No newline at end of file
----------------
Please add a newline to the end of the file.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D63954/new/
https://reviews.llvm.org/D63954
More information about the cfe-commits
mailing list