Source code

Revision control

Copy as Markdown

Other Tools

#define MOZ_RUNINIT __attribute__((annotate("moz_global_var")))
#define MOZ_CONSTINIT [[clang::require_constant_initialization]]
#define MOZ_GLOBAL_CLASS __attribute__((annotate("moz_global_class")))
// POD Type
struct POD {
int i, j, k;
};
POD g0;
// constexpr constructor
struct ConstexprGlobal {
int i, j, k;
constexpr ConstexprGlobal() : i(0), j(1), k(2) {}
};
ConstexprGlobal g1;
// Global with extern constructor
struct Global {
Global();
};
Global g2; // expected-error {{Global variable has runtime initialisation, try to remove it, make it constexpr or MOZ_CONSTINIT if possible, or as a last resort flag it as MOZ_RUNINIT.}}
// Global with extern constructor *but* marked MOZ_GLOBAL_CLASS
struct MOZ_GLOBAL_CLASS GlobalCls {
GlobalCls();
};
GlobalCls g3;
// Global with extern constructor *but* marked MOZ_RUNINIT
struct RuninitGlobal {
RuninitGlobal();
};
MOZ_RUNINIT RuninitGlobal g4;
// Global with constexpr constructor *but* marked MOZ_RUNINIT
struct InvalidRuninitGlobal {
constexpr InvalidRuninitGlobal() {}
};
MOZ_RUNINIT InvalidRuninitGlobal g5; // expected-error {{Global variable flagged as MOZ_RUNINIT but actually has constant initialisation. Consider flagging it as constexpr or MOZ_CONSTINIT instead.}}
// Static variable with extern constructor
Global g6; // expected-error {{Global variable has runtime initialisation, try to remove it, make it constexpr or MOZ_CONSTINIT if possible, or as a last resort flag it as MOZ_RUNINIT.}}
// Static variable with extern constructor within a function
void foo() { static Global g7; }
// Global variable with extern constructor in a namespace
namespace bar {Global g8;} // expected-error {{Global variable has runtime initialisation, try to remove it, make it constexpr or MOZ_CONSTINIT if possible, or as a last resort flag it as MOZ_RUNINIT.}}
// Static variable with extern constructor in a class
class foobar {static Global g9;};
Global foobar::g9; // expected-error {{Global variable has runtime initialisation, try to remove it, make it constexpr or MOZ_CONSTINIT if possible, or as a last resort flag it as MOZ_RUNINIT.}}