67 lines
2.4 KiB
C++
67 lines
2.4 KiB
C++
#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 constinit initialisation. Consider flagging it as constexpr or MOZ_CONSTINIT instead.}}
|
|
constexpr InvalidRuninitGlobal g5a;
|
|
|
|
struct InvalidRuninitGlobal2 {
|
|
int i;
|
|
};
|
|
|
|
MOZ_RUNINIT InvalidRuninitGlobal2 g5b; // expected-error {{Global variable flagged as MOZ_RUNINIT but actually has constant initialisation. Consider removing the annotation or (as a last resort) flagging it as MOZ_GLOBINIT.}}
|
|
InvalidRuninitGlobal2 g5c;
|
|
|
|
// 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.}}
|