Index: cfe/trunk/include/clang/AST/ExprCXX.h =================================================================== --- cfe/trunk/include/clang/AST/ExprCXX.h +++ cfe/trunk/include/clang/AST/ExprCXX.h @@ -143,6 +143,14 @@ /// FIXME: Returns 0 for member pointer call exprs. CXXRecordDecl *getRecordDecl() const; + SourceLocation getExprLoc() const LLVM_READONLY { + SourceLocation CLoc = getCallee()->getExprLoc(); + if (CLoc.isValid()) + return CLoc; + + return getLocStart(); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == CXXMemberCallExprClass; } Index: cfe/trunk/test/CodeGenCXX/debug-info-member-call.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-member-call.cpp +++ cfe/trunk/test/CodeGenCXX/debug-info-member-call.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -triple x86_64-unknown_unknown -emit-llvm -debug-info-kind=standalone -dwarf-column-info %s -o - | FileCheck %s +void ext(); + +struct Bar { + void bar() { ext(); } +}; + +struct Foo { + Bar *b; + + Bar *foo() { return b; } +}; + +void test(Foo *f) { + f->foo()->bar(); +} + +// CHECK-LABEL: @_Z4testP3Foo +// CHECK: call {{.*}} @_ZN3Foo3fooEv{{.*}}, !dbg ![[CALL1LOC:.*]] +// CHECK: call void @_ZN3Bar3barEv{{.*}}, !dbg ![[CALL2LOC:.*]] + +// CHECK: ![[CALL1LOC]] = !DILocation(line: [[LINE:[0-9]+]], column: 6, +// CHECK: ![[CALL2LOC]] = !DILocation(line: [[LINE]], column: 13, +