<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - Clang's source locations are too detailed for Visual Studio, breaking "step into specific""
   href="https://bugs.llvm.org/show_bug.cgi?id=34312">34312</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Clang's source locations are too detailed for Visual Studio, breaking "step into specific"
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>unspecified
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Windows NT
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>enhancement
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>LLVM Codegen
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>rnk@google.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Blocks</th>
          <td>28154
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Discovered by a Chromium developer: <a href="http://crbug.com/756175">http://crbug.com/756175</a>

The summary is that MSVC emits statement line information, not expression line
information. Consider this example:

/*  1 */ int g(int a, int b, int c, int d, int e, int f) {
/*  2 */   return a + b + c + d + e + f;
/*  3 */ }
/*  4 */ int x() { return 1; }
/*  5 */ int main() {
/*  6 */   return g(
/*  7 */       x(),
/*  8 */       x(),
/*  9 */       x(),
/* 10 */       x(),
/* 11 */       x(),
/* 12 */       x()
/* 13 */       );
/* 14 */ }


When compiled by clang (clang-cl -Z7 step.c), MS debuggers step through this
program by stopping at line 5, 12, 11, 10, 9, 8, 7, 6, and 14. When compiled
with MSVC, windbg and VS will stop on lines 5, 6, and 14.

In fact, you cannot break on lines 7-12 when debugging an MSVC binary. It will
only stop at the beginning of the statement. Perhaps to work around that
limitation, VS has a feature called "step into specific"
(<a href="https://msdn.microsoft.com/en-us/library/7ad07721(v=vs.100).aspx">https://msdn.microsoft.com/en-us/library/7ad07721(v=vs.100).aspx</a>): 

"""
To step into a specific function

1. Advance the execution point to the function call you want to step into. You
might use a breakpoint, Step Into, Step Over, or Run To Cursor.

2. Right-click the source window.

3. Click Step Into Specific and choose the function you want.
The debugger executes the function call and breaks at the beginning of the
selected function. The Step Into Specific command appears only if the execution
point is located on a line of code that contains a nested function.
"""

This feature only works when the function call you want to step into is within
the same line table entry, so all expressions within the same statement must
have the same location information in order for it to work.

The downside of implementing this is that it will reduce the accuracy of line
info in stack traces. Clang's line tables in my example will be able to
distinguish which call to x is on the stack, while MSVC's will not. We already
have -gcolumn-info, which essentially improves stack trace quality at the cost
of more confusing stepping behavior in the debugger, so I think we should make
this new behavior conditional on -gcodeview && !-gcolumn-info.

I suspect we can add the check to disable location information inside
`ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E)`, and then we can
modify CGStmt.cpp to apply debug locations when emitting statements.</pre>
        </div>
      </p>

        <div id="referenced">
          <hr style="border: 1px dashed #969696">
          <b>Referenced Bugs:</b>
          <ul>
              <li>
                [<a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - [meta] Add support for CodeView, the MSVC-compatible debug information format"
   href="https://bugs.llvm.org/show_bug.cgi?id=28154">Bug 28154</a>] [meta] Add support for CodeView, the MSVC-compatible debug information format
              </li>
          </ul>
        </div>
        <br>

      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>