aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.cp
diff options
context:
space:
mode:
authorLeszek Swirski <leszeks@google.com>2018-01-25 16:20:47 +0000
committerSimon Marchi <simon.marchi@polymtl.ca>2018-02-01 22:34:20 -0500
commit59498c305e6f1db2a1ed8d44cb58f0d24ec092fe (patch)
tree5d02582d3c31d0ac78156328185204d487ece91f /gdb/testsuite/gdb.cp
parent17545aa1bfa291def4674c6700c1c7a3575ee5c1 (diff)
downloadfsf-binutils-gdb-59498c305e6f1db2a1ed8d44cb58f0d24ec092fe.zip
fsf-binutils-gdb-59498c305e6f1db2a1ed8d44cb58f0d24ec092fe.tar.gz
fsf-binutils-gdb-59498c305e6f1db2a1ed8d44cb58f0d24ec092fe.tar.bz2
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 <map> 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.
Diffstat (limited to 'gdb/testsuite/gdb.cp')
-rw-r--r--gdb/testsuite/gdb.cp/filename.cc22
-rw-r--r--gdb/testsuite/gdb.cp/filename.exp20
2 files changed, 39 insertions, 3 deletions
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"