You could simplify the test case further, down to just: struct foo { void bar(); }; void f(foo *f) { f->bar(); }
and check that the call instruction has the desired column (or if you want a test that doesn't depend on column info (you can force it on with a flag, but we might vary whether it's on by default based on target, etc, I'm not sure) you could put 'bar();' on a separate line from 'f->' and check the call was on the second line and not the first). Richard might be able to tell us whether there's a preferred place for a test for a change like this - should it be a debug info test, a diagnostic test, or perhaps just an ast dump test? Perhaps a test for the case where there is no valid callee would be good? Where does that come up - call through a member function pointer? On Fri, Apr 29, 2016 at 9:19 AM, Hal Finkel via cfe-commits < cfe-commits@lists.llvm.org> wrote: > hfinkel updated this revision to Diff 55610. > hfinkel added a comment. > > 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. > > > http://reviews.llvm.org/D19708 > > Files: > include/clang/AST/ExprCXX.h > test/CodeGenCXX/debug-info-member-call.cpp > > Index: test/CodeGenCXX/debug-info-member-call.cpp > =================================================================== > --- /dev/null > +++ 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, > + > Index: include/clang/AST/ExprCXX.h > =================================================================== > --- include/clang/AST/ExprCXX.h > +++ include/clang/AST/ExprCXX.h > @@ -145,6 +145,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; > } > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits