Summary:
This patch implements parsing of [[clang::suppress(rule, ...)]]
and [[gsl::suppress(rule, ...)]] attributes.
C++ Core Guidelines depend heavily on tool support for
rule enforcement. They also propose a way to suppress
warnings [1] which is by annotating any ancestor in AST
with the C++11 attribute [[gsl::suppress(rule1,...)]].
To have a mechanism to suppress non-C++ Core
Guidelines specific, an additional spelling of [[clang::suppress]]
is defined.
For example, to suppress the warning cppcoreguidelines-slicing,
one could do
```
[[clang::suppress("cppcoreguidelines-slicing")]]
void f() { ... code that does slicing ... }
```
or
```
void g() {
Derived b;
[[clang::suppress("cppcoreguidelines-slicing")]]
Base a{b};
[[clang::suppress("cppcoreguidelines-slicing")]] {
doSomething();
Base a2{b};
}
}
```
This parsing can then be used by clang-tidy, which includes multiple
C++ Core Guidelines rules, to suppress warnings (see
https://reviews.llvm.org/D24888).
For the exact naming of the rule in the attribute, there
are different possibilities, which will be defined in the
corresponding clang-tidy patch.
Currently, clang-tidy supports suppressing of warnings through "//
NOLINT" comments. There are some advantages that the attribute has:
- Suppressing specific warnings instead of all warnings
- Suppressing warnings in a block (namespace, function, compound
statement)
- Code formatting may split a statement into multiple lines,
thus a "// NOLINT" comment may be on the wrong line
I'm looking forward to your comments!
[1] https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#inforce-enforcement
Reviewers: alexfh, aaron.ballman, rsmith
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D24886
llvm-svn: 298880
26 lines
752 B
C++
26 lines
752 B
C++
// RUN: %clang_cc1 -std=c++11 -fsyntax-only %s -verify
|
|
|
|
[[gsl::suppress("globally")]];
|
|
|
|
namespace N {
|
|
[[gsl::suppress("in-a-namespace")]];
|
|
}
|
|
|
|
[[gsl::suppress("readability-identifier-naming")]]
|
|
void f_() {
|
|
int *p;
|
|
[[gsl::suppress("type", "bounds")]] {
|
|
p = reinterpret_cast<int *>(7);
|
|
}
|
|
|
|
[[gsl::suppress]] int x; // expected-error {{'suppress' attribute takes at least 1 argument}}
|
|
[[gsl::suppress()]] int y; // expected-error {{'suppress' attribute takes at least 1 argument}}
|
|
int [[gsl::suppress("r")]] z; // expected-error {{'suppress' attribute cannot be applied to types}}
|
|
[[gsl::suppress(f_)]] float f; // expected-error {{'suppress' attribute requires a string}}
|
|
}
|
|
|
|
union [[gsl::suppress("type.1")]] U {
|
|
int i;
|
|
float f;
|
|
};
|