Szelethus created this revision. Szelethus added reviewers: george.karpenkov, xazax.hun, NoQ, rnkovacs, baloghadamsoftware. Herald added subscribers: cfe-commits, mikhail.ramalho, a.sidorin, szepet, whisperity.
Thanks to @donat.nagy for spotting this! Repository: rC Clang https://reviews.llvm.org/D52986 Files: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist test/Analysis/plist-macros-with-expansion.cpp
Index: test/Analysis/plist-macros-with-expansion.cpp =================================================================== --- test/Analysis/plist-macros-with-expansion.cpp +++ test/Analysis/plist-macros-with-expansion.cpp @@ -261,9 +261,8 @@ *ptr = 5; // expected-warning{{Dereference of null pointer}} } -// TODO: Should correctly display the rest of the parameters. // CHECK: <key>name</key><string>VARIADIC_SET_TO_NULL</string> -// CHECK: <key>expansion</key><string>ptr = nullptr ; variadicFunc ( 1 ) </string> +// CHECK: <key>expansion</key><string>ptr = nullptr ; variadicFunc ( 1 , 5 , "haha!" ) </string> //===----------------------------------------------------------------------===// // Tests for # and ##. Index: test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist =================================================================== --- test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist +++ test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist @@ -3,7 +3,7 @@ <plist version="1.0"> <dict> <key>clang_version</key> -<string>clang version 8.0.0 (http://mainstream.inf.elte.hu/Szelethus/clang 650e3f54f6a63798143c7181035a285f03dccb7f) (https://github.com/llvm-mirror/llvm 1ffbf26a1a0a190d69327af875a3337b74a2ce82)</string> +<string>clang version 8.0.0 (http://mainstream.inf.elte.hu/Szelethus/clang 531e9e44e37061619212a542a5d1076525fdbea9) (https://github.com/llvm-mirror/llvm 1ffbf26a1a0a190d69327af875a3337b74a2ce82)</string> <key>diagnostics</key> <array> <dict> @@ -3590,7 +3590,7 @@ <key>file</key><integer>0</integer> </dict> <key>name</key><string>VARIADIC_SET_TO_NULL</string> - <key>expansion</key><string>ptr = nullptr ; variadicFunc ( 1 ) </string> + <key>expansion</key><string>ptr = nullptr ; variadicFunc ( 1 , 5 , "haha!" ) </string> </dict> <dict> <key>kind</key><string>event</string> @@ -3722,25 +3722,25 @@ <key>start</key> <array> <dict> - <key>line</key><integer>277</integer> + <key>line</key><integer>276</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>277</integer> + <key>line</key><integer>276</integer> <key>col</key><integer>5</integer> <key>file</key><integer>0</integer> </dict> </array> <key>end</key> <array> <dict> - <key>line</key><integer>278</integer> + <key>line</key><integer>277</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>278</integer> + <key>line</key><integer>277</integer> <key>col</key><integer>30</integer> <key>file</key><integer>0</integer> </dict> @@ -3752,7 +3752,7 @@ <key>kind</key><string>macro_expansion</string> <key>location</key> <dict> - <key>line</key><integer>278</integer> + <key>line</key><integer>277</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> @@ -3763,20 +3763,20 @@ <key>kind</key><string>event</string> <key>location</key> <dict> - <key>line</key><integer>278</integer> + <key>line</key><integer>277</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <key>ranges</key> <array> <array> <dict> - <key>line</key><integer>278</integer> + <key>line</key><integer>277</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>278</integer> + <key>line</key><integer>277</integer> <key>col</key><integer>45</integer> <key>file</key><integer>0</integer> </dict> @@ -3796,25 +3796,25 @@ <key>start</key> <array> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> </array> <key>end</key> <array> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> @@ -3826,20 +3826,20 @@ <key>kind</key><string>event</string> <key>location</key> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> <key>ranges</key> <array> <array> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>4</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>6</integer> <key>file</key><integer>0</integer> </dict> @@ -3863,18 +3863,18 @@ <key>issue_hash_function_offset</key><string>3</string> <key>location</key> <dict> - <key>line</key><integer>279</integer> + <key>line</key><integer>278</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> <key>ExecutedLines</key> <dict> <key>0</key> <array> + <integer>275</integer> <integer>276</integer> <integer>277</integer> <integer>278</integer> - <integer>279</integer> </array> </dict> </dict> @@ -3889,25 +3889,25 @@ <key>start</key> <array> <dict> - <key>line</key><integer>291</integer> + <key>line</key><integer>290</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>291</integer> + <key>line</key><integer>290</integer> <key>col</key><integer>5</integer> <key>file</key><integer>0</integer> </dict> </array> <key>end</key> <array> <dict> - <key>line</key><integer>292</integer> + <key>line</key><integer>291</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>292</integer> + <key>line</key><integer>291</integer> <key>col</key><integer>11</integer> <key>file</key><integer>0</integer> </dict> @@ -3919,7 +3919,7 @@ <key>kind</key><string>macro_expansion</string> <key>location</key> <dict> - <key>line</key><integer>292</integer> + <key>line</key><integer>291</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> @@ -3930,20 +3930,20 @@ <key>kind</key><string>event</string> <key>location</key> <dict> - <key>line</key><integer>292</integer> + <key>line</key><integer>291</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <key>ranges</key> <array> <array> <dict> - <key>line</key><integer>292</integer> + <key>line</key><integer>291</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>292</integer> + <key>line</key><integer>291</integer> <key>col</key><integer>23</integer> <key>file</key><integer>0</integer> </dict> @@ -3963,25 +3963,25 @@ <key>start</key> <array> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>3</integer> <key>file</key><integer>0</integer> </dict> </array> <key>end</key> <array> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> @@ -3993,20 +3993,20 @@ <key>kind</key><string>event</string> <key>location</key> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> <key>ranges</key> <array> <array> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>4</integer> <key>file</key><integer>0</integer> </dict> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>6</integer> <key>file</key><integer>0</integer> </dict> @@ -4030,18 +4030,18 @@ <key>issue_hash_function_offset</key><string>3</string> <key>location</key> <dict> - <key>line</key><integer>293</integer> + <key>line</key><integer>292</integer> <key>col</key><integer>8</integer> <key>file</key><integer>0</integer> </dict> <key>ExecutedLines</key> <dict> <key>0</key> <array> + <integer>289</integer> <integer>290</integer> <integer>291</integer> <integer>292</integer> - <integer>293</integer> </array> </dict> </dict> Index: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp =================================================================== --- lib/StaticAnalyzer/Core/PlistDiagnostics.cpp +++ lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -853,15 +853,24 @@ // we will find tok::l_paren, tok::r_paren, and tok::comma that do not divide // actual macro arguments, or do not represent the macro argument's closing // parantheses, so we'll count how many parantheses aren't closed yet. + // If ParanthesesDepth + // * = 0, then there are no more arguments to lex. + // * = 1, then if we find a tok::comma, we can start lexing the next arg. + // * > 1, then tok::comma is a part of the current arg. int ParanthesesDepth = 1; - for (unsigned Index = 0; Index < MI->getNumParams(); ++Index) { + // If we encounter __VA_ARGS__, we will lex until the closing tok::r_paren, + // even if we lex a tok::comma and ParanthesesDepth == 1. + const IdentifierInfo *__VA_ARGS__II = PP.getIdentifierInfo("__VA_ARGS__"); + + for (const IdentifierInfo *UnexpArgII : MacroArgs) { MacroArgMap::mapped_type ExpandedArgTokens; // Lex the first token of the next macro parameter. RawLexer.LexFromRawLexer(TheTok); - while (TheTok.isNot(tok::comma) || ParanthesesDepth != 1) { + while (!(ParanthesesDepth == 1 && + (UnexpArgII == __VA_ARGS__II ? false : TheTok.is(tok::comma)))) { assert(TheTok.isNot(tok::eof) && "EOF encountered while looking for expanded macro args!"); @@ -881,12 +890,10 @@ RawLexer.LexFromRawLexer(TheTok); } - Args.insert(std::make_pair(MacroArgs[Index], ExpandedArgTokens)); + Args.insert(std::make_pair(UnexpArgII, ExpandedArgTokens)); } - // TODO: The condition really should be TheTok.is(tok::r_paren), but variadic - // macro arguments are not handled yet. - assert(TheTok.isOneOf(tok::r_paren, tok::comma) && + assert(TheTok.is(tok::r_paren) && "Expanded macro argument acquisition failed! After the end of the loop" " this token should be ')'!");
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits