diff options
author | Matthias Gehre <M.Gehre@gmx.de> | 2019-07-25 17:50:51 +0000 |
---|---|---|
committer | Matthias Gehre <M.Gehre@gmx.de> | 2019-07-25 17:50:51 +0000 |
commit | d293cbd5fd44549bb48314499bc3b266d8967249 (patch) | |
tree | ab6670feffca7c33388bc45e9dba4f3aa4bef18b /clang/test/SemaCXX/attr-gsl-owner-pointer.cpp | |
parent | 393094859e45f7a6ccbade1c919dee2c2e2f3a7e (diff) | |
download | bcm5719-llvm-d293cbd5fd44549bb48314499bc3b266d8967249.tar.gz bcm5719-llvm-d293cbd5fd44549bb48314499bc3b266d8967249.zip |
Add lifetime categories attributes
Summary:
This is the first part of work announced in
"[RFC] Adding lifetime analysis to clang" [0],
i.e. the addition of the [[gsl::Owner(T)]] and
[[gsl::Pointer(T)]] attributes, which
will enable user-defined types to participate in
the lifetime analysis (which will be part of the
next PR).
The type `T` here is called "DerefType" in the paper,
and denotes the type that an Owner owns and a Pointer
points to. E.g. `std::vector<int>` should be annotated
with `[[gsl::Owner(int)]]` and
a `std::vector<int>::iterator` with `[[gsl::Pointer(int)]]`.
[0] http://lists.llvm.org/pipermail/cfe-dev/2018-November/060355.html
Reviewers: gribozavr
Subscribers: xazax.hun, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D63954
llvm-svn: 367040
Diffstat (limited to 'clang/test/SemaCXX/attr-gsl-owner-pointer.cpp')
-rw-r--r-- | clang/test/SemaCXX/attr-gsl-owner-pointer.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/attr-gsl-owner-pointer.cpp b/clang/test/SemaCXX/attr-gsl-owner-pointer.cpp new file mode 100644 index 00000000000..1c3deb3982e --- /dev/null +++ b/clang/test/SemaCXX/attr-gsl-owner-pointer.cpp @@ -0,0 +1,107 @@ +// RUN: %clang_cc1 -verify -ast-dump %s | \ +// RUN: FileCheck --implicit-check-not OwnerAttr --implicit-check-not PointerAttr %s + +int [[gsl::Owner]] i; +// expected-error@-1 {{'Owner' attribute cannot be applied to types}} +void [[gsl::Owner]] f(); +// expected-error@-1 {{'Owner' attribute cannot be applied to types}} + +[[gsl::Owner]] void f(); +// expected-warning@-1 {{'Owner' attribute only applies to structs}} + +union [[gsl::Owner(int)]] Union{}; +// expected-warning@-1 {{'Owner' attribute only applies to structs}} + +struct S { +}; + +S [[gsl::Owner]] Instance; +// expected-error@-1 {{'Owner' attribute cannot be applied to types}} + +class [[gsl::Owner(7)]] OwnerDerefNoType{}; +// expected-error@-1 {{expected a type}} + +class [[gsl::Pointer("int")]] PointerDerefNoType{}; +// expected-error@-1 {{expected a type}} + +class [[gsl::Owner(int)]] [[gsl::Pointer(int)]] BothOwnerPointer{}; +// expected-error@-1 {{'Pointer' and 'Owner' attributes are not compatible}} +// expected-note@-2 {{conflicting attribute is here}} +// CHECK: CXXRecordDecl {{.*}} BothOwnerPointer +// CHECK: OwnerAttr {{.*}} int + +class [[gsl::Owner(void)]] OwnerVoidDerefType{}; +// expected-error@-1 {{'void' is an invalid argument to attribute 'Owner'}} +class [[gsl::Pointer(void)]] PointerVoidDerefType{}; +// expected-error@-1 {{'void' is an invalid argument to attribute 'Pointer'}} + +class [[gsl::Pointer(int)]] AddConflictLater{}; +// CHECK: CXXRecordDecl {{.*}} AddConflictLater +// CHECK: PointerAttr {{.*}} int +class [[gsl::Owner(int)]] AddConflictLater; +// expected-error@-1 {{'Owner' and 'Pointer' attributes are not compatible}} +// expected-note@-5 {{conflicting attribute is here}} +// CHECK: CXXRecordDecl {{.*}} AddConflictLater +// CHECK: PointerAttr {{.*}} Inherited int + +class [[gsl::Owner(int)]] AddConflictLater2{}; +// CHECK: CXXRecordDecl {{.*}} AddConflictLater2 +// CHECK: OwnerAttr {{.*}} int +class [[gsl::Owner(float)]] AddConflictLater2; +// expected-error@-1 {{'Owner' and 'Owner' attributes are not compatible}} +// expected-note@-5 {{conflicting attribute is here}} +// CHECK: CXXRecordDecl {{.*}} AddConflictLater +// CHECK: OwnerAttr {{.*}} Inherited int + +class [[gsl::Owner()]] [[gsl::Owner(int)]] WithAndWithoutParameter{}; +// expected-error@-1 {{'Owner' and 'Owner' attributes are not compatible}} +// expected-note@-2 {{conflicting attribute is here}} +// CHECK: CXXRecordDecl {{.*}} WithAndWithoutParameter +// CHECK: OwnerAttr + +class [[gsl::Owner(int &)]] ReferenceType{}; +// expected-error@-1 {{a reference type is an invalid argument to attribute 'Owner'}} + +class [[gsl::Pointer(int[])]] ArrayType{}; +// expected-error@-1 {{an array type is an invalid argument to attribute 'Pointer'}} + +class [[gsl::Owner]] OwnerMissingParameter{}; +// CHECK: CXXRecordDecl {{.*}} OwnerMissingParameter +// CHECK: OwnerAttr + +class [[gsl::Pointer]] PointerMissingParameter{}; +// CHECK: CXXRecordDecl {{.*}} PointerMissingParameter +// CHECK: PointerAttr + +class [[gsl::Owner()]] OwnerWithEmptyParameterList{}; +// CHECK: CXXRecordDecl {{.*}} OwnerWithEmptyParameterList +// CHECK: OwnerAttr {{.*}} + +class [[gsl::Pointer()]] PointerWithEmptyParameterList{}; +// CHECK: CXXRecordDecl {{.*}} PointerWithEmptyParameterList +// CHECK: PointerAttr {{.*}} + +struct [[gsl::Owner(int)]] AnOwner{}; +// CHECK: CXXRecordDecl {{.*}} AnOwner +// CHECK: OwnerAttr {{.*}} int + +struct S; +class [[gsl::Pointer(S)]] APointer{}; +// CHECK: CXXRecordDecl {{.*}} APointer +// CHECK: PointerAttr {{.*}} S + +class [[gsl::Owner(int)]] [[gsl::Owner(int)]] DuplicateOwner{}; +// CHECK: CXXRecordDecl {{.*}} DuplicateOwner +// CHECK: OwnerAttr {{.*}} int + +class [[gsl::Pointer(int)]] [[gsl::Pointer(int)]] DuplicatePointer{}; +// CHECK: CXXRecordDecl {{.*}} DuplicatePointer +// CHECK: PointerAttr {{.*}} int + +class [[gsl::Owner(int)]] AddTheSameLater{}; +// CHECK: CXXRecordDecl {{.*}} AddTheSameLater +// CHECK: OwnerAttr {{.*}} int + +class [[gsl::Owner(int)]] AddTheSameLater; +// CHECK: CXXRecordDecl {{.*}} prev {{.*}} AddTheSameLater +// CHECK: OwnerAttr {{.*}} int |