]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.cp/meth-typedefs.cc
update copyright year range in GDB files
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.cp / meth-typedefs.cc
1 /* This testcase is part of GDB, the GNU debugger.
2
3 Copyright 2011-2017 Free Software Foundation, Inc.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 Contributed by Red Hat, originally written by Keith Seitz. */
19
20 #include <stdlib.h>
21
22 typedef const char* const* my_type;
23 typedef int my_type_2;
24 typedef my_type my_other_type;
25 typedef my_type_2 my_other_type_2;
26 typedef unsigned long CORE_ADDR;
27 typedef enum {E_A, E_B, E_C} anon_enum;
28 typedef struct {int a; char b;} anon_struct;
29 typedef union {int a; char b;} anon_union;
30 typedef anon_enum aenum;
31 typedef anon_struct astruct;
32 typedef anon_union aunion;
33
34 typedef void (*fptr1) (my_other_type);
35 typedef void (*fptr2) (fptr1, my_other_type_2);
36 typedef void (*fptr3) (fptr2, my_other_type);
37 typedef void (*fptr4) (anon_enum a, anon_struct const& b, anon_union const*** c);
38
39 namespace A
40 {
41 class foo
42 {
43 public:
44 foo (void) { }
45 foo (my_other_type a) { } // A::FOO::foo(my_other_type)
46 foo (my_other_type_2 a) { } // A::FOO::foo(my_other_type_2)
47 foo (my_other_type_2 a, const my_other_type b) { } // A::FOO::foo(my_other_type_2, const my_other_type)
48 foo (fptr3) { } // A::FOO::foo(fptr3)
49 foo (fptr1* a) { } // A::FOO::foo(fptr1*)
50 foo (CORE_ADDR (*) [10]) { } // A::FOO::foo(CORE_ADDR (*) [10])
51 foo (aenum a, astruct const& b, aunion const*** c) { } // A::FOO::foo(aenum, astruct const&, aunion const***)
52
53 void test (my_other_type a) { } // A::FOO::test(my_other_type)
54 void test (my_other_type_2 a) { } // A::FOO::test(my_other_type_2)
55 void test (my_other_type_2 a, const my_other_type b) { } // A::FOO::test(my_other_type_2, const my_other_type)
56 void test (fptr3 a) { } // A::FOO::test(fptr3)
57 void test (fptr1* a) { } // A::FOO::test(fptr1*)
58 void test (CORE_ADDR (*) [10]) { } // A::FOO::test(CORE_ADDR (*) [10])
59 void test (aenum a, astruct const& b, aunion const*** c) { }; // A::FOO::test(aenum, astruct const&, aunion const***)
60 };
61
62 typedef foo FOO;
63 };
64
65 namespace B
66 {
67 void
68 test (my_other_type foo) { } // B::test(my_other_type)
69
70 void
71 test (aenum a, astruct const& b, aunion const*** c) { } // B::test(aenum, astruct const&, aunion const***)
72
73 template <typename T1, typename T2>
74 void test (T1 a, T2 b) { } // B::test (T1, T2)
75
76 template <>
77 void test (my_other_type foo, my_other_type_2) { } // B::test<my_other_type, my_other_type_2>(my_other_type, my_other_type_2)
78 };
79
80 namespace a
81 {
82 namespace b
83 {
84 namespace c
85 {
86 namespace d
87 {
88 class bar { };
89 }
90 }
91
92 typedef c::d::bar BAR;
93 }
94 }
95
96 typedef a::b::BAR _BAR_;
97
98 template <typename T1, typename T2>
99 void test (T1 a, T2 b) {} // test (T1, T2)
100
101 template <>
102 void test (my_other_type foo, my_other_type_2) { } // test<my_other_type, my_other_type_2>(my_other_type, my_other_type_2)
103
104 void
105 test (my_other_type foo) { } // test(my_other_type)
106
107 void
108 test (_BAR_ &b) { } // test(_BAR_&)
109
110 void
111 test (aenum a, astruct const& b, aunion const*** c) { } // test(aenum, astruct const&, aunion const***)
112
113 int
114 main (void)
115 {
116 A::FOO my_foo;
117 fptr1 fptr;
118 astruct as = { 0, 0 };
119 aunion const au = { 0 };
120 aunion const* aup = &au;
121 aunion const** aupp = &aup;
122 aunion const*** auppp = &aupp;
123
124 my_foo.test (static_cast<my_other_type> (NULL));
125 my_foo.test (0);
126 my_foo.test (0, static_cast<my_type> (NULL));
127 my_foo.test (static_cast<fptr3> (NULL));
128 my_foo.test (&fptr);
129 my_foo.test (static_cast<CORE_ADDR (*) [10]> (0));
130 my_foo.test (E_A, as, auppp);
131
132 B::test (static_cast<my_other_type> (NULL));
133 B::test (static_cast<my_other_type> (NULL), 0);
134 B::test (E_A, as, auppp);
135
136 test (static_cast<my_other_type> (NULL));
137 test<my_other_type, my_other_type_2> (static_cast<my_other_type> (NULL), 0);
138 test (E_A, as, auppp);
139
140 A::foo a (static_cast<my_other_type> (NULL));
141 A::foo b (0);
142 A::foo c (0, static_cast<my_other_type> (NULL));
143 A::foo d (static_cast<fptr3> (NULL));
144 A::foo e (&fptr);
145 A::foo f (static_cast<CORE_ADDR (*) [10]> (0));
146 A::foo g (E_A, as, auppp);
147
148 fptr4 f4;
149
150 return 0;
151 }