- File:
-
- 1 edited
-
src/Validate/GenericParameter.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Validate/GenericParameter.cpp
r0b0a285 rcaf06aa 120 120 } 121 121 122 struct ValidateGenericParamsCore : public ast::WithCodeLocation { 122 bool isSizedPolymorphic( const ast::AggregateDecl * decl ) { 123 for ( const auto & param : decl->params ) { 124 if ( param->sized ) return true; 125 } 126 return false; 127 } 128 129 struct ValidateGenericParamsCore : 130 public ast::WithCodeLocation, public ast::WithGuards { 131 // Generic parameter filling and checks: 123 132 const ast::StructInstType * previsit( const ast::StructInstType * type ) { 124 133 assert( location ); … … 129 138 assert( location ); 130 139 return validateGeneric( *location, type ); 140 } 141 142 // Check parameter and bitfield combinations: 143 bool insideSized = false; 144 void previsit( const ast::StructDecl * decl ) { 145 if ( isSizedPolymorphic( decl ) && !insideSized ) { 146 GuardValue( insideSized ) = true; 147 } 148 } 149 150 void previsit( const ast::UnionDecl * decl ) { 151 if ( isSizedPolymorphic( decl ) && !insideSized ) { 152 GuardValue( insideSized ) = true; 153 } 154 } 155 156 void previsit( const ast::ObjectDecl * decl ) { 157 if ( insideSized && decl->bitfieldWidth ) { 158 SemanticError( decl->location, decl, 159 "Cannot have bitfields inside a sized polymorphic structure." ); 160 } 131 161 } 132 162 }; … … 247 277 const ast::Expr * TranslateDimensionCore::postvisit( 248 278 const ast::TypeExpr * expr ) { 249 if ( auto instType = dynamic_cast<const ast::EnumInstType *>( expr->type.get() ) ) { 250 const ast::EnumDecl * baseEnum = instType->base.get(); 251 return ast::ConstantExpr::from_int( expr->location, baseEnum->members.size() ); 252 } 279 // Does nothing, except prevents matching ast::Expr (above). 253 280 return expr; 254 281 }
Note:
See TracChangeset
for help on using the changeset viewer.