Changes in src/Parser/DeclarationNode.cc [615a096:fb04321]
- File:
-
- 1 edited
-
src/Parser/DeclarationNode.cc (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
r615a096 rfb04321 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 17 08:46:05201713 // Update Count : 10 1712 // Last Modified On : Thu Mar 16 09:10:57 2017 13 // Update Count : 1007 14 14 // 15 15 … … 19 19 #include <algorithm> 20 20 #include <cassert> 21 #include <strings.h> // ffs 21 22 22 23 #include "TypeData.h" … … 242 243 243 244 DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) { 244 assert( name );245 245 DeclarationNode * newnode = new DeclarationNode; 246 246 newnode->type = new TypeData( TypeData::Aggregate ); 247 247 newnode->type->aggregate.kind = kind; 248 newnode->type->aggregate.name = name; 248 if ( name ) { 249 newnode->type->aggregate.name = name; 250 } else { // anonymous aggregate ? 251 newnode->type->aggregate.name = new string( anonymous.newName() ); 252 } // if 249 253 newnode->type->aggregate.actuals = actuals; 250 254 newnode->type->aggregate.fields = fields; … … 254 258 255 259 DeclarationNode * DeclarationNode::newEnum( string * name, DeclarationNode * constants, bool body ) { 256 assert( name );257 260 DeclarationNode * newnode = new DeclarationNode; 258 261 newnode->type = new TypeData( TypeData::Enum ); 259 newnode->type->enumeration.name = name; 262 if ( name ) { 263 newnode->type->enumeration.name = name; 264 } else { // anonymous aggregate ? 265 newnode->type->enumeration.name = new string( anonymous.newName() ); 266 } // if 260 267 newnode->type->enumeration.constants = constants; 261 268 newnode->type->enumeration.body = body; … … 429 436 const Type::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization 430 437 431 if ( (qsrc & qdst).any() ) {// duplicates ?438 if ( (qsrc.val & qdst.val) != 0 ) { // duplicates ? 432 439 for ( unsigned int i = 0; i < Type::NumTypeQualifier; i += 1 ) { // find duplicates 433 440 if ( qsrc[i] && qdst[i] ) { 434 appendError( error, string( "duplicate " ) + Type::Qualifiers Names[i] );441 appendError( error, string( "duplicate " ) + Type::Qualifiers::Names[i] ); 435 442 } // if 436 443 } // for … … 439 446 440 447 void DeclarationNode::checkSpecifiers( DeclarationNode * src ) { 441 if ( (funcSpecs & src->funcSpecs).any() ) {// duplicates ?448 if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) { // duplicates ? 442 449 for ( unsigned int i = 0; i < Type::NumFuncSpecifier; i += 1 ) { // find duplicates 443 450 if ( funcSpecs[i] && src->funcSpecs[i] ) { 444 appendError( error, string( "duplicate " ) + Type::FuncSpecifiers Names[i] );451 appendError( error, string( "duplicate " ) + Type::FuncSpecifiers::Names[i] ); 445 452 } // if 446 453 } // for … … 448 455 449 456 if ( storageClasses.any() && src->storageClasses.any() ) { // any reason to check ? 450 if ( (storageClasses & src->storageClasses ).any()) { // duplicates ?457 if ( (storageClasses.val & src->storageClasses.val ) != 0 ) { // duplicates ? 451 458 for ( unsigned int i = 0; i < Type::NumStorageClass; i += 1 ) { // find duplicates 452 459 if ( storageClasses[i] && src->storageClasses[i] ) { 453 appendError( error, string( "duplicate " ) + Type::StorageClasses Names[i] );460 appendError( error, string( "duplicate " ) + Type::StorageClasses::Names[i] ); 454 461 } // if 455 462 } // for 456 463 // src is the new item being added and has a single bit 457 464 } else if ( ! src->storageClasses.is_threadlocal ) { // conflict ? 458 appendError( error, string( "conflicting " ) + Type::StorageClasses Names[storageClasses.ffs()] +459 " & " + Type::StorageClasses Names[src->storageClasses.ffs()] );460 src->storageClasses. reset(); // FIX to preserve invariant of one basic storage specifier465 appendError( error, string( "conflicting " ) + Type::StorageClasses::Names[ffs( storageClasses.val ) - 1] + 466 " & " + Type::StorageClasses::Names[ffs( src->storageClasses.val ) - 1] ); 467 src->storageClasses.val = 0; // FIX to preserve invariant of one basic storage specifier 461 468 } // if 462 469 } // if … … 466 473 467 474 DeclarationNode * DeclarationNode::copySpecifiers( DeclarationNode * q ) { 468 funcSpecs |= q->funcSpecs;469 storageClasses |= q->storageClasses;475 funcSpecs.val |= q->funcSpecs.val; 476 storageClasses.val |= q->storageClasses.val; 470 477 471 478 for ( Attribute *attr: reverseIterate( q->attributes ) ) { … … 490 497 src = nullptr; 491 498 } else { 492 dst->qualifiers |= src->qualifiers;499 dst->qualifiers += src->qualifiers; 493 500 } // if 494 501 } // addQualifiersToType … … 548 555 switch ( dst->kind ) { 549 556 case TypeData::Unknown: 550 src->qualifiers |= dst->qualifiers;557 src->qualifiers += dst->qualifiers; 551 558 dst = src; 552 559 src = nullptr; 553 560 break; 554 561 case TypeData::Basic: 555 dst->qualifiers |= src->qualifiers;562 dst->qualifiers += src->qualifiers; 556 563 if ( src->kind != TypeData::Unknown ) { 557 564 assert( src->kind == TypeData::Basic ); … … 589 596 dst->base->aggInst.params = maybeClone( src->aggregate.actuals ); 590 597 } // if 591 dst->base->qualifiers |= src->qualifiers;598 dst->base->qualifiers += src->qualifiers; 592 599 src = nullptr; 593 600 break; … … 621 628 type->aggInst.hoistType = o->type->enumeration.body; 622 629 } // if 623 type->qualifiers |= o->type->qualifiers;630 type->qualifiers += o->type->qualifiers; 624 631 } else { 625 632 type = o->type; … … 777 784 p->type->base->aggInst.params = maybeClone( type->aggregate.actuals ); 778 785 } // if 779 p->type->base->qualifiers |= type->qualifiers;786 p->type->base->qualifiers += type->qualifiers; 780 787 break; 781 788 … … 814 821 lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals ); 815 822 } // if 816 lastArray->base->qualifiers |= type->qualifiers;823 lastArray->base->qualifiers += type->qualifiers; 817 824 break; 818 825 default:
Note:
See TracChangeset
for help on using the changeset viewer.