Changeset fd782b2 for src/Parser/DeclarationNode.cc
- Timestamp:
- Sep 15, 2016, 10:55:52 AM (8 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:
- aa8f9df
- Parents:
- f006f01 (diff), 1eba452 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/DeclarationNode.cc
rf006f01 rfd782b2 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 9 23:21:47201613 // Update Count : 4 0212 // Last Modified On : Sun Sep 11 09:24:11 2016 13 // Update Count : 438 14 14 // 15 15 … … 31 31 32 32 // These must remain in the same order as the corresponding DeclarationNode enumerations. 33 const char *DeclarationNode::storageName[] = { "extern", "static", "auto", "register", "inline", "fortran", "_Noreturn", "_Thread_local", " " };33 const char *DeclarationNode::storageName[] = { "extern", "static", "auto", "register", "inline", "fortran", "_Noreturn", "_Thread_local", "NoStorageClass" }; 34 34 const char *DeclarationNode::qualifierName[] = { "const", "restrict", "volatile", "lvalue", "_Atomic" }; 35 35 const char *DeclarationNode::basicTypeName[] = { "char", "int", "float", "double", "void", "_Bool", "_Complex", "_Imaginary", }; … … 389 389 390 390 void DeclarationNode::checkQualifiers( const TypeData *src, const TypeData *dst ) { 391 TypeData::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; 392 393 if ( (qsrc & qdst).any() ) { // common bits between qualifier masks?391 TypeData::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization 392 393 if ( (qsrc & qdst).any() ) { // common qualifier ? 394 394 for ( int i = 0; i < NoOfQualifier; i += 1 ) { // find common qualifiers 395 395 if ( qsrc[i] & qdst[i] ) { 396 error += string(error.empty() ? "" : ", ") + "duplicate " + DeclarationNode::qualifierName[i]; 396 if ( ! error.empty() ) error += ", "; // separator 397 error += string( "duplicate " ) + DeclarationNode::qualifierName[i]; 397 398 } // if 398 399 } // for 399 400 } // if 400 401 } // DeclarationNode::checkQualifiers 402 403 void DeclarationNode::checkStorageClasses( DeclarationNode *q ) { 404 if ( storageClass != NoStorageClass && q->storageClass != NoStorageClass ) { 405 if ( ! error.empty() ) error += ", "; // separator 406 if ( storageClass == q->storageClass ) { // duplicate qualifier 407 error += string( "duplicate " ) + storageName[ storageClass ]; 408 } else { // only one storage class 409 error += string( "conflicting " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ]; 410 q->storageClass = storageClass; // FIX ERROR 411 } // if 412 if ( ! q->error.empty() ) error += ", " + q->error; // separator 413 } else { 414 if ( ! error.empty() ) { 415 if ( ! q->error.empty() ) error += ", " + q->error; // separator 416 } else if ( ! q->error.empty() ) error += q->error; 417 } // if 418 } // DeclarationNode::copyStorageClasses 419 420 DeclarationNode *DeclarationNode::copyStorageClasses( DeclarationNode *q ) { 421 isInline = isInline | q->isInline; 422 isNoreturn = isNoreturn | q->isNoreturn; 423 // do not overwrite an existing value with NoStorageClass 424 if ( q->storageClass != NoStorageClass ) { 425 assert( storageClass == NoStorageClass || storageClass == q->storageClass ); 426 storageClass = q->storageClass; 427 } // if 428 return this; 429 } // DeclarationNode::copyStorageClasses 401 430 402 431 DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) { 403 432 if ( q ) { 404 copyStorageClasses(q); 433 checkStorageClasses( q ); 434 copyStorageClasses( q ); 405 435 if ( q->type ) { 406 436 if ( ! type ) { … … 429 459 return this; 430 460 } 431 432 DeclarationNode *DeclarationNode::copyStorageClasses( DeclarationNode *q ) {433 isInline = isInline || q->isInline;434 isNoreturn = isNoreturn || q->isNoreturn;435 if ( storageClass == NoStorageClass ) {436 storageClass = q->storageClass;437 } else if ( q->storageClass != NoStorageClass ) {438 if ( storageClass == q->storageClass ) {439 q->error += string( "duplicate " ) + storageName[ storageClass ];440 } else { // can only have one storage class441 q->error += string( "multiple " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ];442 } // if443 } // if444 if ( ! q->error.empty() ) {445 error += (! error.empty() ? ", " : "") + q->error;446 } // if447 return this;448 } // DeclarationNode::copyStorageClasses449 461 450 462 static void addTypeToType( TypeData *&src, TypeData *&dst ) { … … 504 516 DeclarationNode *DeclarationNode::addType( DeclarationNode *o ) { 505 517 if ( o ) { 518 checkStorageClasses( o ); 506 519 copyStorageClasses( o ); 507 520 if ( o->type ) { … … 751 764 } // if 752 765 newnode->type->forall = maybeClone( type->forall ); 766 assert( storageClass == NoStorageClass ); 753 767 newnode->copyStorageClasses( this ); 754 768 newnode->name = assign_strptr( newName ); … … 791 805 DeclarationNode *newnode = new DeclarationNode; 792 806 newnode->type = maybeClone( type ); 807 assert( storageClass == NoStorageClass ); 793 808 newnode->copyStorageClasses( this ); 794 809 newnode->name = assign_strptr( newName ); … … 798 813 DeclarationNode *DeclarationNode::cloneType( DeclarationNode *o ) { 799 814 if ( o ) { 815 assert( storageClass == NoStorageClass ); 800 816 o->copyStorageClasses( this ); 801 817 if ( type ) {
Note: See TracChangeset
for help on using the changeset viewer.