Changes in src/Parser/DeclarationNode.cc [e496303:c3396e0]
- File:
-
- 1 edited
-
src/Parser/DeclarationNode.cc (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
re496303 rc3396e0 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Mar 14 14:45:52201713 // Update Count : 9 7312 // Last Modified On : Tue Mar 7 17:28:56 2017 13 // Update Count : 937 14 14 // 15 15 … … 90 90 newnode->type = maybeClone( type ); 91 91 newnode->storageClasses = storageClasses; 92 newnode->bitfieldWidth = maybeClone( bitfieldWidth ); 92 93 newnode->funcSpecs = funcSpecs; 93 newnode->bitfieldWidth = maybeClone( bitfieldWidth );94 94 newnode->enumeratorValue.reset( maybeClone( enumeratorValue.get() ) ); 95 95 newnode->hasEllipsis = hasEllipsis; … … 117 117 118 118 void DeclarationNode::print_StorageClass( std::ostream & output, StorageClasses storageClasses ) { 119 if ( storageClasses. val != 0 ) { // storage classes?119 if ( storageClasses.any() ) { // function specifiers? 120 120 for ( unsigned int i = 0; i < DeclarationNode::NoStorageClass; i += 1 ) { 121 121 if ( storageClasses[i] ) { … … 127 127 128 128 void DeclarationNode::print_FuncSpec( std::ostream & output, DeclarationNode::FuncSpecifiers funcSpec ) { 129 if ( funcSpec. val != 0 ) { // function specifiers?129 if ( funcSpec.any() ) { // function specifiers? 130 130 for ( unsigned int i = 0; i < DeclarationNode::NoFuncSpecifier; i += 1 ) { 131 131 if ( funcSpec[i] ) { … … 202 202 203 203 204 DeclarationNode * DeclarationNode::newStorageClass( StorageClasses sc ) {205 DeclarationNode * newnode = new DeclarationNode; 206 newnode->storageClasses = sc;204 DeclarationNode * DeclarationNode::newStorageClass( DeclarationNode::StorageClass sc ) { 205 DeclarationNode * newnode = new DeclarationNode; 206 newnode->storageClasses[ sc ] = true; 207 207 return newnode; 208 208 } // DeclarationNode::newStorageClass 209 209 210 DeclarationNode * DeclarationNode::newFuncSpecifier( FuncSpecifiersfs ) {211 DeclarationNode * newnode = new DeclarationNode; 212 newnode->funcSpecs = fs;210 DeclarationNode * DeclarationNode::newFuncSpecifier( DeclarationNode::FuncSpecifier fs ) { 211 DeclarationNode * newnode = new DeclarationNode; 212 newnode->funcSpecs[ fs ] = true; 213 213 return newnode; 214 214 } // DeclarationNode::newFuncSpecifier 215 215 216 DeclarationNode * DeclarationNode::newTypeQualifier( TypeQualifier stq ) {216 DeclarationNode * DeclarationNode::newTypeQualifier( TypeQualifier tq ) { 217 217 DeclarationNode * newnode = new DeclarationNode; 218 218 newnode->type = new TypeData(); 219 newnode->type->typeQualifiers = tq;219 newnode->type->typeQualifiers[ tq ] = true; 220 220 return newnode; 221 221 } // DeclarationNode::newQualifier … … 457 457 458 458 void DeclarationNode::checkQualifiers( const TypeData * src, const TypeData * dst ) { 459 const Type Qualifiers qsrc = src->typeQualifiers, qdst = dst->typeQualifiers; // optimization460 461 if ( (qsrc .val & qdst.val) != 0 ) { // duplicates?462 for ( unsigned int i = 0; i < NoTypeQualifier; i += 1 ) { // find duplicates459 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 463 463 if ( qsrc[i] && qdst[i] ) { 464 464 appendError( error, string( "duplicate " ) + DeclarationNode::typeQualifierNames[i] ); … … 469 469 470 470 void DeclarationNode::checkSpecifiers( DeclarationNode * src ) { 471 if ( (funcSpecs .val & src->funcSpecs.val) != 0 ) { // duplicates?472 for ( unsigned int i = 0; i < NoFuncSpecifier; i += 1 ) { // find duplicates471 if ( (funcSpecs & src->funcSpecs).any() ) { // common specifier ? 472 for ( unsigned int i = 0; i < NoFuncSpecifier; i += 1 ) { // find common specifier 473 473 if ( funcSpecs[i] && src->funcSpecs[i] ) { 474 474 appendError( error, string( "duplicate " ) + DeclarationNode::funcSpecifierNames[i] ); … … 477 477 } // if 478 478 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 ? 481 481 for ( unsigned int i = 0; i < NoStorageClass; i += 1 ) { // find duplicates 482 482 if ( storageClasses[i] && src->storageClasses[i] ) { … … 485 485 } // for 486 486 // 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 specifier487 } 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 491 491 } // if 492 492 } // if … … 496 496 497 497 DeclarationNode * 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; 500 500 501 501 for ( Attribute *attr: reverseIterate( q->attributes ) ) { … … 520 520 src = nullptr; 521 521 } else { 522 dst->typeQualifiers .val |= src->typeQualifiers.val;522 dst->typeQualifiers |= src->typeQualifiers; 523 523 } // if 524 524 } // addQualifiersToType … … 578 578 switch ( dst->kind ) { 579 579 case TypeData::Unknown: 580 src->typeQualifiers .val |= dst->typeQualifiers.val;580 src->typeQualifiers |= dst->typeQualifiers; 581 581 dst = src; 582 582 src = nullptr; 583 583 break; 584 584 case TypeData::Basic: 585 dst->typeQualifiers .val |= src->typeQualifiers.val;585 dst->typeQualifiers |= src->typeQualifiers; 586 586 if ( src->kind != TypeData::Unknown ) { 587 587 assert( src->kind == TypeData::Basic ); … … 619 619 dst->base->aggInst.params = maybeClone( src->aggregate.actuals ); 620 620 } // if 621 dst->base->typeQualifiers .val |= src->typeQualifiers.val;621 dst->base->typeQualifiers |= src->typeQualifiers; 622 622 src = nullptr; 623 623 break; … … 651 651 type->aggInst.hoistType = o->type->enumeration.body; 652 652 } // if 653 type->typeQualifiers .val |= o->type->typeQualifiers.val;653 type->typeQualifiers |= o->type->typeQualifiers; 654 654 } else { 655 655 type = o->type; … … 807 807 p->type->base->aggInst.params = maybeClone( type->aggregate.actuals ); 808 808 } // if 809 p->type->base->typeQualifiers .val |= type->typeQualifiers.val;809 p->type->base->typeQualifiers |= type->typeQualifiers; 810 810 break; 811 811 … … 844 844 lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals ); 845 845 } // if 846 lastArray->base->typeQualifiers .val |= type->typeQualifiers.val;846 lastArray->base->typeQualifiers |= type->typeQualifiers; 847 847 break; 848 848 default: … … 1058 1058 // inline _Noreturn int g( int i ); // allowed 1059 1059 // inline _Noreturn int i; // disallowed 1060 if ( type->kind != TypeData::Function && funcSpecs. val != 0) {1060 if ( type->kind != TypeData::Function && funcSpecs.any() ) { 1061 1061 throw SemanticError( "invalid function specifier for ", this ); 1062 1062 } // if … … 1068 1068 // inlne _Noreturn struct S { ... }; // disallowed 1069 1069 // inlne _Noreturn enum E { ... }; // disallowed 1070 if ( funcSpecs. val != 0) {1070 if ( funcSpecs.any() ) { 1071 1071 throw SemanticError( "invalid function specifier for ", this ); 1072 1072 } // if
Note:
See TracChangeset
for help on using the changeset viewer.