From: Manuel Klimek Date: Wed, 6 Feb 2013 15:57:54 +0000 (+0000) Subject: Parse record declarations with token pasted identifiers. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8b1ce12362860e55590c55fd43db875c9193357;p=clang Parse record declarations with token pasted identifiers. This is pretty common in macros: #define A(X, Y) class X##Y {}; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174512 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 19bca8d860..f79cc712f4 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -650,9 +650,11 @@ void UnwrappedLineParser::parseRecord() { if (FormatTok.Tok.is(tok::l_paren)) { parseParens(); } - // The actual identifier can be a nested name specifier. + // The actual identifier can be a nested name specifier, and in macros + // it is often token-pasted. while (FormatTok.Tok.is(tok::identifier) || - FormatTok.Tok.is(tok::coloncolon)) + FormatTok.Tok.is(tok::coloncolon) || + FormatTok.Tok.is(tok::hashhash)) nextToken(); // Note that parsing away template declarations here leads to incorrectly diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index cd3bf17df2..fc95acca52 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -1859,6 +1859,7 @@ TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) { verifyFormat("class MACRO(X) Z {\n} n;"); verifyFormat("class __attribute__(X) Z {\n} n;"); verifyFormat("class __declspec(X) Z {\n} n;"); + verifyFormat("class A##B##C {\n} n;"); // Redefinition from nested context: verifyFormat("class A::B::C {\n} n;");