- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Validate/GenericParameter.cpp
rcaf06aa rf02f546 16 16 #include "GenericParameter.hpp" 17 17 18 #include "AST/Copy.hpp"19 18 #include "AST/Decl.hpp" 20 19 #include "AST/Expr.hpp" … … 165 164 166 165 struct TranslateDimensionCore : 167 public WithNoIdSymbolTable, public ast::WithGuards { 166 public WithNoIdSymbolTable, public ast::WithGuards, 167 public ast::WithVisitorRef<TranslateDimensionCore> { 168 168 169 169 // SUIT: Struct- or Union- InstType … … 190 190 191 191 const ast::TypeDecl * postvisit( const ast::TypeDecl * decl ); 192 const ast::Type * postvisit( const ast::FunctionType * type ); 193 const ast::Type * postvisit( const ast::TypeInstType * type ); 194 192 195 const ast::Expr * postvisit( const ast::DimensionExpr * expr ); 193 196 const ast::Expr * postvisit( const ast::Expr * expr ); … … 195 198 }; 196 199 200 // Declaration of type variable: forall( [N] ) -> forall( N & | sized( N ) ) 197 201 const ast::TypeDecl * TranslateDimensionCore::postvisit( 198 202 const ast::TypeDecl * decl ) { … … 206 210 } 207 211 return decl; 212 } 213 214 // Makes postvisit( TypeInstType ) get called on the entries of the function declaration's type's forall list. 215 // Pass.impl.hpp's visit( FunctionType ) does not consider the forall entries to be child nodes. 216 // Workaround is: during the current TranslateDimension pass, manually visit down there. 217 const ast::Type * TranslateDimensionCore::postvisit( 218 const ast::FunctionType * type ) { 219 visitor->maybe_accept( type, &ast::FunctionType::forall ); 220 return type; 221 } 222 223 // Use of type variable, assuming `forall( [N] )` in scope: void (*)( foo( /*dimension*/ N ) & ) -> void (*)( foo( /*dtype*/ N ) & ) 224 const ast::Type * TranslateDimensionCore::postvisit( 225 const ast::TypeInstType * type ) { 226 if ( type->kind == ast::TypeDecl::Dimension ) { 227 auto mutType = ast::mutate( type ); 228 mutType->kind = ast::TypeDecl::Dtype; 229 return mutType; 230 } 231 return type; 208 232 } 209 233
Note:
See TracChangeset
for help on using the changeset viewer.