1/* This testcase is part of GDB, the GNU debugger.
2
3   Copyright 2002-2023 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
18struct aggregate
19{
20  int i1;
21  int i2;
22  int i3;
23};
24
25void keepalive_float (double *var) { }
26void keepalive_int (int *var) { }
27void keepalive_aggregate (struct aggregate *var) { }
28
29#define PREFIXIFY(PREFIX, VAR)			\
30  PREFIX ## _ ## VAR
31
32#define DEF_STATICS(PREFIX)						\
33  static int PREFIXIFY(PREFIX, s_var_int) = 4;				\
34  static double PREFIXIFY(PREFIX, s_var_float) = 3.14f;			\
35  static struct aggregate PREFIXIFY(PREFIX, s_var_aggregate)		\
36    = { 1, 2, 3 };							\
37									\
38  keepalive_int (&PREFIXIFY(PREFIX, s_var_int));			\
39  keepalive_float (&PREFIXIFY(PREFIX, s_var_float));			\
40  keepalive_aggregate (&PREFIXIFY(PREFIX, s_var_aggregate));
41
42#ifdef __cplusplus
43
44struct S
45{
46  void inline_method ()
47  {
48    DEF_STATICS (S_IM);
49  }
50  static void static_inline_method ()
51  {
52    DEF_STATICS (S_SIM);
53  }
54
55  void method ();
56  void method () const;
57  void method () volatile;
58  void method () volatile const;
59
60  static void static_method ();
61};
62
63S s;
64const S c_s = {};
65volatile S v_s = {};
66const volatile S cv_s = {};
67
68void
69S::method ()
70{
71  DEF_STATICS (S_M);
72}
73
74void
75S::method () const
76{
77  DEF_STATICS (S_M_C);
78}
79
80void
81S::method () volatile
82{
83  DEF_STATICS (S_M_V);
84}
85
86void
87S::method () const volatile
88{
89  DEF_STATICS (S_M_CV);
90}
91
92void
93S::static_method ()
94{
95  DEF_STATICS (S_SM);
96}
97
98template <typename T>
99struct S2
100{
101  void method ();
102  static void static_method ();
103
104  void inline_method ()
105  {
106    DEF_STATICS (S2_IM);
107  }
108
109  static void static_inline_method ()
110  {
111    DEF_STATICS (S2_SIM);
112  }
113};
114
115template<typename T>
116void
117S2<T>::method ()
118{
119  DEF_STATICS (S2_M);
120}
121
122template<typename T>
123void
124S2<T>::static_method ()
125{
126  DEF_STATICS (S2_SM);
127}
128
129S2<int> s2;
130
131#endif
132
133void
134free_func (void)
135{
136  DEF_STATICS (FF);
137}
138
139static inline void
140free_inline_func (void)
141{
142  DEF_STATICS (FIF);
143}
144
145int
146main ()
147{
148  int i;
149
150  for (i = 0; i < 1000; i++)
151    {
152      free_func ();
153      free_inline_func ();
154
155#ifdef __cplusplus
156      s.method ();
157      c_s.method ();
158      v_s.method ();
159      cv_s.method ();
160      s.inline_method ();
161      S::static_method ();
162      S::static_inline_method ();
163
164      s2.method ();
165      s2.inline_method ();
166      S2<int>::static_method ();
167      S2<int>::static_inline_method ();
168#endif
169    }
170
171  return 0;
172}
173