- File:
-
- 1 edited
-
src/ResolvExpr/PtrsAssignable.cc (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/PtrsAssignable.cc
r00ac42e r4d5e57b 14 14 // 15 15 16 #include "Common/PassVisitor.h"17 16 #include "ResolvExpr/TypeEnvironment.h" // for EqvClass, TypeEnvironment 18 17 #include "SynTree/Type.h" // for TypeInstType, Type, BasicType … … 21 20 22 21 namespace ResolvExpr { 23 struct PtrsAssignable : public WithShortCircuiting { 22 class PtrsAssignable : public Visitor { 23 public: 24 24 PtrsAssignable( Type *dest, const TypeEnvironment &env ); 25 25 26 26 int get_result() const { return result; } 27 27 28 void previsit( Type * ) { visit_children = false; } 29 30 void postvisit( VoidType * voidType ); 31 void postvisit( BasicType * basicType ); 32 void postvisit( PointerType * pointerType ); 33 void postvisit( ArrayType * arrayType ); 34 void postvisit( FunctionType * functionType ); 35 void postvisit( StructInstType * inst ); 36 void postvisit( UnionInstType * inst ); 37 void postvisit( EnumInstType * inst ); 38 void postvisit( TraitInstType * inst ); 39 void postvisit( TypeInstType * inst ); 40 void postvisit( TupleType * tupleType ); 41 void postvisit( VarArgsType * varArgsType ); 42 void postvisit( ZeroType * zeroType ); 43 void postvisit( OneType * oneType ); 28 virtual void visit( VoidType *voidType ); 29 virtual void visit( BasicType *basicType ); 30 virtual void visit( PointerType *pointerType ); 31 virtual void visit( ArrayType *arrayType ); 32 virtual void visit( FunctionType *functionType ); 33 virtual void visit( StructInstType *inst ); 34 virtual void visit( UnionInstType *inst ); 35 virtual void visit( EnumInstType *inst ); 36 virtual void visit( TraitInstType *inst ); 37 virtual void visit( TypeInstType *inst ); 38 virtual void visit( TupleType *tupleType ); 39 virtual void visit( VarArgsType *varArgsType ); 40 virtual void visit( ZeroType *zeroType ); 41 virtual void visit( OneType *oneType ); 44 42 private: 45 43 Type *dest; … … 51 49 // std::cerr << "assignable: " << src << " | " << dest << std::endl; 52 50 if ( TypeInstType *destAsTypeInst = dynamic_cast< TypeInstType* >( dest ) ) { 53 if ( const EqvClass *eqvClass = env.lookup( destAsTypeInst->get_name() ) ) { 54 return ptrsAssignable( src, eqvClass->type, env ); 51 EqvClass eqvClass; 52 if ( env.lookup( destAsTypeInst->get_name(), eqvClass ) ) { 53 return ptrsAssignable( src, eqvClass.type, env ); 55 54 } // if 56 55 } // if … … 60 59 return -1; 61 60 } else { 62 P assVisitor<PtrsAssignable>ptrs( dest, env );61 PtrsAssignable ptrs( dest, env ); 63 62 src->accept( ptrs ); 64 return ptrs. pass.get_result();63 return ptrs.get_result(); 65 64 } // if 66 65 } … … 68 67 PtrsAssignable::PtrsAssignable( Type *dest, const TypeEnvironment &env ) : dest( dest ), result( 0 ), env( env ) {} 69 68 70 void PtrsAssignable:: postvisit( VoidType *) {69 void PtrsAssignable::visit( __attribute((unused)) VoidType *voidType ) { 71 70 // T * = void * is disallowed - this is a change from C, where any 72 71 // void * can be assigned or passed to a non-void pointer without a cast. 73 72 } 74 73 75 void PtrsAssignable:: postvisit( __attribute__((unused)) BasicType *basicType ) {}76 void PtrsAssignable:: postvisit( __attribute__((unused)) PointerType *pointerType ) {}77 void PtrsAssignable:: postvisit( __attribute__((unused)) ArrayType *arrayType ) {}78 void PtrsAssignable:: postvisit( __attribute__((unused)) FunctionType *functionType ) {}74 void PtrsAssignable::visit( __attribute__((unused)) BasicType *basicType ) {} 75 void PtrsAssignable::visit( __attribute__((unused)) PointerType *pointerType ) {} 76 void PtrsAssignable::visit( __attribute__((unused)) ArrayType *arrayType ) {} 77 void PtrsAssignable::visit( __attribute__((unused)) FunctionType *functionType ) {} 79 78 80 void PtrsAssignable:: postvisit( __attribute__((unused)) StructInstType *inst ) {}81 void PtrsAssignable:: postvisit( __attribute__((unused)) UnionInstType *inst ) {}79 void PtrsAssignable::visit( __attribute__((unused)) StructInstType *inst ) {} 80 void PtrsAssignable::visit( __attribute__((unused)) UnionInstType *inst ) {} 82 81 83 void PtrsAssignable:: postvisit( EnumInstType * ) {82 void PtrsAssignable::visit( EnumInstType * ) { 84 83 if ( dynamic_cast< BasicType* >( dest ) ) { 85 84 // int * = E *, etc. is safe. This isn't technically correct, as each … … 92 91 } 93 92 94 void PtrsAssignable::postvisit( __attribute__((unused)) TraitInstType *inst ) {} 95 void PtrsAssignable::postvisit( TypeInstType *inst ) { 96 if ( const EqvClass *eqvClass = env.lookup( inst->get_name() ) ) { 97 if ( eqvClass->type ) { 98 // T * = S * for any S depends on the type bound to T 99 result = ptrsAssignable( eqvClass->type, dest, env ); 100 } 93 void PtrsAssignable::visit( __attribute__((unused)) TraitInstType *inst ) {} 94 void PtrsAssignable::visit( TypeInstType *inst ) { 95 EqvClass eqvClass; 96 if ( env.lookup( inst->get_name(), eqvClass ) && eqvClass.type ) { 97 // T * = S * for any S depends on the type bound to T 98 result = ptrsAssignable( eqvClass.type, dest, env ); 101 99 } // if 102 100 } 103 101 104 void PtrsAssignable:: postvisit( __attribute__((unused)) TupleType *tupleType ) {}105 void PtrsAssignable:: postvisit( __attribute__((unused)) VarArgsType *varArgsType ) {}106 void PtrsAssignable:: postvisit( __attribute__((unused)) ZeroType *zeroType ) {}107 void PtrsAssignable:: postvisit( __attribute__((unused)) OneType *oneType ) {}102 void PtrsAssignable::visit( __attribute__((unused)) TupleType *tupleType ) {} 103 void PtrsAssignable::visit( __attribute__((unused)) VarArgsType *varArgsType ) {} 104 void PtrsAssignable::visit( __attribute__((unused)) ZeroType *zeroType ) {} 105 void PtrsAssignable::visit( __attribute__((unused)) OneType *oneType ) {} 108 106 109 107 } // namespace ResolvExpr
Note:
See TracChangeset
for help on using the changeset viewer.