diff --git a/ir/base.def b/ir/base.def index aaaa1f4b4c9..101515ecf08 100644 --- a/ir/base.def +++ b/ir/base.def @@ -332,17 +332,58 @@ class Annotation { Vector, IndexedVector> body; - inline auto &getUnparsed() { return std::get(body); } - inline const auto &getUnparsed() const { return std::get(body); } - inline auto &getExpr() { return std::get(body); } - inline const auto &getExpr() const { return std::get(body); } + inline auto &getUnparsed() { + try { + return std::get(body); + } catch (const std::bad_variant_access &) { + BUG("Annotation has been parsed already."); + } + } + inline const auto &getUnparsed() const { + try { + return std::get(body); + } catch (const std::bad_variant_access &) { + BUG("Annotation has been parsed already."); + } + } + inline auto &getExpr() { + try { + return std::get(body); + } catch (const std::bad_variant_access &) { + BUG("Annotation does not contain an expression list."); + } + } + inline const auto &getExpr() const { + try { + return std::get(body); + } catch (const std::bad_variant_access &) { + BUG("Annotation does not contain an expression list."); + } + } inline Expression getExpr(size_t idx) const { - const auto &expr = getExpr(); - BUG_CHECK(idx < expr.size(), "invalid annotation expression index"); - return expr[idx]; + try { + const auto &expr = getExpr(); + return expr[idx]; + } catch (const std::out_of_range &) { + BUG("invalid annotation expression index"); + } catch (const std::bad_variant_access &) { + BUG("Annotation does not contain an expression list."); + } + } + inline auto &getKV() { + try { + return std::get(body); + } catch (const std::bad_variant_access &) { + BUG("Annotation does not contain a key-value list."); + } + } + inline const auto &getKV() const { + try { + return std::get(body); + } catch (const std::bad_variant_access &) { + BUG("Annotation does not contain a key-value list."); + } } - inline auto &getKV() { return std::get(body); } - inline const auto &getKV() const { return std::get(body); } /// If this is true this is a structured annotation, and there are some /// constraints on its contents.