1*fffe8c66SAdrian Prantl // A bare-bones llvm::Optional reimplementation. 2*fffe8c66SAdrian Prantl 3*fffe8c66SAdrian Prantl template <typename T> struct MyOptionalStorage { 4*fffe8c66SAdrian Prantl MyOptionalStorage(T val) : value(val), hasVal(true) {} 5*fffe8c66SAdrian Prantl MyOptionalStorage() {} 6*fffe8c66SAdrian Prantl T value; 7*fffe8c66SAdrian Prantl bool hasVal = false; 8*fffe8c66SAdrian Prantl }; 9*fffe8c66SAdrian Prantl 10*fffe8c66SAdrian Prantl template <typename T> struct MyOptional { 11*fffe8c66SAdrian Prantl MyOptionalStorage<T> Storage; 12*fffe8c66SAdrian Prantl MyOptional(T val) : Storage(val) {} 13*fffe8c66SAdrian Prantl MyOptional() {} 14*fffe8c66SAdrian Prantl T &operator*() { return Storage.value; } 15*fffe8c66SAdrian Prantl }; 16*fffe8c66SAdrian Prantl 17*fffe8c66SAdrian Prantl void stop() {} 18*fffe8c66SAdrian Prantl 19*fffe8c66SAdrian Prantl int main(int argc, char **argv) { 20*fffe8c66SAdrian Prantl MyOptional<int> x, y = 42; 21*fffe8c66SAdrian Prantl stop(); // break here 22*fffe8c66SAdrian Prantl return *y; 23*fffe8c66SAdrian Prantl } 24