mgehre updated this revision to Diff 209370.
mgehre marked 9 inline comments as done.
mgehre added a comment.
- Implement comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D64448/new/
https://reviews.llvm.org/D64448
Files:
clang/include/clang/Basic/AttrDocs.td
clang/test/SemaCXX/attr-gsl-owner-pointer.cpp
Index: clang/test/SemaCXX/attr-gsl-owner-pointer.cpp
===================================================================
--- clang/test/SemaCXX/attr-gsl-owner-pointer.cpp
+++ clang/test/SemaCXX/attr-gsl-owner-pointer.cpp
@@ -83,14 +83,14 @@
static_assert(__is_gsl_pointer(int &), "");
static_assert(__is_gsl_pointer(int *), "");
-// Test builtin annotation for std types.
+// Test builtin attributes for std types.
namespace std {
-// Complete class
+// Attributes are added to a (complete) class.
class any {
};
static_assert(__is_gsl_owner(any), "");
-// Complete template
+// Attributes are added to a instantiatons of a complete template.
template <typename T>
class vector {
public:
@@ -99,45 +99,60 @@
static_assert(__is_gsl_owner(vector<int>), "");
static_assert(__is_gsl_pointer(vector<int>::iterator), "");
+// If std::container::iterator is a using declaration, Attributes are added to
+// the underlying class
template <typename T>
-class set_iterator {};
+class __set_iterator {};
template <typename T>
class set {
public:
- using iterator = set_iterator<T>;
+ using iterator = __set_iterator<T>;
};
static_assert(__is_gsl_pointer(set<int>::iterator), "");
+// If std::container::iterator is a typedef, Attributes are added to the
+// underlying class. Inline namespaces are ignored when checking if
+// the class lives in the std namespace.
+inline namespace inlinens {
template <typename T>
-class map_iterator {};
+class __map_iterator {};
template <typename T>
class map {
public:
- typedef map_iterator<T> iterator;
+ typedef __map_iterator<T> iterator;
};
+} // namespace inlinens
static_assert(__is_gsl_pointer(map<int>::iterator), "");
-// list has an implicit gsl::Owner attribute,
+// std::list has an implicit gsl::Owner attribute,
// but explicit attributes take precedence.
template <typename T>
class [[gsl::Pointer]] list{};
static_assert(!__is_gsl_owner(list<int>), "");
static_assert(__is_gsl_pointer(list<int>), "");
-// Forward declared template
+// Forward declared template (Owner)
template <
class CharT,
class Traits>
class basic_regex;
static_assert(__is_gsl_owner(basic_regex<char, void>), "");
+// Forward declared template (Pointer)
template <class T>
class reference_wrapper;
static_assert(__is_gsl_pointer(reference_wrapper<char>), "");
-class thread;
-static_assert(!__is_gsl_pointer(thread), "");
-static_assert(!__is_gsl_owner(thread), "");
+class some_unknown_type;
+static_assert(!__is_gsl_pointer(some_unknown_type), "");
+static_assert(!__is_gsl_owner(some_unknown_type), "");
} // namespace std
+
+namespace user {
+// If a class is not in the std namespace, we don't add implicit attributes.
+class any {
+};
+static_assert(!__is_gsl_owner(any), "");
+} // namespace user
Index: clang/include/clang/Basic/AttrDocs.td
===================================================================
--- clang/include/clang/Basic/AttrDocs.td
+++ clang/include/clang/Basic/AttrDocs.td
@@ -4164,7 +4164,7 @@
When annotating a class ``O`` with ``[[gsl::Owner(T)]]``, then each function
that returns cv-qualified ``T&`` or ``T*`` is assumed to return a
pointer/reference to the data owned by ``O``. The owned data is assumed to end
-its lifetime once the owning object's lifetime ends. The argument is ``T`` is
+its lifetime once the owning object's lifetime ends. The argument ``T`` is
optional.
This attribute may be used by analysis tools but will not have effect on code
@@ -4177,7 +4177,7 @@
let Content = [{
When annotating a class with ``[[gsl::Pointer(T)]]``, it assumed to be a
non-owning type whose objects can point to ``T`` type objects or dangle.
-The argument is ``T`` is optional.
+The argument ``T`` is optional.
This attribute may be used by analysis tools but will not have effect on code
generation.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits