mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-25 06:18:56 -04:00

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;
|
|
};
|