Changeset fc12f05 for src/ResolvExpr/AdjustExprType.cc
- Timestamp:
- Nov 13, 2023, 3:43:43 AM (2 years ago)
- Branches:
- master
- Children:
- 25f2798
- Parents:
- 0030b508 (diff), 2174191 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AdjustExprType.cc
r0030b508 rfc12f05 19 19 #include "AST/Type.hpp" 20 20 #include "AST/TypeEnvironment.hpp" 21 #include "Common/PassVisitor.h"22 #include "SymTab/Indexer.h" // for Indexer23 #include "SynTree/Declaration.h" // for TypeDecl, TypeDecl::Kind::Ftype24 #include "SynTree/Mutator.h" // for Mutator25 #include "SynTree/Type.h" // for PointerType, TypeInstType, Type26 #include "TypeEnvironment.h" // for EqvClass, TypeEnvironment27 21 28 22 namespace ResolvExpr { 29 30 namespace {31 class AdjustExprType_old final : public WithShortCircuiting {32 public:33 AdjustExprType_old( const TypeEnvironment & env, const SymTab::Indexer & indexer );34 void premutate( VoidType * ) { visit_children = false; }35 void premutate( BasicType * ) { visit_children = false; }36 void premutate( PointerType * ) { visit_children = false; }37 void premutate( ArrayType * ) { visit_children = false; }38 void premutate( FunctionType * ) { visit_children = false; }39 void premutate( StructInstType * ) { visit_children = false; }40 void premutate( UnionInstType * ) { visit_children = false; }41 void premutate( EnumInstType * ) { visit_children = false; }42 void premutate( TraitInstType * ) { visit_children = false; }43 void premutate( TypeInstType * ) { visit_children = false; }44 void premutate( TupleType * ) { visit_children = false; }45 void premutate( VarArgsType * ) { visit_children = false; }46 void premutate( ZeroType * ) { visit_children = false; }47 void premutate( OneType * ) { visit_children = false; }48 49 Type * postmutate( ArrayType * arrayType );50 Type * postmutate( FunctionType * functionType );51 Type * postmutate( TypeInstType * aggregateUseType );52 53 private:54 const TypeEnvironment & env;55 const SymTab::Indexer & indexer;56 };57 58 AdjustExprType_old::AdjustExprType_old( const TypeEnvironment &env, const SymTab::Indexer &indexer )59 : env( env ), indexer( indexer ) {60 }61 62 Type * AdjustExprType_old::postmutate( ArrayType * arrayType ) {63 PointerType * pointerType = new PointerType{ arrayType->get_qualifiers(), arrayType->base };64 arrayType->base = nullptr;65 delete arrayType;66 return pointerType;67 }68 69 Type * AdjustExprType_old::postmutate( FunctionType * functionType ) {70 return new PointerType{ Type::Qualifiers(), functionType };71 }72 73 Type * AdjustExprType_old::postmutate( TypeInstType * typeInst ) {74 if ( const EqvClass * eqvClass = env.lookup( typeInst->get_name() ) ) {75 if ( eqvClass->data.kind == TypeDecl::Ftype ) {76 return new PointerType{ Type::Qualifiers(), typeInst };77 }78 } else if ( const NamedTypeDecl * ntDecl = indexer.lookupType( typeInst->get_name() ) ) {79 if ( const TypeDecl * tyDecl = dynamic_cast< const TypeDecl * >( ntDecl ) ) {80 if ( tyDecl->get_kind() == TypeDecl::Ftype ) {81 return new PointerType{ Type::Qualifiers(), typeInst };82 } // if83 } // if84 } // if85 return typeInst;86 }87 } // anonymous namespace88 89 void adjustExprType( Type *&type, const TypeEnvironment &env, const SymTab::Indexer &indexer ) {90 PassVisitor<AdjustExprType_old> adjuster( env, indexer );91 Type * newType = type->acceptMutator( adjuster );92 type = newType;93 }94 95 void adjustExprType( Type *& type ) {96 TypeEnvironment env;97 SymTab::Indexer indexer;98 adjustExprType( type, env, indexer );99 }100 23 101 24 namespace {
Note:
See TracChangeset
for help on using the changeset viewer.