/* This testcase is part of GDB, the GNU debugger.
Copyright 2002-2018 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 . */
struct aggregate
{
int i1;
int i2;
int i3;
};
void keepalive_float (double *var) { }
void keepalive_int (int *var) { }
void keepalive_aggregate (struct aggregate *var) { }
#define PREFIXIFY(PREFIX, VAR) \
PREFIX ## _ ## VAR
#define DEF_STATICS(PREFIX) \
static int PREFIXIFY(PREFIX, s_var_int) = 4; \
static double PREFIXIFY(PREFIX, s_var_float) = 3.14f; \
static struct aggregate PREFIXIFY(PREFIX, s_var_aggregate) \
= { 1, 2, 3 }; \
\
keepalive_int (&PREFIXIFY(PREFIX, s_var_int)); \
keepalive_float (&PREFIXIFY(PREFIX, s_var_float)); \
keepalive_aggregate (&PREFIXIFY(PREFIX, s_var_aggregate));
#ifdef __cplusplus
struct S
{
void inline_method ()
{
DEF_STATICS (S_IM);
}
static void static_inline_method ()
{
DEF_STATICS (S_SIM);
}
void method ();
void method () const;
void method () volatile;
void method () volatile const;
static void static_method ();
};
S s;
const S c_s = {};
volatile S v_s = {};
const volatile S cv_s = {};
void
S::method ()
{
DEF_STATICS (S_M);
}
void
S::method () const
{
DEF_STATICS (S_M_C);
}
void
S::method () volatile
{
DEF_STATICS (S_M_V);
}
void
S::method () const volatile
{
DEF_STATICS (S_M_CV);
}
void
S::static_method ()
{
DEF_STATICS (S_SM);
}
template
struct S2
{
void method ();
static void static_method ();
void inline_method ()
{
DEF_STATICS (S2_IM);
}
static void static_inline_method ()
{
DEF_STATICS (S2_SIM);
}
};
template
void
S2::method ()
{
DEF_STATICS (S2_M);
}
template
void
S2::static_method ()
{
DEF_STATICS (S2_SM);
}
S2 s2;
#endif
void
free_func (void)
{
DEF_STATICS (FF);
}
static inline void
free_inline_func (void)
{
DEF_STATICS (FIF);
}
int
main ()
{
for (int i = 0; i < 1000; i++)
{
free_func ();
free_inline_func ();
#ifdef __cplusplus
s.method ();
c_s.method ();
v_s.method ();
cv_s.method ();
s.inline_method ();
S::static_method ();
S::static_inline_method ();
s2.method ();
s2.inline_method ();
S2::static_method ();
S2::static_inline_method ();
#endif
}
return 0;
}