1 /* Template argument tests.
2 
3    Copyright 2010-2020 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    Please email any bugs, comments, and/or additions to this file to:
19    bug-gdb@gnu.org  */
20 
21 int a_global;
22 
23 struct S
24 {
25   int f;
somefuncS26   void somefunc() { }
27 };
28 
29 template<typename T, int I, int *P, int S::*MP>
30 struct Base
31 {
32   template<typename Z>
33   struct Inner
34   {
inner_mBase::Inner35     void inner_m ()
36     {
37       // Breakpoint 2.
38     }
39   };
40 
base_mBase41   void base_m ()
42   {
43     // Breakpoint 1.
44   }
45 
46   template<typename Q>
templ_mBase47   void templ_m ()
48   {
49     // Breakpoint 4.
50   }
51 };
52 
53 template<typename T, int I, int *P, int S::*MP>
func()54 void func ()
55 {
56   // Breakpoint 3.
57 }
58 
59 template<void (S::*F) ()>
60 struct K2
61 {
k2_mK262   void k2_m ()
63   {
64     // Breakpoint 5.
65   }
66 };
67 
68 // GCC PR debug/49546
69 struct S3
70 {
mS371   static void m (int x) {}
72 };
73 template <void (*F) (int)>
74 // or: template <void (F) (int)>
75 struct K3
76 {
k3_mK377   void k3_m ()
78   {
79     F (0);	// Breakpoint 6.
80   }
81 };
82 
83 namespace pr24470
84 {
85 // From PR c++/24470
86 // This caused a gdb crash during startup.
87 
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>);
92 };
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>;
98 };
99 struct n {
100   template <typename g> using f = typename m<g, c, 0>::j;
101 };
102 
103 n::f<int> l;
104 }
105 
main()106 int main ()
107 {
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;
115 
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 ();
122 
123   return 0;
124 }
125