From 59498c305e6f1db2a1ed8d44cb58f0d24ec092fe Mon Sep 17 00:00:00 2001 From: Leszek Swirski Date: Thu, 25 Jan 2018 16:20:47 +0000 Subject: Do not classify C struct members as a filename There is existing logic in C/C++ expression parsing to avoid classifying names as a filename when they are a field on the this object. This change extends this logic to also avoid classifying names after a struct-op (-> or .) as a filename, which otherwise causes a syntax error. Thus, it is now possible in the file #include struct D { void map(); } D d; to call (gdb) print d.map() where previously this would have been a syntax error. Tested on gdb.cp/*.exp gdb/ChangeLog: * c-exp.y (lex_one_token, classify_name, yylex): Don't classify names after a structop as a filename gdb/testsuite/ChangeLog: * gdb.cp/filename.cc, gdb.cp/filename.exp: Test that member functions with the same name as an include file are parsed correctly. --- gdb/testsuite/gdb.cp/filename.cc | 22 +++++++++++++++++++++- gdb/testsuite/gdb.cp/filename.exp | 20 ++++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) (limited to 'gdb/testsuite/gdb.cp') diff --git a/gdb/testsuite/gdb.cp/filename.cc b/gdb/testsuite/gdb.cp/filename.cc index 45edf4e..d33ef78 100644 --- a/gdb/testsuite/gdb.cp/filename.cc +++ b/gdb/testsuite/gdb.cp/filename.cc @@ -26,11 +26,31 @@ public: } void m() { - /* stop here */ + /* stop inside C */ } }; +class D { +public: + int includefile(); + + void m() { + /* stop inside D */ + } +}; + +int D::includefile() { + return 24; +} + int main() { C c; + C* pc = &c; c.m(); + + D d; + D* pd = &d; + d.m(); + + /* stop outside */ } diff --git a/gdb/testsuite/gdb.cp/filename.exp b/gdb/testsuite/gdb.cp/filename.exp index 971ffe7..208179e 100644 --- a/gdb/testsuite/gdb.cp/filename.exp +++ b/gdb/testsuite/gdb.cp/filename.exp @@ -26,8 +26,24 @@ if ![runto_main] then { continue } -gdb_breakpoint [gdb_get_line_number "stop here"] -gdb_continue_to_breakpoint "stop here" +gdb_breakpoint [gdb_get_line_number "stop inside C"] +gdb_continue_to_breakpoint "stop inside C" gdb_test "print includefile\[0\]" " = 23" +gdb_test "print this->includefile\[0\]" " = 23" gdb_test "print 'includefile'::some_global" " = 27" + +gdb_breakpoint [gdb_get_line_number "stop inside D"] +gdb_continue_to_breakpoint "stop inside D" + +gdb_test "print includefile()" " = 24" +gdb_test "print this->includefile()" " = 24" +gdb_test "print 'includefile'::some_global" " = 27" + +gdb_breakpoint [gdb_get_line_number "stop outside"] +gdb_continue_to_breakpoint "stop outside" + +gdb_test "print c.includefile\[0\]" " = 23" +gdb_test "print pc->includefile\[0\]" " = 23" +gdb_test "print d.includefile()" " = 24" +gdb_test "print pd->includefile()" " = 24" -- cgit v1.1