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 , &quot;haha!&quot; ) </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 , &quot;haha!&quot; ) </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
  • [PATCH] D52986: [analyzer][... Umann Kristóf via Phabricator via cfe-commits

Reply via email to