Changeset 7c782af for src/SymTab


Ignore:
Timestamp:
Feb 16, 2018, 4:22:25 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
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:
5964127
Parents:
c71b256 (diff), 62cd621 (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.
Message:

Merge branch 'master' of plg.uwaterloo.ca:/u/cforall/software/cfa/cfa-cc

Location:
src/SymTab
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Indexer.cc

    rc71b256 r7c782af  
    443443                        // isomorphic to C type-compatibility, which it may not be.
    444444                        if ( hasIncompatibleCDecl( name, mangleName, scope ) ) {
    445                                 throw SemanticError( "conflicting overload of C function ", decl );
     445                                throw SemanticError( decl, "conflicting overload of C function " );
    446446                        }
    447447                } else {
    448448                        // Check that a Cforall declaration doesn't override any C declaration
    449449                        if ( hasCompatibleCDecl( name, mangleName, scope ) ) {
    450                                 throw SemanticError( "Cforall declaration hides C function ", decl );
     450                                throw SemanticError( decl, "Cforall declaration hides C function " );
    451451                        }
    452452                }
     
    463463        void Indexer::addId( DeclarationWithType * decl, Expression * baseExpr ) {
    464464                // default handling of conflicts is to raise an error
    465                 addId( decl, [decl](IdData &, const std::string & msg) { throw SemanticError( msg, decl ); return true; }, baseExpr );
     465                addId( decl, [decl](IdData &, const std::string & msg) { throw SemanticError( decl, msg ); return true; }, baseExpr );
    466466        }
    467467
    468468        void Indexer::addDeletedId( DeclarationWithType * decl, BaseSyntaxNode * deleteStmt ) {
    469469                // default handling of conflicts is to raise an error
    470                 addId( decl, [decl](IdData &, const std::string & msg) { throw SemanticError( msg, decl ); return true; }, nullptr, deleteStmt );
     470                addId( decl, [decl](IdData &, const std::string & msg) { throw SemanticError( decl, msg ); return true; }, nullptr, deleteStmt );
    471471        }
    472472
     
    477477                        return true;
    478478                } else {
    479                         throw SemanticError( "redeclaration of ", added );
     479                        throw SemanticError( added, "redeclaration of " );
    480480                }
    481481        }
     
    504504                        return false;
    505505                } else if ( ! added->get_members().empty() ) {
    506                         throw SemanticError( "redeclaration of ", added );
     506                        throw SemanticError( added, "redeclaration of " );
    507507                } // if
    508508                return true;
  • src/SymTab/Validate.cc

    rc71b256 r7c782af  
    361361                        // the only case in which "void" is valid is where it is the only one in the list
    362362                        if ( containsVoid && ( nvals > 1 || isVarArgs ) ) {
    363                                 throw SemanticError( "invalid type void in function type ", func );
     363                                throw SemanticError( func, "invalid type void in function type " );
    364364                        }
    365365
     
    402402                for ( Expression * param : inst->parameters ) {
    403403                        if ( ! dynamic_cast< TypeExpr * >( param ) ) {
    404                                 throw SemanticError( "Expression parameters for generic types are currently unsupported: ", inst );
     404                                throw SemanticError( inst, "Expression parameters for generic types are currently unsupported: " );
    405405                        }
    406406                }
     
    502502                TraitDecl *traitDecl = local_indexer->lookupTrait( traitInst->name );
    503503                if ( ! traitDecl ) {
    504                         throw SemanticError( "use of undeclared trait " + traitInst->name );
     504                        throw SemanticError( traitInst->location, "use of undeclared trait " + traitInst->name );
    505505                } // if
    506506                if ( traitDecl->get_parameters().size() != traitInst->get_parameters().size() ) {
    507                         throw SemanticError( "incorrect number of trait parameters: ", traitInst );
     507                        throw SemanticError( traitInst, "incorrect number of trait parameters: " );
    508508                } // if
    509509                traitInst->baseTrait = traitDecl;
     
    513513                        TypeExpr * expr = dynamic_cast< TypeExpr * >( std::get<1>(p) );
    514514                        if ( ! expr ) {
    515                                 throw SemanticError( "Expression parameters for trait instances are currently unsupported: ", std::get<1>(p) );
     515                                throw SemanticError( std::get<1>(p), "Expression parameters for trait instances are currently unsupported: " );
    516516                        }
    517517                        if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( expr->get_type() ) ) {
     
    619619                                bool isVoid = fixFunction( assertion );
    620620                                if ( isVoid ) {
    621                                         throw SemanticError( "invalid type void in assertion of function ", node );
     621                                        throw SemanticError( node, "invalid type void in assertion of function " );
    622622                                } // if
    623623                        } // for
     
    663663                // were cast to void.
    664664                if ( ! returnStmt->get_expr() && returnVals.size() != 0 ) {
    665                         throw SemanticError( "Non-void function returns no values: " , returnStmt );
     665                        throw SemanticError( returnStmt, "Non-void function returns no values: " );
    666666                }
    667667        }
     
    704704                                ReferenceToType *rtt = dynamic_cast<ReferenceToType*>(ret);
    705705                                if ( ! rtt ) {
    706                                         throw SemanticError("Cannot apply type parameters to base type of " + typeInst->name);
     706                                        throw SemanticError( typeInst->location, "Cannot apply type parameters to base type of " + typeInst->name );
    707707                                }
    708708                                rtt->get_parameters().clear();
     
    742742                        Type * t2 = typedefNames[ tyDecl->get_name() ].first->get_base();
    743743                        if ( ! ResolvExpr::typesCompatible( t1, t2, Indexer() ) ) {
    744                                 throw SemanticError( "Cannot redefine typedef: " + tyDecl->name );
     744                                throw SemanticError( tyDecl->location, "Cannot redefine typedef: " + tyDecl->name );
    745745                        }
    746746                        // Cannot redefine VLA typedefs. Note: this is slightly incorrect, because our notion of VLAs
     
    749749                        // to fix this corner case likely outweighs the utility of allowing it.
    750750                        if ( isVariableLength( t1 ) || isVariableLength( t2 ) ) {
    751                                 throw SemanticError( "Cannot redefine typedef: " + tyDecl->name );
     751                                throw SemanticError( tyDecl->location, "Cannot redefine typedef: " + tyDecl->name );
    752752                        }
    753753                } else {
     
    847847                                type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
    848848                        } // if
    849                         TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type, aggDecl->get_linkage() ) );
     849                        TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() ) );
    850850                        typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel );
    851851                } // if
     
    898898                if ( CodeGen::isCtorDtorAssign( funcDecl->get_name() ) ) { // TODO: also check /=, etc.
    899899                        if ( params.size() == 0 ) {
    900                                 throw SemanticError( "Constructors, destructors, and assignment functions require at least one parameter ", funcDecl );
     900                                throw SemanticError( funcDecl, "Constructors, destructors, and assignment functions require at least one parameter " );
    901901                        }
    902902                        ReferenceType * refType = dynamic_cast< ReferenceType * >( params.front()->get_type() );
    903903                        if ( ! refType ) {
    904                                 throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a reference ", funcDecl );
     904                                throw SemanticError( funcDecl, "First parameter of a constructor, destructor, or assignment function must be a reference " );
    905905                        }
    906906                        if ( CodeGen::isCtorDtor( funcDecl->get_name() ) && returnVals.size() != 0 ) {
    907                                 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl );
     907                                throw SemanticError( funcDecl, "Constructors and destructors cannot have explicit return values " );
    908908                        }
    909909                }
     
    940940
    941941                        sub.apply( inst );
    942                         if ( args.size() < params->size() ) throw SemanticError( "Too few type arguments in generic type ", inst );
    943                         if ( args.size() > params->size() ) throw SemanticError( "Too many type arguments in generic type ", inst );
     942                        if ( args.size() < params->size() ) throw SemanticError( inst, "Too few type arguments in generic type " );
     943                        if ( args.size() > params->size() ) throw SemanticError( inst, "Too many type arguments in generic type " );
    944944                }
    945945        }
Note: See TracChangeset for help on using the changeset viewer.