use crate::{
derive::{EffectOpInterface, OpParser, OpPrinter, operation},
dialects::test::*,
effects::*,
traits::*,
*,
};
#[derive(OpPrinter, OpParser, EffectOpInterface)]
#[operation(
dialect = TestDialect,
implements(MemoryEffectOpInterface, OpPrinter)
)]
pub struct Store {
#[operand]
#[effects(MemoryEffect(MemoryEffect::Write))]
addr: AnyPointer,
#[operand]
value: AnyType,
}
#[derive(OpPrinter, OpParser, EffectOpInterface)]
#[operation(
dialect = TestDialect,
implements(InferTypeOpInterface, MemoryEffectOpInterface, OpPrinter)
)]
pub struct Load {
#[operand]
#[effects(MemoryEffect(MemoryEffect::Read))]
addr: AnyPointer,
#[result]
result: AnyType,
}
impl InferTypeOpInterface for Load {
fn infer_return_types(&mut self, _context: &Context) -> Result<(), Report> {
let _span = self.span();
let pointee = {
let addr = self.addr();
let addr_value = addr.value();
addr_value.ty().pointee().cloned()
};
match pointee {
Some(pointee) => {
self.result_mut().set_type(pointee);
Ok(())
}
None => {
Ok(())
}
}
}
}