Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/DeclarationNode.cc

    re496303 rc3396e0  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Mar 14 14:45:52 2017
    13 // Update Count     : 973
     12// Last Modified On : Tue Mar  7 17:28:56 2017
     13// Update Count     : 937
    1414//
    1515
     
    9090        newnode->type = maybeClone( type );
    9191        newnode->storageClasses = storageClasses;
     92        newnode->bitfieldWidth = maybeClone( bitfieldWidth );
    9293        newnode->funcSpecs = funcSpecs;
    93         newnode->bitfieldWidth = maybeClone( bitfieldWidth );
    9494        newnode->enumeratorValue.reset( maybeClone( enumeratorValue.get() ) );
    9595        newnode->hasEllipsis = hasEllipsis;
     
    117117
    118118void DeclarationNode::print_StorageClass( std::ostream & output, StorageClasses storageClasses ) {
    119         if ( storageClasses.val != 0 ) {                                        // storage classes ?
     119        if ( storageClasses.any() ) {                                                           // function specifiers?
    120120                for ( unsigned int i = 0; i < DeclarationNode::NoStorageClass; i += 1 ) {
    121121                        if ( storageClasses[i] ) {
     
    127127
    128128void DeclarationNode::print_FuncSpec( std::ostream & output, DeclarationNode::FuncSpecifiers funcSpec ) {
    129         if ( funcSpec.val != 0 ) {                                                      // function specifiers ?
     129        if ( funcSpec.any() ) {                                                         // function specifiers?
    130130                for ( unsigned int i = 0; i < DeclarationNode::NoFuncSpecifier; i += 1 ) {
    131131                        if ( funcSpec[i] ) {
     
    202202
    203203
    204 DeclarationNode * DeclarationNode::newStorageClass( StorageClasses sc ) {
    205         DeclarationNode * newnode = new DeclarationNode;
    206         newnode->storageClasses = sc;
     204DeclarationNode * DeclarationNode::newStorageClass( DeclarationNode::StorageClass sc ) {
     205        DeclarationNode * newnode = new DeclarationNode;
     206        newnode->storageClasses[ sc ] = true;
    207207        return newnode;
    208208} // DeclarationNode::newStorageClass
    209209
    210 DeclarationNode * DeclarationNode::newFuncSpecifier( FuncSpecifiers fs ) {
    211         DeclarationNode * newnode = new DeclarationNode;
    212         newnode->funcSpecs = fs;
     210DeclarationNode * DeclarationNode::newFuncSpecifier( DeclarationNode::FuncSpecifier fs ) {
     211        DeclarationNode * newnode = new DeclarationNode;
     212        newnode->funcSpecs[ fs ] = true;
    213213        return newnode;
    214214} // DeclarationNode::newFuncSpecifier
    215215
    216 DeclarationNode * DeclarationNode::newTypeQualifier( TypeQualifiers tq ) {
     216DeclarationNode * DeclarationNode::newTypeQualifier( TypeQualifier tq ) {
    217217        DeclarationNode * newnode = new DeclarationNode;
    218218        newnode->type = new TypeData();
    219         newnode->type->typeQualifiers = tq;
     219        newnode->type->typeQualifiers[ tq ] = true;
    220220        return newnode;
    221221} // DeclarationNode::newQualifier
     
    457457
    458458void DeclarationNode::checkQualifiers( const TypeData * src, const TypeData * dst ) {
    459         const TypeQualifiers qsrc = src->typeQualifiers, qdst = dst->typeQualifiers; // optimization
    460 
    461         if ( (qsrc.val & qdst.val) != 0 ) {                                     // duplicates ?
    462                 for ( unsigned int i = 0; i < NoTypeQualifier; i += 1 ) { // find duplicates
     459        const TypeData::TypeQualifiers qsrc = src->typeQualifiers, qdst = dst->typeQualifiers; // optimization
     460
     461        if ( (qsrc & qdst).any() ) {                                            // common qualifier ?
     462                for ( unsigned int i = 0; i < NoTypeQualifier; i += 1 ) { // find common qualifiers
    463463                        if ( qsrc[i] && qdst[i] ) {
    464464                                appendError( error, string( "duplicate " ) + DeclarationNode::typeQualifierNames[i] );
     
    469469
    470470void DeclarationNode::checkSpecifiers( DeclarationNode * src ) {
    471         if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) {                // duplicates ?
    472                 for ( unsigned int i = 0; i < NoFuncSpecifier; i += 1 ) { // find duplicates
     471        if ( (funcSpecs & src->funcSpecs).any() ) {                     // common specifier ?
     472                for ( unsigned int i = 0; i < NoFuncSpecifier; i += 1 ) { // find common specifier
    473473                        if ( funcSpecs[i] && src->funcSpecs[i] ) {
    474474                                appendError( error, string( "duplicate " ) + DeclarationNode::funcSpecifierNames[i] );
     
    477477        } // if
    478478
    479         if ( storageClasses.val != 0 && src->storageClasses.val != 0 ) { // any reason to check ?
    480                 if ( (storageClasses.val & src->storageClasses.val ) != 0 ) { // duplicates ?
     479        if ( storageClasses != 0 && src->storageClasses != 0 ) { // any reason to check ?
     480                if ( (storageClasses & src->storageClasses).any() ) { // duplicates ?
    481481                        for ( unsigned int i = 0; i < NoStorageClass; i += 1 ) { // find duplicates
    482482                                if ( storageClasses[i] && src->storageClasses[i] ) {
     
    485485                        } // for
    486486                        // src is the new item being added and has a single bit
    487                 } else if ( ! src->storageClasses.is_threadlocal ) { // conflict ?
    488                         appendError( error, string( "conflicting " ) + storageClassNames[ffs( storageClasses.val ) - 1] +
    489                                                  " & " + storageClassNames[ffs( src->storageClasses.val ) - 1] );
    490                         src->storageClasses.val = 0;                            // FIX to preserve invariant of one basic storage specifier
     487                } else if ( ! src->storageClasses[ Threadlocal ] ) { // conflict ?
     488                        appendError( error, string( "conflicting " ) + storageClassNames[ffs( storageClasses.to_ulong() ) - 1] +
     489                                                 " & " + storageClassNames[ffs( src->storageClasses.to_ulong() ) - 1] );
     490                        src->storageClasses.reset();                            // FIX to preserve invariant of one basic storage specifier
    491491                } // if
    492492        } // if
     
    496496
    497497DeclarationNode * DeclarationNode::copySpecifiers( DeclarationNode * q ) {
    498         funcSpecs.val = funcSpecs.val | q->funcSpecs.val;
    499         storageClasses.val = storageClasses.val | q->storageClasses.val;
     498        funcSpecs = funcSpecs | q->funcSpecs;
     499        storageClasses = storageClasses | q->storageClasses;
    500500
    501501        for ( Attribute *attr: reverseIterate( q->attributes ) ) {
     
    520520                src = nullptr;
    521521        } else {
    522                 dst->typeQualifiers.val |= src->typeQualifiers.val;
     522                dst->typeQualifiers |= src->typeQualifiers;
    523523        } // if
    524524} // addQualifiersToType
     
    578578                switch ( dst->kind ) {
    579579                  case TypeData::Unknown:
    580                         src->typeQualifiers.val |= dst->typeQualifiers.val;
     580                        src->typeQualifiers |= dst->typeQualifiers;
    581581                        dst = src;
    582582                        src = nullptr;
    583583                        break;
    584584                  case TypeData::Basic:
    585                         dst->typeQualifiers.val |= src->typeQualifiers.val;
     585                        dst->typeQualifiers |= src->typeQualifiers;
    586586                        if ( src->kind != TypeData::Unknown ) {
    587587                                assert( src->kind == TypeData::Basic );
     
    619619                                        dst->base->aggInst.params = maybeClone( src->aggregate.actuals );
    620620                                } // if
    621                                 dst->base->typeQualifiers.val |= src->typeQualifiers.val;
     621                                dst->base->typeQualifiers |= src->typeQualifiers;
    622622                                src = nullptr;
    623623                                break;
     
    651651                                                type->aggInst.hoistType = o->type->enumeration.body;
    652652                                        } // if
    653                                         type->typeQualifiers.val |= o->type->typeQualifiers.val;
     653                                        type->typeQualifiers |= o->type->typeQualifiers;
    654654                                } else {
    655655                                        type = o->type;
     
    807807                                        p->type->base->aggInst.params = maybeClone( type->aggregate.actuals );
    808808                                } // if
    809                                 p->type->base->typeQualifiers.val |= type->typeQualifiers.val;
     809                                p->type->base->typeQualifiers |= type->typeQualifiers;
    810810                                break;
    811811
     
    844844                                        lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals );
    845845                                } // if
    846                                 lastArray->base->typeQualifiers.val |= type->typeQualifiers.val;
     846                                lastArray->base->typeQualifiers |= type->typeQualifiers;
    847847                                break;
    848848                          default:
     
    10581058                //    inline _Noreturn int g( int i );  // allowed
    10591059                //    inline _Noreturn int i;                   // disallowed
    1060                 if ( type->kind != TypeData::Function && funcSpecs.val != 0 ) {
     1060                if ( type->kind != TypeData::Function && funcSpecs.any() ) {
    10611061                        throw SemanticError( "invalid function specifier for ", this );
    10621062                } // if
     
    10681068        //    inlne _Noreturn struct S { ... };         // disallowed
    10691069        //    inlne _Noreturn enum   E { ... };         // disallowed
    1070         if ( funcSpecs.val != 0 ) {
     1070        if ( funcSpecs.any() ) {
    10711071                throw SemanticError( "invalid function specifier for ", this );
    10721072        } // if
Note: See TracChangeset for help on using the changeset viewer.