Changes in / [01510fe:cb0bcf1]


Ignore:
Location:
src/ResolvExpr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/ResolveTypeof.cc

    r01510fe rcb0bcf1  
    237237            // The designator I want to replace
    238238            const ast::Expr * designator = des->designators.at(0);
    239             // Stupid flag variable for development, to be removed
    240             bool mutated = false;
     239
    241240            if ( const ast::NameExpr * designatorName = dynamic_cast<const ast::NameExpr *>(designator) ) {
    242241                auto candidates = context.symtab.lookupId(designatorName->name);
     
    245244                if ( candidates.size() != 1 ) return mutDecl;
    246245                auto candidate = candidates.at(0);
    247                 if ( const ast::EnumInstType * enumInst = dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type())) {
     246                if ( const ast::EnumInstType * enumInst = dynamic_cast<const ast::EnumInstType *>(candidate.id->get_type()) ) {
    248247                    // determine that is an enumInst, swap it with its const value
    249248                    assert( candidates.size() == 1 );
     
    251250                    // Need to iterate over all enum value to find the initializer to swap
    252251                    for ( size_t m = 0; m < baseEnum->members.size(); ++m ) {
    253                         const ast::ObjectDecl * mem = baseEnum->members.at(m).as<const ast::ObjectDecl>();
    254252                        if ( baseEnum->members.at(m)->name == designatorName->name ) {
     253                            const ast::ObjectDecl * mem = baseEnum->members.at(m).as<const ast::ObjectDecl>();
    255254                            assert(mem);
    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;
     255                            const ast::ConstantExpr * enumAsInit = ast::ConstantExpr::from_int(newDesination->location, m);
     256                            newDesination->designators.push_back( enumAsInit );
    263257                        }
     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");
    264261                    }
    265262                } else {
     
    269266                newDesination->designators.push_back( des->designators.at(0) );
    270267            }
    271             if ( mutated ) {
    272                 mutListInit = ast::mutate_field_index(mutListInit, &ast::ListInit::designations, k, newDesination);
    273             }
     268            mutListInit = ast::mutate_field_index(mutListInit, &ast::ListInit::designations, k, newDesination);
    274269        }
    275270    }
  • src/ResolvExpr/Resolver.cc

    r01510fe rcb0bcf1  
    988988                        }
    989989                };
    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                 };
    1021990        } // anonymous namespace
    1022991        /// Check if this expression is or includes a deleted expression
     
    15381507                                if ( InitTweak::tryConstruct( mutDecl ) && ( managedTypes.isManaged( mutDecl ) || ((! isInFunction() || mutDecl->storage.is_static ) && ! InitTweak::isConstExpr( mutDecl->init ) ) ) ) {
    15391508                                        // 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" );
    15401510                                        if ( InitTweak::isDesignated( mutDecl->init ) ) {
    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                                                 }
     1511                                                SemanticError( mutDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" );
    15461512                                        }
    15471513                                        // constructed objects should not have initializers nested too deeply
Note: See TracChangeset for help on using the changeset viewer.