Changeset 31e46b8 for src/SymTab
- Timestamp:
- Jul 22, 2016, 2:05:52 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- ccb447e, e4957e7
- Parents:
- 956a9c7 (diff), ef3b335 (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. - Location:
- src/SymTab
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Indexer.cc
r956a9c7 r31e46b8 526 526 527 527 return tables->base.hasIncompatibleCDecl( id, mangleName, scope ); 528 } 529 530 bool Indexer::hasCompatibleCDecl( const std::string &id, const std::string &mangleName, unsigned long scope ) const { 531 if ( ! tables ) return false; 532 if ( tables->scope < scope ) return false; 533 534 IdTable::const_iterator decls = tables->idTable.find( id ); 535 if ( decls != tables->idTable.end() ) { 536 const MangleTable &mangleTable = decls->second; 537 for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) { 538 // check for C decls with the same name, skipping 539 // those with an incompatible type (by mangleName) 540 if ( decl->second->get_linkage() == LinkageSpec::C && decl->first == mangleName ) return true; 541 } 542 } 543 544 return tables->base.hasCompatibleCDecl( id, mangleName, scope ); 528 545 } 529 546 … … 616 633 } // if 617 634 635 // this ensures that no two declarations with the same unmangled name at the same scope both have C linkage 636 if ( decl->get_linkage() == LinkageSpec::C ) { 637 // NOTE this is broken in Richard's original code in such a way that it never triggers (it 638 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 639 // have their name as their manglename, hence the error can never trigger). 640 // The code here is closer to correct, but name mangling would have to be completely 641 // isomorphic to C type-compatibility, which it may not be. 642 if ( hasIncompatibleCDecl( name, mangleName, scope ) ) { 643 throw SemanticError( "conflicting overload of C function ", decl ); 644 } 645 } else { 646 // Check that a Cforall declaration doesn't overload any C declaration 647 if ( hasCompatibleCDecl( name, mangleName, scope ) ) { 648 throw SemanticError( "Cforall declaration hides C function ", decl ); 649 } 650 } 651 652 // Skip repeat declarations of the same identifier 618 653 DeclarationWithType *existing = lookupIdAtScope( name, mangleName, scope ); 619 if ( ! existing || ! addedIdConflicts( existing, decl ) ) { 620 // this ensures that no two declarations with the same unmangled name at the same scope both have C linkage 621 if ( decl->get_linkage() == LinkageSpec::C && hasIncompatibleCDecl( name, mangleName, scope ) ) { 622 throw SemanticError( "invalid overload of C function ", decl ); 623 } // NOTE this is broken in Richard's original code in such a way that it never triggers (it 624 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to 625 // have their name as their manglename, hence the error can never trigger). 626 // The code here is closer to correct, but name mangling would have to be completely 627 // isomorphic to C type-compatibility, which it may not be. 628 629 tables->idTable[ name ][ mangleName ] = decl; 630 ++tables->size; 631 } 654 if ( existing && addedIdConflicts( existing, decl ) ) return; 655 656 // add to indexer 657 tables->idTable[ name ][ mangleName ] = decl; 658 ++tables->size; 632 659 } 633 660 -
src/SymTab/Indexer.h
r956a9c7 r31e46b8 100 100 /// returns true if there exists a declaration with C linkage and the given name with a different mangled name 101 101 bool hasIncompatibleCDecl( const std::string &id, const std::string &mangleName, unsigned long scope ) const; 102 /// returns true if there exists a declaration with C linkage and the given name with the same mangled name 103 bool hasCompatibleCDecl( const std::string &id, const std::string &mangleName, unsigned long scope ) const; 102 104 // equivalents to lookup functions that only look at tables at scope `scope` (which should be >= tables->scope) 103 105 NamedTypeDecl *lookupTypeAtScope( const std::string &id, unsigned long scope ) const; -
src/SymTab/Mangler.cc
r956a9c7 r31e46b8 282 282 mangleName << "V"; 283 283 } // if 284 if ( type->get_isRestrict() ) { 285 mangleName << "R"; 286 } // if 284 // Removed due to restrict not affecting function compatibility in GCC 285 // if ( type->get_isRestrict() ) { 286 // mangleName << "R"; 287 // } // if 287 288 if ( type->get_isLvalue() ) { 288 289 mangleName << "L";
Note: See TracChangeset
for help on using the changeset viewer.