Index: clang-tidy/misc/MacroParenthesesCheck.cpp =================================================================== --- clang-tidy/misc/MacroParenthesesCheck.cpp +++ clang-tidy/misc/MacroParenthesesCheck.cpp @@ -151,6 +151,10 @@ if (Prev.isOneOf(tok::period, tok::arrow, tok::coloncolon)) continue; + // Argument is a namespace or class. + if (Next.is(tok::coloncolon)) + continue; + // String concatenation. if (isStringLiteral(Prev.getKind()) || isStringLiteral(Next.getKind())) continue; @@ -173,6 +177,10 @@ if (Prev.isOneOf(tok::equal, tok::kw_return) && Next.is(tok::semi)) continue; + // C++ template parameters. + if (PP->getLangOpts().CPlusPlus && Prev.isOneOf(tok::comma,tok::less) && Next.isOneOf(tok::comma,tok::greater)) + continue; + Check->diag(Tok.getLocation(), "macro argument should be enclosed in " "parentheses") << FixItHint::CreateInsertion(Tok.getLocation(), "(") Index: test/clang-tidy/misc-macro-parentheses.cpp =================================================================== --- test/clang-tidy/misc-macro-parentheses.cpp +++ test/clang-tidy/misc-macro-parentheses.cpp @@ -32,6 +32,9 @@ #define GOOD20 void* #define GOOD21(a) case Fred::a: #define GOOD22(a) if (verbose) return a; +#define GOOD23(type) (type::Field) +#define GOOD24(t) std::set s +#define GOOD25(t) std::set s // These are allowed for now.. #define MAYBE1 *12.34