chrish_ericsson_atx created this revision. chrish_ericsson_atx added reviewers: NoQ, Szelethus, dcoughlin. Herald added subscribers: cfe-commits, ASDenysPetrov, martong, Charusso, dkrupp, donat.nagy, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun. Herald added a project: clang. chrish_ericsson_atx requested review of this revision.
Added support for GNU named variadic macros in macro expansion for plist generation. Fix for https://bugs.llvm.org/show_bug.cgi?id=44493 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D87942 Files: clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist clang/test/Analysis/plist-macros-with-expansion.cpp
Index: clang/test/Analysis/plist-macros-with-expansion.cpp =================================================================== --- clang/test/Analysis/plist-macros-with-expansion.cpp +++ clang/test/Analysis/plist-macros-with-expansion.cpp @@ -529,3 +529,17 @@ // FIXME: Stringify and escape __VA_ARGS__ correctly. // CHECK: <key>name</key><string>STRINGIFIED_VA_ARGS</string> // CHECK-NEXT: <key>expansion</key><string>variadicCFunction(x, "Additional supply depots required.", ")";x = 0;</string> + +// bz44493: Support GNU-style named variadic arguments in plister +#define bz44493_log(args...) \ + do { \ + } while (0) + +int bz44493(void) { + int x = 1; + bz44493_log("arg"); + bz44493_log("arg", "arg2"); + int a; + a & 0xffc00000; // expected-warning{{expression result unused}} + return 0; +} Index: clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist =================================================================== --- clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist +++ clang/test/Analysis/Inputs/expected-plists/plist-macros-with-expansion.cpp.plist @@ -6787,6 +6787,221 @@ </array> </dict> </dict> + <dict> + <key>path</key> + <array> + <dict> + <key>kind</key><string>control</string> + <key>edges</key> + <array> + <dict> + <key>start</key> + <array> + <dict> + <key>line</key><integer>539</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>539</integer> + <key>col</key><integer>5</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + <key>end</key> + <array> + <dict> + <key>line</key><integer>540</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>540</integer> + <key>col</key><integer>13</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + </dict> + </array> + </dict> + <dict> + <key>kind</key><string>event</string> + <key>location</key> + <dict> + <key>line</key><integer>542</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <key>ranges</key> + <array> + <array> + <dict> + <key>line</key><integer>542</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>542</integer> + <key>col</key><integer>7</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + </array> + <key>depth</key><integer>0</integer> + <key>extended_message</key> + <string>'a' declared without an initial value</string> + <key>message</key> + <string>'a' declared without an initial value</string> + </dict> + <dict> + <key>kind</key><string>control</string> + <key>edges</key> + <array> + <dict> + <key>start</key> + <array> + <dict> + <key>line</key><integer>542</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>542</integer> + <key>col</key><integer>5</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + <key>end</key> + <array> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + </dict> + </array> + </dict> + <dict> + <key>kind</key><string>control</string> + <key>edges</key> + <array> + <dict> + <key>start</key> + <array> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + <key>end</key> + <array> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>5</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>5</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + </dict> + </array> + </dict> + <dict> + <key>kind</key><string>event</string> + <key>location</key> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>5</integer> + <key>file</key><integer>0</integer> + </dict> + <key>ranges</key> + <array> + <array> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + </array> + </array> + <key>depth</key><integer>0</integer> + <key>extended_message</key> + <string>The left operand of '&' is a garbage value</string> + <key>message</key> + <string>The left operand of '&' is a garbage value</string> + </dict> + </array> + <key>macro_expansions</key> + <array> + <dict> + <key>location</key> + <dict> + <key>line</key><integer>540</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <key>name</key><string>bz44493_log</string> + <key>expansion</key><string>do { } while(0)</string> + </dict> + <dict> + <key>location</key> + <dict> + <key>line</key><integer>541</integer> + <key>col</key><integer>3</integer> + <key>file</key><integer>0</integer> + </dict> + <key>name</key><string>bz44493_log</string> + <key>expansion</key><string>do { } while(0)</string> + </dict> + </array> + <key>description</key><string>The left operand of '&' is a garbage value</string> + <key>category</key><string>Logic error</string> + <key>type</key><string>Result of operation is garbage or undefined</string> + <key>check_name</key><string>core.UndefinedBinaryOperatorResult</string> + <!-- This hash is experimental and going to change! --> + <key>issue_hash_content_of_line_in_context</key><string>7515419ef7ac803c938efbeaf5ed1c6f</string> + <key>issue_context_kind</key><string>function</string> + <key>issue_context</key><string>bz44493</string> + <key>issue_hash_function_offset</key><string>5</string> + <key>location</key> + <dict> + <key>line</key><integer>543</integer> + <key>col</key><integer>5</integer> + <key>file</key><integer>0</integer> + </dict> + <key>ExecutedLines</key> + <dict> + <key>0</key> + <array> + <integer>538</integer> + <integer>539</integer> + <integer>540</integer> + <integer>541</integer> + <integer>542</integer> + <integer>543</integer> + </array> + </dict> + </dict> </array> <key>files</key> <array> Index: clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp +++ clang/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -1132,7 +1132,7 @@ std::string MacroName = PP.getSpelling(TheTok); const auto *II = PP.getIdentifierInfo(MacroName); - assert(II && "Failed to acquire the IndetifierInfo for the macro!"); + assert(II && "Failed to acquire the IdentifierInfo for the macro!"); const MacroInfo *MI = getMacroInfoForLocation(PP, SM, II, ExpanLoc); // assert(MI && "The macro must've been defined at it's expansion location!"); @@ -1180,9 +1180,16 @@ // * > 1, then tok::comma is a part of the current arg. int ParenthesesDepth = 1; - // 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__"); + // If we encounter the variadic arg, we will lex until the closing + // tok::r_paren, even if we lex a tok::comma and ParanthesesDepth == 1. + const IdentifierInfo *VariadicParamII = PP.getIdentifierInfo("__VA_ARGS__"); + if (MI->isGNUVarargs()) { + // If macro uses GNU-style variadic args, the param name is user-supplied, + // an not "__VA_ARGS__". E.g.: + // #define FOO(a, b, myvargs...) + // In this case, just use the last parameter: + VariadicParamII = *(MacroParams.rbegin()); + } for (const IdentifierInfo *CurrParamII : MacroParams) { MacroParamMap::mapped_type ArgTokens; @@ -1201,9 +1208,8 @@ // Lex the first token of the next macro parameter. TStream.next(TheTok); - while ( - !(ParenthesesDepth == 1 && - (CurrParamII == __VA_ARGS__II ? false : TheTok.is(tok::comma)))) { + while (CurrParamII == VariadicParamII || ParenthesesDepth != 1 || + !TheTok.is(tok::comma)) { assert(TheTok.isNot(tok::eof) && "EOF encountered while looking for expanded macro args!"); @@ -1226,7 +1232,7 @@ // PARAMS_RESOLVE_TO_VA_ARGS(__VA_ARGS__); // // ^~~~~~~~~~~ Variadic parameter here // - // void mulitpleParamsResolveToVA_ARGS(void) { + // void multipleParamsResolveToVA_ARGS(void) { // int x = 1; // DISPATCH(x, "LF1M healer"); // Multiple arguments are mapped to // // a single __VA_ARGS__ parameter. @@ -1237,8 +1243,8 @@ // PARAMS_RESOLVE_TO_VA_ARGS. By this point, we already noted during // the processing of DISPATCH what __VA_ARGS__ maps to, so we'll // retrieve the next series of tokens from that. - if (TheTok.getIdentifierInfo() == __VA_ARGS__II) { - TStream.injectRange(PrevParamMap.at(__VA_ARGS__II)); + if (TheTok.getIdentifierInfo() == VariadicParamII) { + TStream.injectRange(PrevParamMap.at(VariadicParamII)); TStream.next(TheTok); continue; } @@ -1248,9 +1254,9 @@ TStream.next(TheTok); } } else { - assert(CurrParamII == __VA_ARGS__II && + assert(CurrParamII == VariadicParamII && "No more macro arguments are found, but the current parameter " - "isn't __VA_ARGS__!"); + "isn't the variadic arg!"); } ParamMap.emplace(CurrParamII, std::move(ArgTokens));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits