Artifact b53ae9166bdaa08e36cb12e2764071c1f7200e5b20a652e52aa59a130314039f:
- File
bs/cir/instruction.cpp
— part of check-in
[9b058524b4]
at
2021-02-18 19:35:07
on branch trunk
— Implemented reference initialization, so reference local variables can now be declared, and added a typechecking rule preventing template variables to bind to reference types.
Then fixed a MILLION horrible problems caused by all that. Now almost everything works again. *sobs* (user: achavasse size: 2154)
#include "cir/cir.h" namespace goose::cir { bool Instruction::canBeExecuted() const { return visit( []< typename ET >( const ET& e ) { if constexpr( is_same_v< ET, monostate > ) return false; else if constexpr( is_same_v< ET, ptr< CFG > > ) return e->canBeExecuted(); else return e.canBeExecuted(); }, m_content ); } bool Instruction::canBeEagerlyEvaluated() const { return visit( []< typename ET >( const ET& e ) { if constexpr( is_same_v< ET, monostate > ) return false; else if constexpr( is_same_v< ET, ptr< CFG > > ) return e->canBeEagerlyEvaluated(); else return e.canBeEagerlyEvaluated(); }, m_content ); } ostream& operator<<( ostream& out, const Instruction& inst ) { return visit( [&]< typename ET >( const ET& e ) -> ostream& { if constexpr( is_same_v< ET, monostate > ) return out << "NIL"; else if constexpr( is_same_v< ET, ptr< CFG > > ) return out << "NESTED_CFG"; else return out << e; }, inst.m_content ); } ostream& operator<<( ostream& out, const Select& ins ) { out << "SELECT(" << ins.m_memberIndex << ", "; if( ins.m_baseAddr ) out << *ins.m_baseAddr; else out << "null" ; return out << ')'; } ostream& operator<<( ostream& out, const Load& ins ) { out << "LOAD("; if( ins.m_addr ) out << *ins.m_addr; else out << "null"; return out << ", " << ins.m_type << ')'; } ostream& operator<<( ostream& out, const Store& ins ) { out << "STORE("; if( ins.m_addr ) out << *ins.m_addr; else out << "null"; return out << ", " << ins.m_val << ')'; } bool Store::canBeEagerlyEvaluated() const { return m_addr && CanValueBeEagerlyEvaluated( m_val ); } }