1*87659a17SAdrian Prantl // A bare-bones llvm::Optional reimplementation. 2*87659a17SAdrian Prantl 3*87659a17SAdrian Prantl template <typename T> struct MyOptionalStorage { 4*87659a17SAdrian Prantl MyOptionalStorage(T val) : value(val), hasVal(true) {} 5*87659a17SAdrian Prantl MyOptionalStorage() {} 6*87659a17SAdrian Prantl T value; 7*87659a17SAdrian Prantl bool hasVal = false; 8*87659a17SAdrian Prantl }; 9*87659a17SAdrian Prantl 10*87659a17SAdrian Prantl template <typename T> struct MyOptional { 11*87659a17SAdrian Prantl MyOptionalStorage<T> Storage; 12*87659a17SAdrian Prantl MyOptional(T val) : Storage(val) {} 13*87659a17SAdrian Prantl MyOptional() {} 14*87659a17SAdrian Prantl T &operator*() { return Storage.value; } 15*87659a17SAdrian Prantl }; 16*87659a17SAdrian Prantl 17*87659a17SAdrian Prantl void stop() {} 18*87659a17SAdrian Prantl 19*87659a17SAdrian Prantl int main(int argc, char **argv) { 20*87659a17SAdrian Prantl MyOptional<int> x, y = 42; 21*87659a17SAdrian Prantl stop(); // break here 22*87659a17SAdrian Prantl return *y; 23*87659a17SAdrian Prantl } 24*87659a17SAdrian Prantl 25*87659a17SAdrian Prantl // Produced from the assembler in 26*87659a17SAdrian Prantl // Shell/ScriptInterpreter/Python/Inputs/FormatterBytecode/formatter.py 27*87659a17SAdrian Prantl __attribute__((used, section("__DATA_CONST,__lldbformatters"))) unsigned char 28*87659a17SAdrian Prantl _MyOptional_type_summary[] = 29*87659a17SAdrian Prantl "\x01" // version 30*87659a17SAdrian Prantl "\xa4" // record size 31*87659a17SAdrian Prantl "\x01" // record size 32*87659a17SAdrian Prantl "\x10" // type name size 33*87659a17SAdrian Prantl "^MyOptional<.+>$" // type name 34*87659a17SAdrian Prantl "\x00" // flags 35*87659a17SAdrian Prantl "\x00" // sig_summary 36*87659a17SAdrian Prantl "\x8d" // program size 37*87659a17SAdrian Prantl "\x01" // program size 38*87659a17SAdrian Prantl "\x1\x22\x7Storage#\x12\x60\x1,C\x10\x1\x5\x11\x2\x1\x22\x6hasVal#" 39*87659a17SAdrian Prantl "\x12\x60\x1,\x10\x1e\x2\x22\x1b<could not read MyOptional>\x10G#!\x60 " 40*87659a17SAdrian Prantl "\x0P\x10\x6\x22\x4None\x10\x36\x1#\x15\x60 " 41*87659a17SAdrian Prantl "\x0#\x16\x60\x5\x22\x5value#\x12\x60\x5#\x17\x60\x1," 42*87659a17SAdrian Prantl "\x10\x6\x22\x4None\x10\x11\x1#\x0\x60\x1#R\x60\x10\x3# " 43*87659a17SAdrian Prantl "\x60\x10\x1\x2\x12\x12\x12\x12"; // summary function 44