Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    rfb04321 r08d5507b  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 09:10:57 2017
    13 // Update Count     : 1007
     12// Last Modified On : Tue Mar 14 10:19:38 2017
     13// Update Count     : 964
    1414//
    1515
     
    3333
    3434// These must remain in the same order as the corresponding DeclarationNode enumerations.
     35const char * DeclarationNode::storageClassNames[] = { "extern", "static", "auto", "register", "_Thread_local", "NoStorageClassNames" };
     36const char * DeclarationNode::funcSpecifierNames[] = { "inline", "fortran", "_Noreturn", "NoFunctionSpecifierNames" };
     37const char * DeclarationNode::typeQualifierNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic", "NoTypeQualifierNames" };
    3538const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "float", "double", "long double", "NoBasicTypeNames" };
    3639const char * DeclarationNode::complexTypeNames[] = { "_Complex", "_Imaginary", "NoComplexTypeNames" };
     
    113116}
    114117
     118void DeclarationNode::print_StorageClass( std::ostream & output, StorageClasses storageClasses ) {
     119        if ( storageClasses.val != 0 ) {                                        // storage classes ?
     120                for ( unsigned int i = 0; i < DeclarationNode::NoStorageClass; i += 1 ) {
     121                        if ( storageClasses[i] ) {
     122                                output << DeclarationNode::storageClassNames[i] << ' ';
     123                        } // if
     124                } // for
     125        } // if
     126} // print_StorageClass
     127
     128void DeclarationNode::print_FuncSpec( std::ostream & output, DeclarationNode::FuncSpecifiers funcSpec ) {
     129        if ( funcSpec.val != 0 ) {                                                      // function specifiers ?
     130                for ( unsigned int i = 0; i < DeclarationNode::NoFuncSpecifier; i += 1 ) {
     131                        if ( funcSpec[i] ) {
     132                                output << DeclarationNode::funcSpecifierNames[i] << ' ';
     133                        } // if
     134                } // for
     135        } // if
     136} // print_FuncSpec
     137
    115138void DeclarationNode::print( std::ostream &os, int indent ) const {
    116139        os << string( indent, ' ' );
     
    125148        } // if
    126149
    127         storageClasses.print( os );
    128         funcSpecs.print( os );
     150        print_StorageClass( os, storageClasses );
     151        print_FuncSpec( os, funcSpecs );
    129152
    130153        if ( type ) {
     
    179202
    180203
    181 DeclarationNode * DeclarationNode::newStorageClass( Type::StorageClasses sc ) {
     204DeclarationNode * DeclarationNode::newStorageClass( DeclarationNode::StorageClasses sc ) {
    182205        DeclarationNode * newnode = new DeclarationNode;
    183206        newnode->storageClasses = sc;
     
    185208} // DeclarationNode::newStorageClass
    186209
    187 DeclarationNode * DeclarationNode::newFuncSpecifier( Type::FuncSpecifiers fs ) {
     210DeclarationNode * DeclarationNode::newFuncSpecifier( DeclarationNode::FuncSpecifiers fs ) {
    188211        DeclarationNode * newnode = new DeclarationNode;
    189212        newnode->funcSpecs = fs;
     
    191214} // DeclarationNode::newFuncSpecifier
    192215
    193 DeclarationNode * DeclarationNode::newTypeQualifier( Type::Qualifiers tq ) {
     216DeclarationNode * DeclarationNode::newTypeQualifier( TypeQualifier tq ) {
    194217        DeclarationNode * newnode = new DeclarationNode;
    195218        newnode->type = new TypeData();
    196         newnode->type->qualifiers = tq;
     219        newnode->type->typeQualifiers[ tq ] = true;
    197220        return newnode;
    198221} // DeclarationNode::newQualifier
     
    434457
    435458void DeclarationNode::checkQualifiers( const TypeData * src, const TypeData * dst ) {
    436         const Type::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization
    437 
    438         if ( (qsrc.val & qdst.val) != 0 ) {                                     // duplicates ?
    439                 for ( unsigned int i = 0; i < Type::NumTypeQualifier; i += 1 ) { // find duplicates
     459        const TypeData::TypeQualifiers qsrc = src->typeQualifiers, qdst = dst->typeQualifiers; // optimization
     460
     461        if ( (qsrc & qdst).any() ) {                                            // duplicates ?
     462                for ( unsigned int i = 0; i < NoTypeQualifier; i += 1 ) { // find duplicates
    440463                        if ( qsrc[i] && qdst[i] ) {
    441                                 appendError( error, string( "duplicate " ) + Type::Qualifiers::Names[i] );
     464                                appendError( error, string( "duplicate " ) + DeclarationNode::typeQualifierNames[i] );
    442465                        } // if
    443466                } // for
     
    446469
    447470void DeclarationNode::checkSpecifiers( DeclarationNode * src ) {
    448         if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) {      // duplicates ?
    449                 for ( unsigned int i = 0; i < Type::NumFuncSpecifier; i += 1 ) { // find duplicates
     471        if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) {                // duplicates ?
     472                for ( unsigned int i = 0; i < NoFuncSpecifier; i += 1 ) { // find duplicates
    450473                        if ( funcSpecs[i] && src->funcSpecs[i] ) {
    451                                 appendError( error, string( "duplicate " ) + Type::FuncSpecifiers::Names[i] );
     474                                appendError( error, string( "duplicate " ) + DeclarationNode::funcSpecifierNames[i] );
    452475                        } // if
    453476                } // for
    454477        } // if
    455478
    456         if ( storageClasses.any() && src->storageClasses.any() ) { // any reason to check ?
     479        if ( storageClasses.val != 0 && src->storageClasses.val != 0 ) { // any reason to check ?
    457480                if ( (storageClasses.val & src->storageClasses.val ) != 0 ) { // duplicates ?
    458                         for ( unsigned int i = 0; i < Type::NumStorageClass; i += 1 ) { // find duplicates
     481                        for ( unsigned int i = 0; i < NoStorageClass; i += 1 ) { // find duplicates
    459482                                if ( storageClasses[i] && src->storageClasses[i] ) {
    460                                         appendError( error, string( "duplicate " ) + Type::StorageClasses::Names[i] );
     483                                        appendError( error, string( "duplicate " ) + storageClassNames[i] );
    461484                                } // if
    462485                        } // for
    463486                        // src is the new item being added and has a single bit
    464487                } else if ( ! src->storageClasses.is_threadlocal ) { // conflict ?
    465                         appendError( error, string( "conflicting " ) + Type::StorageClasses::Names[ffs( storageClasses.val ) - 1] +
    466                                                  " & " + Type::StorageClasses::Names[ffs( src->storageClasses.val ) - 1] );
     488                        appendError( error, string( "conflicting " ) + storageClassNames[ffs( storageClasses.val ) - 1] +
     489                                                 " & " + storageClassNames[ffs( src->storageClasses.val ) - 1] );
    467490                        src->storageClasses.val = 0;                            // FIX to preserve invariant of one basic storage specifier
    468491                } // if
     
    473496
    474497DeclarationNode * DeclarationNode::copySpecifiers( DeclarationNode * q ) {
    475         funcSpecs.val |= q->funcSpecs.val;
    476         storageClasses.val |= q->storageClasses.val;
     498        funcSpecs.val = funcSpecs.val | q->funcSpecs.val;
     499        storageClasses.val = storageClasses.val | q->storageClasses.val;
    477500
    478501        for ( Attribute *attr: reverseIterate( q->attributes ) ) {
     
    497520                src = nullptr;
    498521        } else {
    499                 dst->qualifiers += src->qualifiers;
     522                dst->typeQualifiers |= src->typeQualifiers;
    500523        } // if
    501524} // addQualifiersToType
     
    555578                switch ( dst->kind ) {
    556579                  case TypeData::Unknown:
    557                         src->qualifiers += dst->qualifiers;
     580                        src->typeQualifiers |= dst->typeQualifiers;
    558581                        dst = src;
    559582                        src = nullptr;
    560583                        break;
    561584                  case TypeData::Basic:
    562                         dst->qualifiers += src->qualifiers;
     585                        dst->typeQualifiers |= src->typeQualifiers;
    563586                        if ( src->kind != TypeData::Unknown ) {
    564587                                assert( src->kind == TypeData::Basic );
     
    596619                                        dst->base->aggInst.params = maybeClone( src->aggregate.actuals );
    597620                                } // if
    598                                 dst->base->qualifiers += src->qualifiers;
     621                                dst->base->typeQualifiers |= src->typeQualifiers;
    599622                                src = nullptr;
    600623                                break;
     
    628651                                                type->aggInst.hoistType = o->type->enumeration.body;
    629652                                        } // if
    630                                         type->qualifiers += o->type->qualifiers;
     653                                        type->typeQualifiers |= o->type->typeQualifiers;
    631654                                } else {
    632655                                        type = o->type;
     
    784807                                        p->type->base->aggInst.params = maybeClone( type->aggregate.actuals );
    785808                                } // if
    786                                 p->type->base->qualifiers += type->qualifiers;
     809                                p->type->base->typeQualifiers |= type->typeQualifiers;
    787810                                break;
    788811
     
    809832
    810833DeclarationNode * DeclarationNode::addNewArray( DeclarationNode * a ) {
    811   if ( ! a ) return this;
    812         assert( a->type->kind == TypeData::Array );
    813         TypeData * lastArray = findLast( a->type );
    814         if ( type ) {
    815                 switch ( type->kind ) {
    816                   case TypeData::Aggregate:
    817                   case TypeData::Enum:
    818                         lastArray->base = new TypeData( TypeData::AggregateInst );
    819                         lastArray->base->aggInst.aggregate = type;
    820                         if ( type->kind == TypeData::Aggregate ) {
    821                                 lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals );
    822                         } // if
    823                         lastArray->base->qualifiers += type->qualifiers;
    824                         break;
    825                   default:
    826                         lastArray->base = type;
    827                 } // switch
    828                 type = nullptr;
    829         } // if
    830         delete this;
    831         return a;
     834        if ( a ) {
     835                assert( a->type->kind == TypeData::Array );
     836                TypeData * lastArray = findLast( a->type );
     837                if ( type ) {
     838                        switch ( type->kind ) {
     839                          case TypeData::Aggregate:
     840                          case TypeData::Enum:
     841                                lastArray->base = new TypeData( TypeData::AggregateInst );
     842                                lastArray->base->aggInst.aggregate = type;
     843                                if ( type->kind == TypeData::Aggregate ) {
     844                                        lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals );
     845                                } // if
     846                                lastArray->base->typeQualifiers |= type->typeQualifiers;
     847                                break;
     848                          default:
     849                                lastArray->base = type;
     850                        } // switch
     851                        type = nullptr;
     852                } // if
     853                delete this;
     854                return a;
     855        } else {
     856                return this;
     857        } // if
    832858}
    833859
     
    968994                                } else if ( StructDecl * agg = dynamic_cast< StructDecl * >( decl ) ) {
    969995                                        StructInstType * inst = new StructInstType( Type::Qualifiers(), agg->get_name() );
    970                                         auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr );
     996                                        auto obj = new ObjectDecl( "", DeclarationNode::StorageClasses(), linkage, nullptr, inst, nullptr );
    971997                                        obj->location = cur->location;
    972998                                        * out++ = obj;
     
    9741000                                } else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) {
    9751001                                        UnionInstType * inst = new UnionInstType( Type::Qualifiers(), agg->get_name() );
    976                                         auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr );
     1002                                        auto obj = new ObjectDecl( "", DeclarationNode::StorageClasses(), linkage, nullptr, inst, nullptr );
    9771003                                        obj->location = cur->location;
    9781004                                        * out++ = obj;
     
    10211047                assertf( sizeof(kindMap)/sizeof(kindMap[0] == NoTypeClass-1), "DeclarationNode::build: kindMap is out of sync." );
    10221048                assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." );
    1023                 TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ] );
     1049                TypeDecl * ret = new TypeDecl( *name, DeclarationNode::StorageClasses(), nullptr, kindMap[ variable.tyClass ] );
    10241050                buildList( variable.assertions, ret->get_assertions() );
    10251051                return ret;
     
    10321058                //    inline _Noreturn int g( int i );  // allowed
    10331059                //    inline _Noreturn int i;                   // disallowed
    1034                 if ( type->kind != TypeData::Function && funcSpecs.any() ) {
     1060                if ( type->kind != TypeData::Function && funcSpecs.val != 0 ) {
    10351061                        throw SemanticError( "invalid function specifier for ", this );
    10361062                } // if
     
    10421068        //    inlne _Noreturn struct S { ... };         // disallowed
    10431069        //    inlne _Noreturn enum   E { ... };         // disallowed
    1044         if ( funcSpecs.any() ) {
     1070        if ( funcSpecs.val != 0 ) {
    10451071                throw SemanticError( "invalid function specifier for ", this );
    10461072        } // if
Note: See TracChangeset for help on using the changeset viewer.