blob: e398fc6564ce1356eaba4b10ef915689d4195e97 [file] [log] [blame]
Daniel Marjamaki302275a2015-06-16 14:27:31 +00001//===--- MacroParenthesesCheck.h - clang-tidy--------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H
11#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H
12
13#include "../ClangTidy.h"
14
15namespace clang {
16namespace tidy {
Etienne Bergeron456177b2016-05-02 18:00:29 +000017namespace misc {
Daniel Marjamaki302275a2015-06-16 14:27:31 +000018
Alexander Kornienkof8ed0a82015-08-27 18:01:58 +000019/// Finds macros that can have unexpected behaviour due to missing parentheses.
Daniel Marjamaki302275a2015-06-16 14:27:31 +000020///
21/// Macros are expanded by the preprocessor as-is. As a result, there can be
22/// unexpected behaviour; operators may be evaluated in unexpected order and
23/// unary operators may become binary operators, etc.
24///
25/// When the replacement list has an expression, it is recommended to surround
26/// it with parentheses. This ensures that the macro result is evaluated
27/// completely before it is used.
28///
29/// It is also recommended to surround macro arguments in the replacement list
30/// with parentheses. This ensures that the argument value is calculated
31/// properly.
32class MacroParenthesesCheck : public ClangTidyCheck {
33public:
34 MacroParenthesesCheck(StringRef Name, ClangTidyContext *Context)
35 : ClangTidyCheck(Name, Context) {}
36 void registerPPCallbacks(CompilerInstance &Compiler) override;
37};
38
Etienne Bergeron456177b2016-05-02 18:00:29 +000039} // namespace misc
Daniel Marjamaki302275a2015-06-16 14:27:31 +000040} // namespace tidy
41} // namespace clang
42
43#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_MACRO_PARENTHESES_H