- Timestamp:
- Sep 6, 2023, 3:44:19 PM (17 months ago)
- Branches:
- master
- Children:
- f3f009f
- Parents:
- 1fc111c
- Location:
- src/ResolvExpr
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/ResolveTypeof.cc
r1fc111c r4894239 237 237 // The designator I want to replace 238 238 const ast::Expr * designator = des->designators.at(0); 239 239 // Stupid flag variable for development, to be removed 240 bool mutated = false; 240 241 if ( const ast::NameExpr * designatorName = dynamic_cast<const ast::NameExpr *>(designator) ) { 241 242 auto candidates = context.symtab.lookupId(designatorName->name); … … 244 245 if ( candidates.size() != 1 ) return mutDecl; 245 246 auto candidate = candidates.at(0); 246 if ( const ast::EnumInstType * enumInst = dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type()) 247 if ( const ast::EnumInstType * enumInst = dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type())) { 247 248 // determine that is an enumInst, swap it with its const value 248 249 assert( candidates.size() == 1 ); … … 250 251 // Need to iterate over all enum value to find the initializer to swap 251 252 for ( size_t m = 0; m < baseEnum->members.size(); ++m ) { 253 const ast::ObjectDecl * mem = baseEnum->members.at(m).as<const ast::ObjectDecl>(); 252 254 if ( baseEnum->members.at(m)->name == designatorName->name ) { 253 const ast::ObjectDecl * mem = baseEnum->members.at(m).as<const ast::ObjectDecl>();254 255 assert(mem); 255 const ast::ConstantExpr * enumAsInit = ast::ConstantExpr::from_int(newDesination->location, m); 256 newDesination->designators.push_back( enumAsInit ); 256 if ( mem->init ) { 257 const ast::SingleInit * memInit = mem->init.as<const ast::SingleInit>(); 258 ast::Expr * initValue = shallowCopy( memInit->value.get() ); 259 newDesination->designators.push_back( initValue ); 260 mutated = true; 261 } 262 break; 257 263 } 258 }259 if ( newDesination->designators.size() == 0 ) {260 SemanticError(des->location, "Resolution Error: Resolving array designation as Enum Instance value, but cannot find a desgination value");261 264 } 262 265 } else { … … 266 269 newDesination->designators.push_back( des->designators.at(0) ); 267 270 } 268 mutListInit = ast::mutate_field_index(mutListInit, &ast::ListInit::designations, k, newDesination); 271 if ( mutated ) { 272 mutListInit = ast::mutate_field_index(mutListInit, &ast::ListInit::designations, k, newDesination); 273 } 269 274 } 270 275 } -
src/ResolvExpr/Resolver.cc
r1fc111c r4894239 988 988 } 989 989 }; 990 991 struct ResolveDesignators_new final : public ast::WithShortCircuiting { 992 ResolveContext& context; 993 bool result = false; 994 995 ResolveDesignators_new( ResolveContext& _context ): context{_context} {}; 996 997 void previsit( const ast::Node * ) { 998 // short circuit if we already know there are designations 999 if ( result ) visit_children = false; 1000 } 1001 1002 void previsit( const ast::Designation * des ) { 1003 if ( result ) visit_children = false; 1004 else if ( ! des->designators.empty() ) { 1005 if ( (des->designators.size() == 1) ) { 1006 const ast::Expr * designator = des->designators.at(0); 1007 if ( const ast::NameExpr * designatorName = dynamic_cast<const ast::NameExpr *>(designator) ) { 1008 auto candidates = context.symtab.lookupId(designatorName->name); 1009 for ( auto candidate : candidates ) { 1010 if ( dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type()) ) { 1011 result = true; 1012 break; 1013 } 1014 } 1015 } 1016 } 1017 visit_children = false; 1018 } 1019 } 1020 }; 990 1021 } // anonymous namespace 991 1022 /// Check if this expression is or includes a deleted expression … … 1507 1538 if ( InitTweak::tryConstruct( mutDecl ) && ( managedTypes.isManaged( mutDecl ) || ((! isInFunction() || mutDecl->storage.is_static ) && ! InitTweak::isConstExpr( mutDecl->init ) ) ) ) { 1508 1539 // constructed objects cannot be designated 1509 // if ( InitTweak::isDesignated( mutDecl->init ) ) SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" );1510 1540 if ( InitTweak::isDesignated( mutDecl->init ) ) { 1511 SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" ); 1541 ast::Pass<ResolveDesignators_new> res( context ); 1542 maybe_accept( mutDecl->init.get(), res ); 1543 if ( !res.core.result ) { 1544 SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" ); 1545 } 1512 1546 } 1513 1547 // constructed objects should not have initializers nested too deeply
Note: See TracChangeset
for help on using the changeset viewer.