Changeset 77de429


Ignore:
Timestamp:
Oct 19, 2022, 1:42:29 PM (2 years ago)
Author:
JiadaL <j82liang@…>
Branches:
ADT, ast-experimental, master
Children:
72b5805e, e874605
Parents:
9511841
Message:

Fix overriding enum value

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Decl.hpp

    r9511841 r77de429  
    105105        ptr<Init> init;
    106106        ptr<Expr> bitfieldWidth;
    107         bool enumInLine = false; // A flag vairable to tell the compile:
    108         // this is not a real object declaration. It is a place holder for
    109         // a set of enum value (ObjectDecl).
     107        bool enumInLine = false; // enum inline is not a real object declaration.
     108        // It is a place holder for a set of enum value (ObjectDecl)
     109        bool importValue = false; // if the value copied from somewhere else
    110110
    111111        ObjectDecl( const CodeLocation & loc, const std::string & name, const Type * type,
  • src/Validate/LinkReferenceToTypes.cpp

    r9511841 r77de429  
    209209                if ( member->enumInLine ) {
    210210                        auto targetEnum = symtab.lookupEnum( member->name );
    211                         if (targetEnum) {                       
    212                                 for (auto singleMamber : targetEnum->members) {
     211                        if ( targetEnum ) {                     
     212                                for ( auto singleMamber : targetEnum->members ) {
    213213                                        auto tm = singleMamber.as<ast::ObjectDecl>();
    214214                                        auto t = new ast::ObjectDecl(
     
    224224                                                tm->funcSpec
    225225                                        );
     226                                        t->importValue = true;
    226227                                        buffer.push_back(t);
    227228                                }
    228229                        }
    229230                } else {
     231                        auto search_it = std::find_if( buffer.begin(), buffer.end(), [member](ast::ptr<ast::Decl> cur) {
     232                                auto curAsObjDecl = cur.as<ast::ObjectDecl>();
     233                                return (curAsObjDecl->importValue) && (curAsObjDecl->name == member->name);
     234                        });
     235                        if ( search_it != buffer.end() ) {
     236                                buffer.erase( search_it ); // Found an import enum value that has the same name
     237                                // override the imported value
     238                        }
    230239                        buffer.push_back( *it );
    231240                }
  • tests/enum_tests/.expect/enumInlineValue.txt

    r9511841 r77de429  
    11enumB.A is 5
    2 enumB.B is 6
     2enumB.B is 10
    33enumB.D is 11
    44enumB.E is 12
  • tests/enum_tests/enumInlineValue.cfa

    r9511841 r77de429  
    66enum enumB {
    77    inline enumA,
    8     E, F
     8    E, B=10
    99};
    1010
Note: See TracChangeset for help on using the changeset viewer.