Automatic date update in version.in
[binutils-gdb.git] / gdb / testsuite / gdb.cp / temargs.cc
blob2f5d2a70ac1d41a2ccf302fcfe4c24a982a5d0c8
1 /* Template argument tests.
3 Copyright 2010-2024 Free Software Foundation, Inc.
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.
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.
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/>.
18 Please email any bugs, comments, and/or additions to this file to:
19 bug-gdb@gnu.org */
21 int a_global;
23 struct S
25 int f;
26 void somefunc() { }
29 template<typename T, int I, int *P, int S::*MP>
30 struct Base
32 template<typename Z>
33 struct Inner
35 void inner_m ()
37 // Breakpoint 2.
41 void base_m ()
43 // Breakpoint 1.
46 template<typename Q>
47 void templ_m ()
49 // Breakpoint 4.
53 template<typename T, int I, int *P, int S::*MP>
54 void func ()
56 // Breakpoint 3.
59 template<void (S::*F) ()>
60 struct K2
62 void k2_m ()
64 // Breakpoint 5.
68 // GCC PR debug/49546
69 struct S3
71 static void m (int x) {}
73 template <void (*F) (int)>
74 // or: template <void (F) (int)>
75 struct K3
77 void k3_m ()
79 F (0); // Breakpoint 6.
83 namespace pr24470
85 // From PR c++/24470
86 // This caused a gdb crash during startup.
88 template <int a> struct b {};
89 template <typename, typename> struct c {
90 template <long d> using e = b<d>;
91 void k(e<0>);
93 template <typename, template <typename, typename> class, unsigned long...>
94 struct m;
95 template <typename g, template <typename, typename> class h, unsigned long i>
96 struct m<g, h, i> {
97 using j = b<i>;
99 struct n {
100 template <typename g> using f = typename m<g, c, 0>::j;
103 n::f<int> l;
106 int main ()
108 Base<double, 23, &a_global, &S::f> base;
109 // Note that instantiating with P==0 does not work with g++.
110 // That would be worth testing, once g++ is fixed.
111 Base<long, 47, &a_global, &S::f>::Inner<float> inner;
112 K2<&S::somefunc> k2;
113 K3<&S3::m> k3;
114 // or: K3<S3::m> k3;
116 base.base_m ();
117 inner.inner_m ();
118 func<unsigned char, 91, &a_global, &S::f> ();
119 base.templ_m<short> ();
120 k2.k2_m ();
121 k3.k3_m ();
123 return 0;