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 | |
| 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')
| -rw-r--r-- | clang/test/AST/ast-dump-attr.cpp | 17 | ||||
| -rw-r--r-- | clang/test/Misc/pragma-attribute-supported-attributes-list.test | 2 | ||||
| -rw-r--r-- | clang/test/SemaCXX/attr-gsl-owner-pointer.cpp | 107 | ||||
| -rw-r--r-- | clang/test/SemaOpenCL/invalid-kernel-attrs.cl | 6 |
4 files changed, 129 insertions, 3 deletions
diff --git a/clang/test/AST/ast-dump-attr.cpp b/clang/test/AST/ast-dump-attr.cpp index 8f67b9934e1..83c4a6342db 100644 --- a/clang/test/AST/ast-dump-attr.cpp +++ b/clang/test/AST/ast-dump-attr.cpp @@ -211,6 +211,23 @@ namespace TestSuppress { }
}
+namespace TestLifetimeCategories {
+class [[gsl::Owner(int)]] AOwner{};
+// CHECK: CXXRecordDecl{{.*}} class AOwner
+// CHECK: OwnerAttr {{.*}} int
+class [[gsl::Pointer(int)]] APointer{};
+// CHECK: CXXRecordDecl{{.*}} class APointer
+// CHECK: PointerAttr {{.*}} int
+
+class [[gsl::Pointer]] PointerWithoutArgument{};
+// CHECK: CXXRecordDecl{{.*}} class PointerWithoutArgument
+// CHECK: PointerAttr
+
+class [[gsl::Owner]] OwnerWithoutArgument{};
+// CHECK: CXXRecordDecl{{.*}} class OwnerWithoutArgument
+// CHECK: OwnerAttr
+} // namespace TestLifetimeCategories
+
// Verify the order of attributes in the Ast. It must reflect the order
// in the parsed source.
int mergeAttrTest() __attribute__((deprecated)) __attribute__((warn_unused_result));
diff --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test b/clang/test/Misc/pragma-attribute-supported-attributes-list.test index fc9d86efe70..cc2d3806018 100644 --- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -117,8 +117,10 @@ // CHECK-NEXT: OpenCLNoSVM (SubjectMatchRule_variable) // CHECK-NEXT: OptimizeNone (SubjectMatchRule_function, SubjectMatchRule_objc_method) // CHECK-NEXT: Overloadable (SubjectMatchRule_function) +// CHECK-NEXT: Owner (SubjectMatchRule_record_not_is_union) // CHECK-NEXT: ParamTypestate (SubjectMatchRule_variable_is_parameter) // CHECK-NEXT: PassObjectSize (SubjectMatchRule_variable_is_parameter) +// CHECK-NEXT: Pointer (SubjectMatchRule_record_not_is_union) // CHECK-NEXT: RenderScriptKernel (SubjectMatchRule_function) // CHECK-NEXT: ReqdWorkGroupSize (SubjectMatchRule_function) // CHECK-NEXT: RequireConstantInit (SubjectMatchRule_variable_is_global) 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 diff --git a/clang/test/SemaOpenCL/invalid-kernel-attrs.cl b/clang/test/SemaOpenCL/invalid-kernel-attrs.cl index a96e85c9ee2..daa8fa07f68 100644 --- a/clang/test/SemaOpenCL/invalid-kernel-attrs.cl +++ b/clang/test/SemaOpenCL/invalid-kernel-attrs.cl @@ -1,12 +1,12 @@ -// RUN: %clang_cc1 -verify %s +// RUN: %clang_cc1 -verify %s kernel __attribute__((vec_type_hint)) void kernel1() {} //expected-error{{'vec_type_hint' attribute takes one argument}} kernel __attribute__((vec_type_hint(not_type))) void kernel2() {} //expected-error{{unknown type name 'not_type'}} -kernel __attribute__((vec_type_hint(void))) void kernel3() {} //expected-error{{invalid attribute argument 'void' - expecting a vector or vectorizable scalar type}} +kernel __attribute__((vec_type_hint(void))) void kernel3() {} //expected-error{{a non-vector or non-vectorizable scalar type is an invalid argument to attribute 'vec_type_hint'}} -kernel __attribute__((vec_type_hint(bool))) void kernel4() {} //expected-error{{invalid attribute argument 'bool' - expecting a vector or vectorizable scalar type}} +kernel __attribute__((vec_type_hint(bool))) void kernel4() {} //expected-error{{a non-vector or non-vectorizable scalar type is an invalid argument to attribute 'vec_type_hint'}} kernel __attribute__((vec_type_hint(int))) __attribute__((vec_type_hint(float))) void kernel5() {} //expected-warning{{attribute 'vec_type_hint' is already applied with different parameters}} |

