<p dir="ltr">Seems a much more principled solution yes. </p>
<br><div class="gmail_quote"><div dir="ltr">On Fri, Apr 29, 2016, 9:19 AM Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">hfinkel updated this revision to Diff 55610.<br>
hfinkel added a comment.<br>
<br>
Use David's suggested approach: Modify the preferred expression location for member calls. If the callee has a valid location (not all do), then use that. Otherwise, fall back to the starting location. This seems to cleanly fix the debug-info problem.<br>
<br>
<br>
<a href="http://reviews.llvm.org/D19708" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19708</a><br>
<br>
Files:<br>
  include/clang/AST/ExprCXX.h<br>
  test/CodeGenCXX/debug-info-member-call.cpp<br>
<br>
Index: test/CodeGenCXX/debug-info-member-call.cpp<br>
===================================================================<br>
--- /dev/null<br>
+++ test/CodeGenCXX/debug-info-member-call.cpp<br>
@@ -0,0 +1,24 @@<br>
+// RUN: %clang_cc1 -triple x86_64-unknown_unknown -emit-llvm -debug-info-kind=standalone -dwarf-column-info %s -o - | FileCheck %s<br>
+void ext();<br>
+<br>
+struct Bar {<br>
+  void bar() { ext(); }<br>
+};<br>
+<br>
+struct Foo {<br>
+  Bar *b;<br>
+<br>
+  Bar *foo() { return b; }<br>
+};<br>
+<br>
+void test(Foo *f) {<br>
+  f->foo()->bar();<br>
+}<br>
+<br>
+// CHECK-LABEL: @_Z4testP3Foo<br>
+// CHECK: call {{.*}} @_ZN3Foo3fooEv{{.*}}, !dbg ![[CALL1LOC:.*]]<br>
+// CHECK: call void @_ZN3Bar3barEv{{.*}}, !dbg ![[CALL2LOC:.*]]<br>
+<br>
+// CHECK: ![[CALL1LOC]] = !DILocation(line: [[LINE:[0-9]+]], column: 6,<br>
+// CHECK: ![[CALL2LOC]] = !DILocation(line: [[LINE]], column: 13,<br>
+<br>
Index: include/clang/AST/ExprCXX.h<br>
===================================================================<br>
--- include/clang/AST/ExprCXX.h<br>
+++ include/clang/AST/ExprCXX.h<br>
@@ -145,6 +145,14 @@<br>
   /// FIXME: Returns 0 for member pointer call exprs.<br>
   CXXRecordDecl *getRecordDecl() const;<br>
<br>
+  SourceLocation getExprLoc() const LLVM_READONLY {<br>
+    SourceLocation CLoc = getCallee()->getExprLoc();<br>
+    if (CLoc.isValid())<br>
+      return CLoc;<br>
+<br>
+    return getLocStart();<br>
+  }<br>
+<br>
   static bool classof(const Stmt *T) {<br>
     return T->getStmtClass() == CXXMemberCallExprClass;<br>
   }<br>
<br>
<br>
</blockquote></div>