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 | 6ccc1c342a1922f6808fb0035dafd41e65500445 (patch) | |
tree | 011fba6613ce75a1edccc62c9d4b5f3f20371607 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | 6d8dace43819bee0f2e787050d9660d48ffaab09 (diff) | |
download | bcm5719-llvm-6ccc1c342a1922f6808fb0035dafd41e65500445.tar.gz bcm5719-llvm-6ccc1c342a1922f6808fb0035dafd41e65500445.zip |
[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
llvm-svn: 313067
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions