summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.cp/koenig.exp
blob: b29e7a013a856f5ae035b4c04b839b254af16e54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Copyright 2008-2019 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

standard_testfile .cc

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug c++}] } {
     return -1
}

############################################

if ![runto_main] then {
    perror "couldn't run to breakpoint main"
    continue
}

# Test that koenig lookup finds correct function
gdb_test "p first(c)" "= 11"

# Change the number of parameters and position of
# the qualifying parameter
gdb_test "p second(0,0,c,0,0)" "= 33"

# Test evaluating function under EVAL_SKIP
gdb_test "p true || second(0,0,c,0,0)" "= true"

# Test the name "entry" being used for `variablename@entry' entry values.
gdb_test "p entry (c)" " = 44"

# Test that koenig lookup finds correct function
# even if it is overloaded
gdb_test "p first(0,c)" "= 22"

# Test that koenig lookup finds correct function
# when the argument is an expression
gdb_test "p first(b.c)" "= 11"

# test that resolutions can be made across namespaces
gdb_test "p foo(eo)"         "= 1"
gdb_test "p foo(eo, eo)"     "= 2"
gdb_test "p foo(eo, eo, 1)"  "= 3"
gdb_test "p foo(fo, eo)"     "= 4"
gdb_test "p foo(1 ,fo, eo)"  "= 5"
gdb_test "p foo(go, fo, eo)" "= 6"

#test that gdb fails gracefully
gdb_test "p fake(eo)" "No symbol \"fake\" in current context."
gdb_test "p foo (fake)" "No symbol \"fake\" in current context."

#test that namespaces of base classes are searched
gdb_test "p foo(io)" "= 7"
gdb_test "p foo(ix)" "Cannot resolve function foo to any overloaded instance"

#test for other types
gdb_test "p foo(ju)" "= 8"
gdb_test "p foo(js)" "= 9"
gdb_test "p foo(je)" "= 10"

#test for class members
setup_xfail "*-*-*"
gdb_test "p foo(jab)" "= 11"

gdb_test "p foo(jap)" "= 12"
gdb_test "p foo(japp)" "= 13"
gdb_test "p foo(jca)" "= 14"

#test overload resolution
gdb_test "p foo(ko,1)" "= 15"
gdb_test "p foo(ko,1.0f)" "= 16"
setup_xfail "*-*-*"
gdb_test "p bar(ko,1)" "= -1"

#test lookup of objects belonging to nested namespaces
gdb_test "p foo(labo)" "= 17"

#test koenig found function do not compete with qualified
#names
gdb_test "p ma.foo('a')" "= 18"
gdb_test "p foo(ma,'a')" "= 19"
gdb_test "p M::N::foo(ma,'a')" "= 20"
gdb_test "p M::FAKE::foo(ma,'a')" "No type \"FAKE\" within class or namespace \"M\"."
gdb_test "p M::N::fake(ma,'a')" "No symbol \"fake\" in namespace \"M::N\"."

gdb_test "p M::bar('a')" "= 21"
gdb_test "p M::N::bar('a')" "= 22"

#test that lookup supports typedef
gdb_test "p foo(ttoa, 'a')" "= 23"

#test that lookup is not thwarted by anonymous types
gdb_test "p foo (p_union)" \
  "Cannot resolve function foo to any overloaded instance"

# test lookup of namespace user-defined operators
# and overload resolution:

# within class
gdb_test "p q == 5" "= 24"
gdb_test "p q == 5.0f" "= 25"

# within namespace
gdb_test "p q != 5" "= 27"
gdb_test "p q != 5.0f" "= 28"

# across namespace and class
gdb_test "p q + 5.0f" "= 26"
gdb_test "p q + 5" "= 29"

# some unary operators for good measure
# Cannot resolve function operator++ to any overloaded instance
gdb_test "p ++q" "= 30"

# Test that koening lookup does not affect
# member variable lookup.
gdb_test "p r.rfoo()" "= 31"

# Do the same from inside class R.
gdb_breakpoint [gdb_get_line_number "marker1"]
gdb_continue_to_breakpoint "marker1"

gdb_test "p rfoo()" "= 31"
gdb_test "p this->rfoo()" "= 31"