diff options
author | Jonas Toth <jonas.toth@gmail.com> | 2017-09-12 20:00:42 +0000 |
---|---|---|
committer | Jonas Toth <jonas.toth@gmail.com> | 2017-09-12 20:00:42 +0000 |
commit | ec68612007cfed416a878a20fea11e50ff18ad5b (patch) | |
tree | 7b3fe4698089f435e65360ecc7f4e90935ea73ad /clang-tidy/utils | |
parent | 7b6df2ef40a79aaaff70b7f7a73ae32b45a5fe04 (diff) |
[clang-tidy] Implement type-based check for `gsl::owner`
This check implements the typebased semantic of `gsl::owner`.
Meaning, that
- only `gsl::owner` is allowed to get `delete`d
- `new` expression must be assigned to `gsl::owner`
- function calls that expect `gsl::owner` as argument, must get either an owner
or a newly created and recognized resource (in the moment only `new`ed memory)
- assignment to `gsl::owner` must be either a resource or another owner
- functions returning an `gsl::owner` are considered as factories, and their result
must be assigned to an `gsl::owner`
- classes that have an `gsl::owner`-member must declare a non-default destructor
There are some problems that occur when typededuction is in place.
For example `auto Var = function_that_returns_owner();` the type of `Var` will not be
an `gsl::owner`. This case is catched, and explicitly noted.
But cases like fully templated functions
```
template <typename T>
void f(T t) { delete t; }
// ...
f(gsl::owner<int*>(new int(42)));
```
Will created false positive (the deletion is problematic), since the type deduction
removes the wrapping `typeAlias`.
Codereview in D36354
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@313067 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clang-tidy/utils')
-rw-r--r-- | clang-tidy/utils/Matchers.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/clang-tidy/utils/Matchers.h b/clang-tidy/utils/Matchers.h index adafdd9a..aeb639fa 100644 --- a/clang-tidy/utils/Matchers.h +++ b/clang-tidy/utils/Matchers.h @@ -17,6 +17,10 @@ namespace clang { namespace tidy { namespace matchers { +AST_MATCHER(BinaryOperator, isAssignmentOperator) { + return Node.isAssignmentOp(); +} + AST_MATCHER(BinaryOperator, isRelationalOperator) { return Node.isRelationalOp(); } |