Changeset 738e304 for src/Parser/DeclarationNode.cc
- Timestamp:
- Mar 15, 2017, 10:46:40 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 905eca1
- Parents:
- f2e40a9f
- git-author:
- Peter A. Buhr <pabuhr@…> (03/15/17 22:42:52)
- git-committer:
- Peter A. Buhr <pabuhr@…> (03/15/17 22:46:40)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
rf2e40a9f r738e304 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 22:42:54201713 // Update Count : 9 7412 // Last Modified On : Wed Mar 15 22:31:36 2017 13 // Update Count : 983 14 14 // 15 15 … … 35 35 const char * DeclarationNode::storageClassNames[] = { "extern", "static", "auto", "register", "_Thread_local", "NoStorageClassNames" }; 36 36 const char * DeclarationNode::funcSpecifierNames[] = { "inline", "fortran", "_Noreturn", "NoFunctionSpecifierNames" }; 37 const char * DeclarationNode::typeQualifierNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic", "NoTypeQualifierNames" };38 37 const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "float", "double", "long double", "NoBasicTypeNames" }; 39 38 const char * DeclarationNode::complexTypeNames[] = { "_Complex", "_Imaginary", "NoComplexTypeNames" }; … … 214 213 } // DeclarationNode::newFuncSpecifier 215 214 216 DeclarationNode * DeclarationNode::newTypeQualifier( Type Qualifiers tq ) {215 DeclarationNode * DeclarationNode::newTypeQualifier( Type::Qualifiers tq ) { 217 216 DeclarationNode * newnode = new DeclarationNode; 218 217 newnode->type = new TypeData(); 219 newnode->type-> typeQualifiers = tq;218 newnode->type->qualifiers = tq; 220 219 return newnode; 221 220 } // DeclarationNode::newQualifier … … 457 456 458 457 void DeclarationNode::checkQualifiers( const TypeData * src, const TypeData * dst ) { 459 const Type Qualifiers qsrc = src->typeQualifiers, qdst = dst->typeQualifiers; // optimization458 const Type::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization 460 459 461 460 if ( (qsrc.val & qdst.val) != 0 ) { // duplicates ? 462 for ( unsigned int i = 0; i < NumTypeQualifier; i += 1 ) { // find duplicates461 for ( unsigned int i = 0; i < Type::NumTypeQualifier; i += 1 ) { // find duplicates 463 462 if ( qsrc[i] && qdst[i] ) { 464 appendError( error, string( "duplicate " ) + DeclarationNode::typeQualifierNames[i] );463 appendError( error, string( "duplicate " ) + Type::QualifierNames[i] ); 465 464 } // if 466 465 } // for … … 469 468 470 469 void DeclarationNode::checkSpecifiers( DeclarationNode * src ) { 471 if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) { 470 if ( (funcSpecs.val & src->funcSpecs.val) != 0 ) { // duplicates ? 472 471 for ( unsigned int i = 0; i < NumFuncSpecifier; i += 1 ) { // find duplicates 473 472 if ( funcSpecs[i] && src->funcSpecs[i] ) { … … 496 495 497 496 DeclarationNode * DeclarationNode::copySpecifiers( DeclarationNode * q ) { 498 funcSpecs.val = funcSpecs.val |q->funcSpecs.val;499 storageClasses.val = storageClasses.val |q->storageClasses.val;497 funcSpecs.val |= q->funcSpecs.val; 498 storageClasses.val |= q->storageClasses.val; 500 499 501 500 for ( Attribute *attr: reverseIterate( q->attributes ) ) { … … 520 519 src = nullptr; 521 520 } else { 522 dst-> typeQualifiers.val |= src->typeQualifiers.val;521 dst->qualifiers += src->qualifiers; 523 522 } // if 524 523 } // addQualifiersToType … … 578 577 switch ( dst->kind ) { 579 578 case TypeData::Unknown: 580 src-> typeQualifiers.val |= dst->typeQualifiers.val;579 src->qualifiers += dst->qualifiers; 581 580 dst = src; 582 581 src = nullptr; 583 582 break; 584 583 case TypeData::Basic: 585 dst-> typeQualifiers.val |= src->typeQualifiers.val;584 dst->qualifiers += src->qualifiers; 586 585 if ( src->kind != TypeData::Unknown ) { 587 586 assert( src->kind == TypeData::Basic ); … … 619 618 dst->base->aggInst.params = maybeClone( src->aggregate.actuals ); 620 619 } // if 621 dst->base-> typeQualifiers.val |= src->typeQualifiers.val;620 dst->base->qualifiers += src->qualifiers; 622 621 src = nullptr; 623 622 break; … … 651 650 type->aggInst.hoistType = o->type->enumeration.body; 652 651 } // if 653 type-> typeQualifiers.val |= o->type->typeQualifiers.val;652 type->qualifiers += o->type->qualifiers; 654 653 } else { 655 654 type = o->type; … … 807 806 p->type->base->aggInst.params = maybeClone( type->aggregate.actuals ); 808 807 } // if 809 p->type->base-> typeQualifiers.val |= type->typeQualifiers.val;808 p->type->base->qualifiers += type->qualifiers; 810 809 break; 811 810 … … 832 831 833 832 DeclarationNode * DeclarationNode::addNewArray( DeclarationNode * 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.val |= type->typeQualifiers.val; 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 833 if ( ! a ) return this; 834 assert( a->type->kind == TypeData::Array ); 835 TypeData * lastArray = findLast( a->type ); 836 if ( type ) { 837 switch ( type->kind ) { 838 case TypeData::Aggregate: 839 case TypeData::Enum: 840 lastArray->base = new TypeData( TypeData::AggregateInst ); 841 lastArray->base->aggInst.aggregate = type; 842 if ( type->kind == TypeData::Aggregate ) { 843 lastArray->base->aggInst.params = maybeClone( type->aggregate.actuals ); 844 } // if 845 lastArray->base->qualifiers += type->qualifiers; 846 break; 847 default: 848 lastArray->base = type; 849 } // switch 850 type = nullptr; 851 } // if 852 delete this; 853 return a; 858 854 } 859 855
Note: See TracChangeset
for help on using the changeset viewer.