- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/PtrsAssignable.cc
rf07c1e6 recd4923 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; … … 61 59 return -1; 62 60 } else { 63 P assVisitor<PtrsAssignable>ptrs( dest, env );61 PtrsAssignable ptrs( dest, env ); 64 62 src->accept( ptrs ); 65 return ptrs. pass.get_result();63 return ptrs.get_result(); 66 64 } // if 67 65 } … … 69 67 PtrsAssignable::PtrsAssignable( Type *dest, const TypeEnvironment &env ) : dest( dest ), result( 0 ), env( env ) {} 70 68 71 void PtrsAssignable:: postvisit( VoidType * ) {69 void PtrsAssignable::visit( VoidType * ) { 72 70 // T * = void * is disallowed - this is a change from C, where any 73 71 // void * can be assigned or passed to a non-void pointer without a cast. 74 72 } 75 73 76 void PtrsAssignable:: postvisit( __attribute__((unused)) BasicType *basicType ) {}77 void PtrsAssignable:: postvisit( __attribute__((unused)) PointerType *pointerType ) {}78 void PtrsAssignable:: postvisit( __attribute__((unused)) ArrayType *arrayType ) {}79 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 ) {} 80 78 81 void PtrsAssignable:: postvisit( __attribute__((unused)) StructInstType *inst ) {}82 void PtrsAssignable:: postvisit( __attribute__((unused)) UnionInstType *inst ) {}79 void PtrsAssignable::visit( __attribute__((unused)) StructInstType *inst ) {} 80 void PtrsAssignable::visit( __attribute__((unused)) UnionInstType *inst ) {} 83 81 84 void PtrsAssignable:: postvisit( EnumInstType * ) {82 void PtrsAssignable::visit( EnumInstType * ) { 85 83 if ( dynamic_cast< BasicType* >( dest ) ) { 86 84 // int * = E *, etc. is safe. This isn't technically correct, as each … … 93 91 } 94 92 95 void PtrsAssignable:: postvisit( __attribute__((unused)) TraitInstType *inst ) {}96 void PtrsAssignable:: postvisit( TypeInstType *inst ) {93 void PtrsAssignable::visit( __attribute__((unused)) TraitInstType *inst ) {} 94 void PtrsAssignable::visit( TypeInstType *inst ) { 97 95 EqvClass eqvClass; 98 96 if ( env.lookup( inst->get_name(), eqvClass ) && eqvClass.type ) { … … 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.