Changeset d55d7a6
- Timestamp:
- Feb 15, 2018, 3:58:56 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:
- 75e3cb2
- Parents:
- d27e340
- Location:
- src
- Files:
-
- 32 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/FixMain.cc
rd27e340 rd55d7a6 39 39 { 40 40 if(main_signature) { 41 throw SemanticError( "Multiple definition of main routine\n", functionDecl);41 throw SemanticError(functionDecl, "Multiple definition of main routine\n"); 42 42 } 43 43 main_signature.reset( functionDecl->clone() ); -
src/CodeGen/FixNames.cc
rd27e340 rd55d7a6 118 118 int nargs = functionDecl->get_functionType()->get_parameters().size(); 119 119 if( !(nargs == 0 || nargs == 2 || nargs == 3) ) { 120 throw SemanticError( "Main expected to have 0, 2 or 3 arguments\n", functionDecl);120 throw SemanticError(functionDecl, "Main expected to have 0, 2 or 3 arguments\n"); 121 121 } 122 122 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( new ConstantExpr( Constant::from_int( 0 ) ) ) ); -
src/Common/PassVisitor.impl.h
rd27e340 rd55d7a6 77 77 maybeAccept_impl( *i, visitor ); 78 78 } catch( SemanticError &e ) { 79 e.set_location( (*i)->location );80 79 errors.append( e ); 81 80 } … … 104 103 maybeMutate_impl( *i, mutator ); 105 104 } catch( SemanticError &e ) { 106 e.set_location( (*i)->location );107 105 errors.append( e ); 108 106 } … … 134 132 } 135 133 } catch( SemanticError &e ) { 136 e.set_location( (*i)->location );137 134 errors.append( e ); 138 135 } … … 163 160 } // if 164 161 } catch( SemanticError &e ) { 165 e.set_location( (*i)->location );166 162 errors.append( e ); 167 163 } // try … … 200 196 201 197 } catch ( SemanticError &e ) { 202 e.set_location( (*i)->location );203 198 errors.append( e ); 204 199 } -
src/Common/SemanticError.cc
rd27e340 rd55d7a6 23 23 #include "SemanticError.h" 24 24 25 SemanticError::SemanticError() { 26 } 27 28 SemanticError::SemanticError( std::string error ) { 29 append( error ); 25 SemanticError::SemanticError( CodeLocation location, std::string error ) { 26 append( location, error ); 30 27 } 31 28 … … 34 31 } 35 32 36 void SemanticError::append( const std::string & msg ) {37 errors.emplace_back( error_str() +msg );33 void SemanticError::append( CodeLocation location, const std::string & msg ) { 34 errors.emplace_back( location, msg ); 38 35 } 39 36 … … 42 39 } 43 40 44 void SemanticError::print( std::ostream &os) {41 void SemanticError::print() { 45 42 using std::to_string; 46 43 for( auto err : errors ) { 47 os << err.location<< err.description << std::endl;44 std::cerr << bold() << err.location << error_str() << reset_font() << err.description << std::endl; 48 45 } 49 46 } 50 47 51 void SemanticError::set_location( const CodeLocation& location) {52 errors.begin()->maybeSet( location );48 SemanticWarning::SemanticWarning( CodeLocation location, std::string msg ) { 49 std::cerr << bold() << location << warning_str() << reset_font() << msg << std::endl; 53 50 } 54 51 -
src/Common/SemanticError.h
rd27e340 rd55d7a6 24 24 #include "CodeLocation.h" // for CodeLocation, toString 25 25 26 //----------------------------------------------------------------------------- 27 // Errors 26 28 struct error { 29 CodeLocation location; 27 30 std::string description; 28 CodeLocation location;29 31 30 32 error() = default; 31 error( const std::string & str ) : description( str ) {} 32 33 void maybeSet( const CodeLocation & location ) { 34 if( this->location.isUnset() ) { 35 this->location = location; 36 } 37 } 33 error( CodeLocation loc, const std::string & str ) : location( loc ), description( str ) {} 38 34 }; 39 35 40 36 class SemanticError : public std::exception { 41 37 public: 42 SemanticError(); 43 SemanticError( std::string error ); 44 template< typename T > SemanticError( const std::string & error, const T * obj ); 38 SemanticError() = default; 39 SemanticError( CodeLocation location, std::string error ); 45 40 ~SemanticError() throw() {} 41 42 // constructs an exception using the given message and the printed representation of the obj (T must have a print method) 43 template< typename T > SemanticError(const T * obj, const std::string & error); 44 template< typename T > SemanticError( CodeLocation location, const T * obj, const std::string & error); 46 45 47 46 static inline const std::string & error_str() { … … 51 50 52 51 void append( SemanticError & other ); 53 void append( const std::string & );52 void append( CodeLocation location, const std::string & ); 54 53 bool isEmpty() const; 55 void print( std::ostream & os ); 56 57 void set_location( const CodeLocation & location ); 58 // constructs an exception using the given message and the printed representation of the obj (T must have a print 59 // method) 54 void print(); 60 55 private: 61 56 std::list< error > errors; … … 63 58 64 59 template< typename T > 65 SemanticError::SemanticError( const std::string & error, const T * obj ) { 66 append( toString( error, obj ) ); 60 SemanticError::SemanticError( const T * obj, const std::string & error ) 61 : SemanticError( obj->location, toString( error, obj ) ) 62 {} 63 64 template< typename T > 65 SemanticError::SemanticError( CodeLocation location, const T * obj, const std::string & error ) 66 : SemanticError( location, toString( error, obj ) ) 67 {} 68 69 //----------------------------------------------------------------------------- 70 // Warnings 71 class SemanticWarning { 72 public: 73 SemanticWarning( CodeLocation location, std::string error ); 74 ~SemanticWarning() throw() {} 75 76 // constructs an exception using the given message and the printed representation of the obj (T must have a print method) 77 template< typename T > SemanticWarning(const T * obj, const std::string & error); 78 template< typename T > SemanticWarning( CodeLocation location, const T * obj, const std::string & error); 79 80 static inline const std::string & warning_str() { 81 static std::string str = isatty( STDERR_FILENO ) ? "\e[95mwarning:\e[39m " : "warning: "; 82 return str; 83 } 84 85 private: 86 }; 87 88 template< typename T > 89 SemanticWarning::SemanticWarning( const T * obj, const std::string & error ) 90 : SemanticWarning( obj->location, toString( error, obj ) ) 91 {} 92 93 template< typename T > 94 SemanticWarning::SemanticWarning( CodeLocation location, const T * obj, const std::string & error ) 95 : SemanticWarning( location, toString( error, obj ) ) 96 {} 97 98 //----------------------------------------------------------------------------- 99 // Helpers 100 static inline const std::string & bold_ttycode() { 101 static std::string str = isatty( STDERR_FILENO ) ? "\e[1m" : ""; 102 return str; 103 } 104 105 static inline const std::string & reset_font_ttycode() { 106 static std::string str = isatty( STDERR_FILENO ) ? "\e[0m" : ""; 107 return str; 108 } 109 110 static inline std::string make_bold( const std::string & str ) { 111 return bold_ttycode() + str + reset_font_ttycode(); 112 } 113 114 struct bold {}; 115 static inline std::ostream & operator<<(std::ostream & os, bold) { 116 os << bold_ttycode(); 117 return os; 118 } 119 120 struct reset_font {}; 121 static inline std::ostream & operator<<(std::ostream & os, reset_font) { 122 os << reset_font_ttycode(); 123 return os; 67 124 } 68 125 -
src/Concurrency/Keywords.cc
rd27e340 rd55d7a6 276 276 handle( decl ); 277 277 } 278 279 278 } 280 279 … … 282 281 if( ! decl->body ) return; 283 282 284 if( !type_decl ) throw SemanticError( context_error, decl);283 if( !type_decl ) throw SemanticError( decl, context_error ); 285 284 286 285 FunctionDecl * func = forwardDeclare( decl ); … … 419 418 if( mutexArgs.empty() ) return; 420 419 421 if( CodeGen::isConstructor(decl->name) ) throw SemanticError( "constructors cannot have mutex parameters", decl);420 if( CodeGen::isConstructor(decl->name) ) throw SemanticError( decl, "constructors cannot have mutex parameters" ); 422 421 423 422 bool isDtor = CodeGen::isDestructor( decl->name ); 424 423 425 if( isDtor && mutexArgs.size() != 1 ) throw SemanticError( "destructors can only have 1 mutex argument", decl);424 if( isDtor && mutexArgs.size() != 1 ) throw SemanticError( decl, "destructors can only have 1 mutex argument" ); 426 425 427 426 for(auto arg : mutexArgs) { … … 432 431 if( ! body ) return; 433 432 434 if( !monitor_decl ) throw SemanticError( "mutex keyword requires monitors to be in scope, add #include <monitor>", decl);435 if( !guard_decl ) throw SemanticError( "mutex keyword requires monitors to be in scope, add #include <monitor>", decl);436 if( !dtor_guard_decl ) throw SemanticError( "mutex keyword requires monitors to be in scope, add #include <monitor>", decl);433 if( !monitor_decl ) throw SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>" ); 434 if( !guard_decl ) throw SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>" ); 435 if( !dtor_guard_decl ) throw SemanticError( decl, "mutex keyword requires monitors to be in scope, add #include <monitor>" ); 437 436 438 437 if( isDtor ) { … … 480 479 //Makes sure it's not a copy 481 480 ReferenceType* rty = dynamic_cast< ReferenceType * >( ty ); 482 if( ! rty ) throw SemanticError( "Mutex argument must be of reference type ", arg);481 if( ! rty ) throw SemanticError( arg, "Mutex argument must be of reference type " ); 483 482 484 483 //Make sure the we are pointing directly to a type 485 484 Type* base = rty->get_base(); 486 if( dynamic_cast< ReferenceType * >( base ) ) throw SemanticError( "Mutex argument have exactly one level of indirection ", arg);487 if( dynamic_cast< PointerType * >( base ) ) throw SemanticError( "Mutex argument have exactly one level of indirection ", arg);485 if( dynamic_cast< ReferenceType * >( base ) ) throw SemanticError( arg, "Mutex argument have exactly one level of indirection " ); 486 if( dynamic_cast< PointerType * >( base ) ) throw SemanticError( arg, "Mutex argument have exactly one level of indirection " ); 488 487 489 488 //Make sure that typed isn't mutex 490 if( base->get_mutex() ) throw SemanticError( "mutex keyword may only appear once per argument ", arg);489 if( base->get_mutex() ) throw SemanticError( arg, "mutex keyword may only appear once per argument " ); 491 490 } 492 491 … … 626 625 if( type && type->get_baseStruct()->is_thread() ) { 627 626 if( !thread_decl || !thread_ctor_seen ) { 628 throw SemanticError( "thread keyword requires threads to be in scope, add #include <thread>");627 throw SemanticError( type->get_baseStruct()->location, "thread keyword requires threads to be in scope, add #include <thread>"); 629 628 } 630 629 -
src/Concurrency/Waitfor.cc
rd27e340 rd55d7a6 249 249 250 250 Statement * GenerateWaitForPass::postmutate( WaitForStmt * waitfor ) { 251 if( !decl_monitor || !decl_acceptable || !decl_mask ) throw SemanticError( "waitfor keyword requires monitors to be in scope, add #include <monitor>", waitfor ); 251 if( !decl_monitor || !decl_acceptable || !decl_mask ) 252 throw SemanticError( waitfor, "waitfor keyword requires monitors to be in scope, add #include <monitor>" ); 252 253 253 254 CompoundStmt * stmt = new CompoundStmt(); -
src/ControlStruct/ExceptTranslate.cc
rd27e340 rd55d7a6 572 572 // Pass. 573 573 } else if ( CatchStmt::Terminate == catchStmt->get_kind() ) { 574 throw SemanticError( "catch must have exception type");574 throw SemanticError(catchStmt->location, "catch must have exception type"); 575 575 } else { 576 throw SemanticError( "catchResume must have exception type");576 throw SemanticError(catchStmt->location, "catchResume must have exception type"); 577 577 } 578 578 -
src/ControlStruct/LabelFixer.cc
rd27e340 rd55d7a6 92 92 } else if ( labelTable[ l ]->defined() ) { 93 93 // defined twice, error 94 throw SemanticError( "Duplicate definition of label: " + l.get_name() );94 throw SemanticError( l.get_statement()->location, "Duplicate definition of label: " + l.get_name() ); 95 95 } else { 96 96 // used previously, but undefined until now -> link with this entry … … 121 121 for ( std::map< Label, Entry * >::iterator i = labelTable.begin(); i != labelTable.end(); ++i ) { 122 122 if ( ! i->second->defined() ) { 123 throw SemanticError( "Use of undefined label: " + i->first.get_name() );123 throw SemanticError( i->first.get_statement()->location, "Use of undefined label: " + i->first.get_name() ); 124 124 } 125 125 (*ret)[ i->first ] = i->second->get_definition(); -
src/ControlStruct/MLEMutator.cc
rd27e340 rd55d7a6 115 115 } else { 116 116 // break target is outmost control structure 117 if ( enclosingControlStructures.empty() ) throw SemanticError( "'break' outside a loop, switch, or labelled block" );117 if ( enclosingControlStructures.empty() ) throw SemanticError( branchStmt->location, "'break' outside a loop, switch, or labelled block" ); 118 118 targetEntry = enclosingControlStructures.rbegin(); 119 119 } // if … … 124 124 // ensure that selected target is valid 125 125 if ( targetEntry == enclosingControlStructures.rend() || (isContinue && ! isLoop( targetEntry->get_controlStructure() ) ) ) { 126 throw SemanticError( toString( (isContinue ? "'continue'" : "'break'"), " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "), originalTarget ) );126 throw SemanticError( branchStmt->location, toString( (isContinue ? "'continue'" : "'break'"), " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "), originalTarget ) ); 127 127 } // if 128 128 break; -
src/GenPoly/Box.cc
rd27e340 rd55d7a6 229 229 } // if 230 230 } catch( SemanticError &e ) { 231 e.set_location( (*i)->location );232 231 errors.append( e ); 233 232 } // try … … 576 575 } 577 576 } else { 578 throw SemanticError( "Cannot pass non-struct type for generic struct: ", argBaseType);577 throw SemanticError( argBaseType, "Cannot pass non-struct type for generic struct: " ); 579 578 } 580 579 } … … 598 597 } else { 599 598 // xxx - should this be an assertion? 600 throw SemanticError( toString( *env, "\nunbound type variable: ", tyParm->first, " in application " ), appExpr);599 throw SemanticError( appExpr, toString( *env, "\nunbound type variable: ", tyParm->first, " in application " ) ); 601 600 } // if 602 601 } // if -
src/InitTweak/FixInit.cc
rd27e340 rd55d7a6 282 282 translationUnit.splice( i, fixer.pass.staticDtorDecls ); 283 283 } catch( SemanticError &e ) { 284 e.set_location( (*i)->location );285 284 errors.append( e ); 286 285 } // try … … 895 894 ) 896 895 if ( ! diff.empty() ) { 897 throw SemanticError( st d::string("jump to label '") + stmt->get_target().get_name() + "' crosses initialization of " + (*diff.begin())->get_name() + " ", stmt);896 throw SemanticError( stmt, std::string("jump to label '") + stmt->get_target().get_name() + "' crosses initialization of " + (*diff.begin())->get_name() + " " ); 898 897 } // if 899 898 // S_G-S_L results in set of objects that must be destructed … … 1111 1110 template< typename Visitor, typename... Params > 1112 1111 void error( Visitor & v, CodeLocation loc, const Params &... params ) { 1113 SemanticError err( toString( params... ) ); 1114 err.set_location( loc ); 1112 SemanticError err( loc, toString( params... ) ); 1115 1113 v.errors.append( err ); 1116 1114 } -
src/InitTweak/GenInit.cc
rd27e340 rd55d7a6 317 317 if ( tryConstruct( objDecl ) && ( managedTypes.isManaged( objDecl ) || ((! inFunction || objDecl->get_storageClasses().is_static ) && ! isConstExpr( objDecl->get_init() ) ) ) ) { 318 318 // constructed objects cannot be designated 319 if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n", objDecl);319 if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( objDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n" ); 320 320 // constructed objects should not have initializers nested too deeply 321 if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl);321 if ( ! checkInitDepth( objDecl ) ) throw SemanticError( objDecl, "Managed object's initializer is too deep " ); 322 322 323 323 objDecl->set_init( genCtorInit( objDecl ) ); -
src/InitTweak/InitTweak.cc
rd27e340 rd55d7a6 225 225 // xxx - this shouldn't be an error, but need a way to 226 226 // terminate without creating output, so should catch this error 227 throw SemanticError( "unbalanced list initializers" );227 throw SemanticError( init->location, "unbalanced list initializers" ); 228 228 } 229 229 -
src/Parser/DeclarationNode.cc
rd27e340 rd55d7a6 581 581 dst->basictype = src->basictype; 582 582 } else if ( src->basictype != DeclarationNode::NoBasicType ) 583 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: ", src);583 throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: " ); 584 584 585 585 if ( dst->complextype == DeclarationNode::NoComplexType ) { 586 586 dst->complextype = src->complextype; 587 587 } else if ( src->complextype != DeclarationNode::NoComplexType ) 588 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: ", src);588 throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: " ); 589 589 590 590 if ( dst->signedness == DeclarationNode::NoSignedness ) { 591 591 dst->signedness = src->signedness; 592 592 } else if ( src->signedness != DeclarationNode::NoSignedness ) 593 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: ", src);593 throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: " ); 594 594 595 595 if ( dst->length == DeclarationNode::NoLength ) { … … 598 598 dst->length = DeclarationNode::LongLong; 599 599 } else if ( src->length != DeclarationNode::NoLength ) 600 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: ", src);600 throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: " ); 601 601 } // if 602 602 break; … … 966 966 } // if 967 967 } catch( SemanticError &e ) { 968 e.set_location( cur->location );969 968 errors.append( e ); 970 969 } // try … … 1001 1000 } // if 1002 1001 } catch( SemanticError &e ) { 1003 e.set_location( cur->location );1004 1002 errors.append( e ); 1005 1003 } // try … … 1020 1018 * out++ = cur->buildType(); 1021 1019 } catch( SemanticError &e ) { 1022 e.set_location( cur->location );1023 1020 errors.append( e ); 1024 1021 } // try … … 1032 1029 1033 1030 Declaration * DeclarationNode::build() const { 1034 if ( ! error.empty() ) throw SemanticError( error + " in declaration of ", this);1031 if ( ! error.empty() ) throw SemanticError( this, error + " in declaration of " ); 1035 1032 1036 1033 if ( asmStmt ) { … … 1055 1052 // inline _Noreturn int i; // disallowed 1056 1053 if ( type->kind != TypeData::Function && funcSpecs.any() ) { 1057 throw SemanticError( "invalid function specifier for ", this);1054 throw SemanticError( this, "invalid function specifier for " ); 1058 1055 } // if 1059 1056 return buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, maybeBuild< Initializer >(initializer), attributes )->set_extension( extension ); … … 1065 1062 // inlne _Noreturn enum E { ... }; // disallowed 1066 1063 if ( funcSpecs.any() ) { 1067 throw SemanticError( "invalid function specifier for ", this);1064 throw SemanticError( this, "invalid function specifier for " ); 1068 1065 } // if 1069 1066 assertf( name, "ObjectDecl must a have name\n" ); -
src/Parser/ExpressionNode.cc
rd27e340 rd55d7a6 356 356 357 357 Expression * build_field_name_FLOATING_FRACTIONconstant( const string & str ) { 358 if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( "invalid tuple index " + str );358 if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( yylloc, "invalid tuple index " + str ); 359 359 Expression * ret = build_constantInteger( *new string( str.substr(1) ) ); 360 360 delete &str; … … 363 363 364 364 Expression * build_field_name_FLOATING_DECIMALconstant( const string & str ) { 365 if ( str[str.size()-1] != '.' ) throw SemanticError( "invalid tuple index " + str );365 if ( str[str.size()-1] != '.' ) throw SemanticError( yylloc, "invalid tuple index " + str ); 366 366 Expression * ret = build_constantInteger( *new string( str.substr( 0, str.size()-1 ) ) ); 367 367 delete &str; -
src/Parser/LinkageSpec.cc
rd27e340 rd55d7a6 24 24 namespace LinkageSpec { 25 25 26 Spec linkageCheck( const string * spec ) {26 Spec linkageCheck( CodeLocation location, const string * spec ) { 27 27 assert( spec ); 28 28 unique_ptr<const string> guard( spec ); // allocated by lexer … … 34 34 return BuiltinC; 35 35 } else { 36 throw SemanticError( "Invalid linkage specifier " + *spec );36 throw SemanticError( location, "Invalid linkage specifier " + *spec ); 37 37 } // if 38 38 } 39 39 40 Spec linkageUpdate( Spec old_spec, const string * cmd ) {40 Spec linkageUpdate( CodeLocation location, Spec old_spec, const string * cmd ) { 41 41 assert( cmd ); 42 42 unique_ptr<const string> guard( cmd ); // allocated by lexer … … 48 48 return old_spec; 49 49 } else { 50 throw SemanticError( "Invalid linkage specifier " + *cmd );50 throw SemanticError( location, "Invalid linkage specifier " + *cmd ); 51 51 } // if 52 52 } -
src/Parser/LinkageSpec.h
rd27e340 rd55d7a6 17 17 18 18 #include <string> 19 20 #include "Common/CodeLocation.h" 19 21 20 22 namespace LinkageSpec { … … 45 47 46 48 47 Spec linkageCheck( const std::string * );49 Spec linkageCheck( CodeLocation location, const std::string * ); 48 50 // Returns the Spec with the given name (limited to C, Cforall & BuiltinC) 49 Spec linkageUpdate( Spec old_spec, const std::string * cmd );51 Spec linkageUpdate( CodeLocation location, Spec old_spec, const std::string * cmd ); 50 52 /* If cmd = "C" returns a Spec that is old_spec with is_mangled = false 51 53 * If cmd = "Cforall" returns old_spec Spec with is_mangled = true -
src/Parser/ParseNode.h
rd27e340 rd55d7a6 434 434 } // if 435 435 } catch( SemanticError &e ) { 436 e.set_location( cur->location );437 436 errors.append( e ); 438 437 } // try -
src/Parser/TypeData.cc
rd27e340 rd55d7a6 521 521 522 522 static string genTSError( string msg, DeclarationNode::BasicType basictype ) { 523 throw SemanticError( string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." );523 throw SemanticError( yylloc, string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." ); 524 524 } // genTSError 525 525 … … 923 923 // type set => parameter name already transformed by a declaration names so there is a duplicate 924 924 // declaration name attempting a second transformation 925 if ( param->type ) throw SemanticError( string( "duplicate declaration name " ) + *param->name );925 if ( param->type ) throw SemanticError( param->location, string( "duplicate declaration name " ) + *param->name ); 926 926 // declaration type reset => declaration already transformed by a parameter name so there is a duplicate 927 927 // parameter name attempting a second transformation 928 if ( ! decl->type ) throw SemanticError( string( "duplicate parameter name " ) + *param->name );928 if ( ! decl->type ) throw SemanticError( param->location, string( "duplicate parameter name " ) + *param->name ); 929 929 param->type = decl->type; // set copy declaration type to parameter type 930 930 decl->type = nullptr; // reset declaration type … … 933 933 } // for 934 934 // declaration type still set => type not moved to a matching parameter so there is a missing parameter name 935 if ( decl->type ) throw SemanticError( string( "missing name in parameter list " ) + *decl->name );935 if ( decl->type ) throw SemanticError( decl->location, string( "missing name in parameter list " ) + *decl->name ); 936 936 } // for 937 937 -
src/Parser/parser.yy
rd27e340 rd55d7a6 482 482 { $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); } 483 483 | type_name '.' no_attr_identifier // CFA, nested type 484 { throw SemanticError( "Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME484 { throw SemanticError(yylloc, "Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME 485 485 | type_name '.' '[' push field_list pop ']' // CFA, nested type / tuple field selector 486 { throw SemanticError( "Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME486 { throw SemanticError(yylloc, "Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME 487 487 ; 488 488 … … 1072 1072 mutex_statement: 1073 1073 MUTEX '(' argument_expression_list ')' statement 1074 { throw SemanticError( "Mutex statement is currently unimplemented."); $$ = nullptr; } // FIX ME1074 { throw SemanticError(yylloc, "Mutex statement is currently unimplemented."); $$ = nullptr; } // FIX ME 1075 1075 ; 1076 1076 … … 1293 1293 static_assert: 1294 1294 STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11 1295 { throw SemanticError( "Static assert is currently unimplemented."); $$ = nullptr; } // FIX ME1295 { throw SemanticError(yylloc, "Static assert is currently unimplemented."); $$ = nullptr; } // FIX ME 1296 1296 1297 1297 // C declaration syntax is notoriously confusing and error prone. Cforall provides its own type, variable and function … … 2381 2381 { 2382 2382 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" 2383 linkage = LinkageSpec::linkageUpdate( linkage, $2 );2383 linkage = LinkageSpec::linkageUpdate( yylloc, linkage, $2 ); 2384 2384 } 2385 2385 '{' external_definition_list_opt '}' -
src/ResolvExpr/AlternativeFinder.cc
rd27e340 rd55d7a6 252 252 std::cerr << "No reasonable alternatives for expression " << expr << std::endl; 253 253 ) 254 throw SemanticError( "No reasonable alternatives for expression ", expr);254 throw SemanticError( expr, "No reasonable alternatives for expression " ); 255 255 } 256 256 if ( prune ) { … … 270 270 stream << "Alternatives are:\n"; 271 271 printAlts( winners, stream, 1 ); 272 throw SemanticError( stream.str() );272 throw SemanticError( expr->location, stream.str() ); 273 273 } 274 274 alternatives = move(pruned); … … 507 507 return; 508 508 } else if ( level >= recursionLimit ) { 509 throw SemanticError( "Too many recursive assertions" );509 throw SemanticError( newAlt.expr->location, "Too many recursive assertions" ); 510 510 } else { 511 511 AssertionSet newerNeed; … … 1421 1421 findMinCost( finder.alternatives.begin(), finder.alternatives.end(), back_inserter( winners ) ); 1422 1422 if ( winners.size() != 1 ) { 1423 throw SemanticError( "Ambiguous expression in sizeof operand: ", sizeofExpr->get_expr());1423 throw SemanticError( sizeofExpr->get_expr(), "Ambiguous expression in sizeof operand: " ); 1424 1424 } // if 1425 1425 // return the lowest cost alternative for the argument … … 1442 1442 findMinCost( finder.alternatives.begin(), finder.alternatives.end(), back_inserter( winners ) ); 1443 1443 if ( winners.size() != 1 ) { 1444 throw SemanticError( "Ambiguous expression in alignof operand: ", alignofExpr->get_expr());1444 throw SemanticError( alignofExpr->get_expr(), "Ambiguous expression in alignof operand: " ); 1445 1445 } // if 1446 1446 // return the lowest cost alternative for the argument -
src/ResolvExpr/CurrentObject.cc
rd27e340 rd55d7a6 141 141 base = at->get_base(); 142 142 memberIter = createMemberIterator( base ); 143 if ( at->isVarLen ) throw SemanticError( "VLA initialization does not support @=", at);143 if ( at->isVarLen ) throw SemanticError( at, "VLA initialization does not support @=" ); 144 144 setSize( at->get_dimension() ); 145 145 } … … 156 156 PRINT( std::cerr << "array type with size: " << size << std::endl; ) 157 157 } catch ( SemanticError & ) { 158 throw SemanticError( "Constant expression of non-integral type in array dimension: ", expr);158 throw SemanticError( expr, "Constant expression of non-integral type in array dimension: " ); 159 159 } 160 160 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { … … 179 179 index = constExpr->intValue(); 180 180 } catch( SemanticError & ) { 181 throw SemanticError( "Constant expression of non-integral type in array designator: ", expr);181 throw SemanticError( expr, "Constant expression of non-integral type in array designator: " ); 182 182 } 183 183 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { … … 532 532 } // for 533 533 if ( desigAlts.size() > 1 ) { 534 throw SemanticError( toString("Too many alternatives (", desigAlts.size(), ") for designation: "), designation);534 throw SemanticError( designation, toString("Too many alternatives (", desigAlts.size(), ") for designation: ") ); 535 535 } else if ( desigAlts.size() == 0 ) { 536 throw SemanticError( "No reasonable alternatives for designation: ", designation);536 throw SemanticError( designation, "No reasonable alternatives for designation: " ); 537 537 } 538 538 DesignatorChain & d = desigAlts.back(); -
src/ResolvExpr/Resolver.cc
rd27e340 rd55d7a6 188 188 findMinCost( candidates.begin(), candidates.end(), back_inserter( winners ) ); 189 189 if ( winners.size() == 0 ) { 190 throw SemanticError( "No reasonable alternatives for " + kindStr + " expression: ", untyped);190 throw SemanticError( untyped, "No reasonable alternatives for " + kindStr + " expression: " ); 191 191 } else if ( winners.size() != 1 ) { 192 192 std::ostringstream stream; … … 195 195 stream << "Alternatives are:\n"; 196 196 printAlts( winners, stream, 1 ); 197 throw SemanticError( stream.str() );197 throw SemanticError( untyped->location, stream.str() ); 198 198 } 199 199 … … 429 429 ss << strict_dynamic_cast<NameExpr*>( clause.target.function )->name; 430 430 ss << "' in call to waitfor"; 431 throw SemanticError( s s.str() );431 throw SemanticError( stmt->location, ss.str() ); 432 432 } 433 433 … … 451 451 PointerType * pointer = dynamic_cast< PointerType* >( func.expr->get_result()->stripReferences() ); 452 452 if( !pointer ) { 453 throw SemanticError( "candidate not viable: not a pointer type\n", func.expr->get_result());453 throw SemanticError( func.expr->get_result(), "candidate not viable: not a pointer type\n" ); 454 454 } 455 455 456 456 FunctionType * function = dynamic_cast< FunctionType* >( pointer->get_base() ); 457 457 if( !function ) { 458 throw SemanticError( "candidate not viable: not a function type\n", pointer->get_base());458 throw SemanticError( pointer->get_base(), "candidate not viable: not a function type\n" ); 459 459 } 460 460 … … 465 465 466 466 if( !advance_to_mutex( param, param_end ) ) { 467 throw SemanticError( "candidate function not viable: no mutex parameters\n", function);467 throw SemanticError(function, "candidate function not viable: no mutex parameters\n"); 468 468 } 469 469 } … … 504 504 // We ran out of parameters but still have arguments 505 505 // this function doesn't match 506 throw SemanticError( "candidate function not viable: too many mutex arguments\n", function);506 throw SemanticError( function, "candidate function not viable: too many mutex arguments\n" ); 507 507 } 508 508 … … 516 516 (*param)->get_type()->print( ss ); 517 517 ss << "'\n"; 518 throw SemanticError( ss.str(), function);518 throw SemanticError( function, ss.str() ); 519 519 } 520 520 … … 528 528 // We ran out of arguments but still have parameters left 529 529 // this function doesn't match 530 throw SemanticError( "candidate function not viable: too few mutex arguments\n", function);530 throw SemanticError( function, "candidate function not viable: too few mutex arguments\n" ); 531 531 } 532 532 … … 555 555 556 556 // Make sure we got the right number of arguments 557 if( func_candidates.empty() ) { SemanticError top( "No alternatives for function in call to waitfor" ); top.append( errors ); throw top; }558 if( args_candidates.empty() ) { SemanticError top( "No alternatives for arguments in call to waitfor" ); top.append( errors ); throw top; }559 if( func_candidates.size() > 1 ) { SemanticError top( "Ambiguous function in call to waitfor" ); top.append( errors ); throw top; }560 if( args_candidates.size() > 1 ) { SemanticError top( "Ambiguous arguments in call to waitfor" ); top.append( errors ); throw top; }557 if( func_candidates.empty() ) { SemanticError top( stmt->location, "No alternatives for function in call to waitfor" ); top.append( errors ); throw top; } 558 if( args_candidates.empty() ) { SemanticError top( stmt->location, "No alternatives for arguments in call to waitfor" ); top.append( errors ); throw top; } 559 if( func_candidates.size() > 1 ) { SemanticError top( stmt->location, "Ambiguous function in call to waitfor" ); top.append( errors ); throw top; } 560 if( args_candidates.size() > 1 ) { SemanticError top( stmt->location, "Ambiguous arguments in call to waitfor" ); top.append( errors ); throw top; } 561 561 562 562 -
src/SymTab/Indexer.cc
rd27e340 rd55d7a6 388 388 if ( newentry && oldentry ) { 389 389 if ( newentry->get_statements() && oldentry->get_statements() ) { 390 throw SemanticError( "duplicate function definition for ", added);390 throw SemanticError( added, "duplicate function definition for " ); 391 391 } // if 392 392 } else { … … 398 398 ObjectDecl *oldobj = dynamic_cast< ObjectDecl* >( existing ); 399 399 if ( ! newobj->get_storageClasses().is_extern && ! oldobj->get_storageClasses().is_extern ) { 400 throw SemanticError( "duplicate object definition for ", added);400 throw SemanticError( added, "duplicate object definition for " ); 401 401 } // if 402 402 } // if 403 403 } else { 404 throw SemanticError( "duplicate definition for ", added);404 throw SemanticError( added, "duplicate definition for " ); 405 405 } // if 406 406 … … 431 431 // isomorphic to C type-compatibility, which it may not be. 432 432 if ( hasIncompatibleCDecl( name, mangleName, scope ) ) { 433 throw SemanticError( "conflicting overload of C function ", decl);433 throw SemanticError( decl, "conflicting overload of C function " ); 434 434 } 435 435 } else { 436 436 // Check that a Cforall declaration doesn't overload any C declaration 437 437 if ( hasCompatibleCDecl( name, mangleName, scope ) ) { 438 throw SemanticError( "Cforall declaration hides C function ", decl);438 throw SemanticError( decl, "Cforall declaration hides C function " ); 439 439 } 440 440 } … … 455 455 return true; 456 456 } else { 457 throw SemanticError( "redeclaration of ", added);457 throw SemanticError( added, "redeclaration of " ); 458 458 } 459 459 } … … 482 482 return false; 483 483 } else if ( ! added->get_members().empty() ) { 484 throw SemanticError( "redeclaration of ", added);484 throw SemanticError( added, "redeclaration of " ); 485 485 } // if 486 486 return true; -
src/SymTab/Validate.cc
rd27e340 rd55d7a6 366 366 dwts.erase( j ); 367 367 if ( i != end ) { 368 throw SemanticError( "invalid type void in function type ", func);368 throw SemanticError( func, "invalid type void in function type " ); 369 369 } // if 370 370 } else { … … 374 374 *i = (*i)->acceptMutator( fixer ); 375 375 if ( fixer.pass.isVoid ) { 376 throw SemanticError( "invalid type void in function type ", func);376 throw SemanticError( func, "invalid type void in function type " ); 377 377 } // if 378 378 } // for … … 411 411 for ( Expression * param : inst->parameters ) { 412 412 if ( ! dynamic_cast< TypeExpr * >( param ) ) { 413 throw SemanticError( "Expression parameters for generic types are currently unsupported: ", inst);413 throw SemanticError( inst, "Expression parameters for generic types are currently unsupported: " ); 414 414 } 415 415 } … … 511 511 TraitDecl *traitDecl = local_indexer->lookupTrait( traitInst->name ); 512 512 if ( ! traitDecl ) { 513 throw SemanticError( "use of undeclared trait " + traitInst->name );513 throw SemanticError( traitInst->location, "use of undeclared trait " + traitInst->name ); 514 514 } // if 515 515 if ( traitDecl->get_parameters().size() != traitInst->get_parameters().size() ) { 516 throw SemanticError( "incorrect number of trait parameters: ", traitInst);516 throw SemanticError( traitInst, "incorrect number of trait parameters: " ); 517 517 } // if 518 518 traitInst->baseTrait = traitDecl; … … 522 522 TypeExpr * expr = dynamic_cast< TypeExpr * >( std::get<1>(p) ); 523 523 if ( ! expr ) { 524 throw SemanticError( "Expression parameters for trait instances are currently unsupported: ", std::get<1>(p));524 throw SemanticError( std::get<1>(p), "Expression parameters for trait instances are currently unsupported: " ); 525 525 } 526 526 if ( TypeInstType * inst = dynamic_cast< TypeInstType * >( expr->get_type() ) ) { … … 629 629 assertion = assertion->acceptMutator( fixer ); 630 630 if ( fixer.pass.isVoid ) { 631 throw SemanticError( "invalid type void in assertion of function ", node);631 throw SemanticError( node, "invalid type void in assertion of function " ); 632 632 } // if 633 633 } // for … … 673 673 // were cast to void. 674 674 if ( ! returnStmt->get_expr() && returnVals.size() != 0 ) { 675 throw SemanticError( "Non-void function returns no values: " , returnStmt);675 throw SemanticError( returnStmt, "Non-void function returns no values: " ); 676 676 } 677 677 } … … 714 714 ReferenceToType *rtt = dynamic_cast<ReferenceToType*>(ret); 715 715 if ( ! rtt ) { 716 throw SemanticError( "Cannot apply type parameters to base type of " + typeInst->name);716 throw SemanticError( typeInst->location, "Cannot apply type parameters to base type of " + typeInst->name ); 717 717 } 718 718 rtt->get_parameters().clear(); … … 752 752 Type * t2 = typedefNames[ tyDecl->get_name() ].first->get_base(); 753 753 if ( ! ResolvExpr::typesCompatible( t1, t2, Indexer() ) ) { 754 throw SemanticError( "Cannot redefine typedef: " + tyDecl->name );754 throw SemanticError( tyDecl->location, "Cannot redefine typedef: " + tyDecl->name ); 755 755 } 756 756 // Cannot redefine VLA typedefs. Note: this is slightly incorrect, because our notion of VLAs … … 759 759 // to fix this corner case likely outweighs the utility of allowing it. 760 760 if ( isVariableLength( t1 ) || isVariableLength( t2 ) ) { 761 throw SemanticError( "Cannot redefine typedef: " + tyDecl->name );761 throw SemanticError( tyDecl->location, "Cannot redefine typedef: " + tyDecl->name ); 762 762 } 763 763 } else { … … 908 908 if ( CodeGen::isCtorDtorAssign( funcDecl->get_name() ) ) { // TODO: also check /=, etc. 909 909 if ( params.size() == 0 ) { 910 throw SemanticError( "Constructors, destructors, and assignment functions require at least one parameter ", funcDecl);910 throw SemanticError( funcDecl, "Constructors, destructors, and assignment functions require at least one parameter " ); 911 911 } 912 912 ReferenceType * refType = dynamic_cast< ReferenceType * >( params.front()->get_type() ); 913 913 if ( ! refType ) { 914 throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a reference ", funcDecl);914 throw SemanticError( funcDecl, "First parameter of a constructor, destructor, or assignment function must be a reference " ); 915 915 } 916 916 if ( CodeGen::isCtorDtor( funcDecl->get_name() ) && returnVals.size() != 0 ) { 917 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl);917 throw SemanticError( funcDecl, "Constructors and destructors cannot have explicit return values " ); 918 918 } 919 919 } … … 950 950 951 951 sub.apply( inst ); 952 if ( args.size() < params->size() ) throw SemanticError( "Too few type arguments in generic type ", inst);953 if ( args.size() > params->size() ) throw SemanticError( "Too many type arguments in generic type ", inst);952 if ( args.size() < params->size() ) throw SemanticError( inst, "Too few type arguments in generic type " ); 953 if ( args.size() > params->size() ) throw SemanticError( inst, "Too many type arguments in generic type " ); 954 954 } 955 955 } -
src/SynTree/Expression.cc
rd27e340 rd55d7a6 93 93 return 0; 94 94 } 95 throw SemanticError( "Constant expression of non-integral type ", this);95 throw SemanticError( this, "Constant expression of non-integral type " ); 96 96 } 97 97 -
src/SynTree/Mutator.h
rd27e340 rd55d7a6 148 148 } // if 149 149 } catch( SemanticError &e ) { 150 e.set_location( (*i)->location );151 150 errors.append( e ); 152 151 } // try -
src/SynTree/Statement.cc
rd27e340 rd55d7a6 100 100 //actually this is a syntactic error signaled by the parser 101 101 if ( type == BranchStmt::Goto && target.empty() ) { 102 throw SemanticError( "goto without target");102 throw SemanticError( target.get_statement()->location, "goto without target"); 103 103 } 104 104 } … … 107 107 Statement(), computedTarget( computedTarget ), type( type ) { 108 108 if ( type != BranchStmt::Goto || computedTarget == nullptr ) { 109 throw SemanticError( "Computed target not valid in branch statement");109 throw SemanticError( computedTarget->location, "Computed target not valid in branch statement"); 110 110 } 111 111 } … … 203 203 CaseStmt::CaseStmt( Expression *condition, const std::list<Statement *> &statements, bool deflt ) throw ( SemanticError ) : 204 204 Statement(), condition( condition ), stmts( statements ), _isDefault( deflt ) { 205 if ( isDefault() && condition != 0 ) throw SemanticError( "default case with condition: ", condition);205 if ( isDefault() && condition != 0 ) throw SemanticError( condition, "default case with condition: " ); 206 206 } 207 207 -
src/SynTree/TypeSubstitution.h
rd27e340 rd55d7a6 98 98 } // if 99 99 } else { 100 throw SemanticError( toString( "Attempt to provide non-type parameter: ", toString( *actualIt ).c_str(), " for type parameter " ), formal);100 throw SemanticError( formal, toString( "Attempt to provide non-type parameter: ", toString( *actualIt ).c_str(), " for type parameter " ) ); 101 101 } // if 102 102 } else { -
src/SynTree/Visitor.h
rd27e340 rd55d7a6 142 142 } 143 143 } catch( SemanticError &e ) { 144 e.set_location( (*i)->location );145 144 errors.append( e ); 146 145 } -
src/main.cc
rd27e340 rd55d7a6 361 361 cerr << endl << "---End of AST, begin error message:---\n" << endl; 362 362 } // if 363 e.print( cerr);363 e.print(); 364 364 if ( output != &cout ) { 365 365 delete output;
Note: See TracChangeset
for help on using the changeset viewer.