use midenc_hir::{
derive::{EffectOpInterface, OpParser, OpPrinter, operation},
effects::*,
traits::*,
*,
};
use crate::*;
#[derive(EffectOpInterface, OpPrinter, OpParser)]
#[operation(
dialect = UndefinedBehaviorDialect,
traits(ConstantLike),
implements(InferTypeOpInterface, MemoryEffectOpInterface, Foldable, OpPrinter)
)]
pub struct Poison {
#[attr(hidden)]
value: PoisonAttr,
#[result]
result: AnyType,
}
impl Foldable for Poison {
fn fold(&self, results: &mut SmallVec<[OpFoldResult; 1]>) -> FoldResult {
results.push(OpFoldResult::Attribute(self.value));
FoldResult::Ok(())
}
fn fold_with(
&self,
_operands: &[Option<AttributeRef>],
results: &mut SmallVec<[OpFoldResult; 1]>,
) -> FoldResult {
results.push(OpFoldResult::Attribute(self.value));
FoldResult::Ok(())
}
}
impl InferTypeOpInterface for Poison {
fn infer_return_types(&mut self, _context: &Context) -> Result<(), Report> {
let poison_ty = self.get_value().clone();
self.result_mut().set_type(poison_ty);
Ok(())
}
}
#[derive(EffectOpInterface, OpPrinter, OpParser)]
#[operation(
dialect = UndefinedBehaviorDialect,
traits(Terminator),
implements(MemoryEffectOpInterface, OpPrinter)
)]
#[effects(MemoryEffect(MemoryEffect::Write))]
pub struct Unreachable {}