Changes in / [75e3cb2:ac7d921]
- Location:
- src
- Files:
-
- 32 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/FixMain.cc
r75e3cb2 rac7d921 39 39 { 40 40 if(main_signature) { 41 throw SemanticError( functionDecl, "Multiple definition of main routine\n");41 throw SemanticError("Multiple definition of main routine\n", functionDecl); 42 42 } 43 43 main_signature.reset( functionDecl->clone() ); -
src/CodeGen/FixNames.cc
r75e3cb2 rac7d921 118 118 int nargs = functionDecl->get_functionType()->get_parameters().size(); 119 119 if( !(nargs == 0 || nargs == 2 || nargs == 3) ) { 120 throw SemanticError( functionDecl, "Main expected to have 0, 2 or 3 arguments\n");120 throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl); 121 121 } 122 122 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( new ConstantExpr( Constant::from_int( 0 ) ) ) ); -
src/Common/PassVisitor.impl.h
r75e3cb2 rac7d921 77 77 maybeAccept_impl( *i, visitor ); 78 78 } catch( SemanticError &e ) { 79 e.set_location( (*i)->location ); 79 80 errors.append( e ); 80 81 } … … 103 104 maybeMutate_impl( *i, mutator ); 104 105 } catch( SemanticError &e ) { 106 e.set_location( (*i)->location ); 105 107 errors.append( e ); 106 108 } … … 132 134 } 133 135 } catch( SemanticError &e ) { 136 e.set_location( (*i)->location ); 134 137 errors.append( e ); 135 138 } … … 160 163 } // if 161 164 } catch( SemanticError &e ) { 165 e.set_location( (*i)->location ); 162 166 errors.append( e ); 163 167 } // try … … 196 200 197 201 } catch ( SemanticError &e ) { 202 e.set_location( (*i)->location ); 198 203 errors.append( e ); 199 204 } -
src/Common/SemanticError.cc
r75e3cb2 rac7d921 23 23 #include "SemanticError.h" 24 24 25 SemanticError::SemanticError( CodeLocation location, std::string error ) { 26 append( location, error ); 25 SemanticError::SemanticError() { 26 } 27 28 SemanticError::SemanticError( std::string error ) { 29 append( error ); 27 30 } 28 31 … … 31 34 } 32 35 33 void SemanticError::append( CodeLocation location,const std::string & msg ) {34 errors.emplace_back( location,msg );36 void SemanticError::append( const std::string & msg ) { 37 errors.emplace_back( error_str() + msg ); 35 38 } 36 39 … … 39 42 } 40 43 41 void SemanticError::print( ) {44 void SemanticError::print( std::ostream &os ) { 42 45 using std::to_string; 43 46 for( auto err : errors ) { 44 std::cerr << bold() << err.location << error_str() << reset_font()<< err.description << std::endl;47 os << err.location << err.description << std::endl; 45 48 } 46 49 } 47 50 48 SemanticWarning::SemanticWarning( CodeLocation location, std::string msg) {49 std::cerr << bold() << location << warning_str() << reset_font() << msg << std::endl;51 void SemanticError::set_location( const CodeLocation& location ) { 52 errors.begin()->maybeSet( location ); 50 53 } 51 54 -
src/Common/SemanticError.h
r75e3cb2 rac7d921 24 24 #include "CodeLocation.h" // for CodeLocation, toString 25 25 26 //-----------------------------------------------------------------------------27 // Errors28 26 struct error { 27 std::string description; 29 28 CodeLocation location; 30 std::string description;31 29 32 30 error() = default; 33 error( CodeLocation loc, const std::string & str ) : location( loc ), description( str ) {} 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 } 34 38 }; 35 39 36 40 class SemanticError : public std::exception { 37 41 public: 38 SemanticError() = default; 39 SemanticError( CodeLocation location, std::string error ); 42 SemanticError(); 43 SemanticError( std::string error ); 44 template< typename T > SemanticError( const std::string & error, const T * obj ); 40 45 ~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);45 46 46 47 static inline const std::string & error_str() { … … 50 51 51 52 void append( SemanticError & other ); 52 void append( CodeLocation location,const std::string & );53 void append( const std::string & ); 53 54 bool isEmpty() const; 54 void print(); 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) 55 60 private: 56 61 std::list< error > errors; … … 58 63 59 64 template< typename T > 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; 65 SemanticError::SemanticError( const std::string & error, const T * obj ) { 66 append( toString( error, obj ) ); 124 67 } 125 68 -
src/Concurrency/Keywords.cc
r75e3cb2 rac7d921 276 276 handle( decl ); 277 277 } 278 278 279 } 279 280 … … 281 282 if( ! decl->body ) return; 282 283 283 if( !type_decl ) throw SemanticError( decl, context_error);284 if( !type_decl ) throw SemanticError( context_error, decl ); 284 285 285 286 FunctionDecl * func = forwardDeclare( decl ); … … 418 419 if( mutexArgs.empty() ) return; 419 420 420 if( CodeGen::isConstructor(decl->name) ) throw SemanticError( decl, "constructors cannot have mutex parameters");421 if( CodeGen::isConstructor(decl->name) ) throw SemanticError( "constructors cannot have mutex parameters", decl ); 421 422 422 423 bool isDtor = CodeGen::isDestructor( decl->name ); 423 424 424 if( isDtor && mutexArgs.size() != 1 ) throw SemanticError( decl, "destructors can only have 1 mutex argument");425 if( isDtor && mutexArgs.size() != 1 ) throw SemanticError( "destructors can only have 1 mutex argument", decl ); 425 426 426 427 for(auto arg : mutexArgs) { … … 431 432 if( ! body ) return; 432 433 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>");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 ); 436 437 437 438 if( isDtor ) { … … 479 480 //Makes sure it's not a copy 480 481 ReferenceType* rty = dynamic_cast< ReferenceType * >( ty ); 481 if( ! rty ) throw SemanticError( arg, "Mutex argument must be of reference type ");482 if( ! rty ) throw SemanticError( "Mutex argument must be of reference type ", arg ); 482 483 483 484 //Make sure the we are pointing directly to a type 484 485 Type* base = rty->get_base(); 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 ");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 ); 487 488 488 489 //Make sure that typed isn't mutex 489 if( base->get_mutex() ) throw SemanticError( arg, "mutex keyword may only appear once per argument ");490 if( base->get_mutex() ) throw SemanticError( "mutex keyword may only appear once per argument ", arg ); 490 491 } 491 492 … … 625 626 if( type && type->get_baseStruct()->is_thread() ) { 626 627 if( !thread_decl || !thread_ctor_seen ) { 627 throw SemanticError( type->get_baseStruct()->location,"thread keyword requires threads to be in scope, add #include <thread>");628 throw SemanticError("thread keyword requires threads to be in scope, add #include <thread>"); 628 629 } 629 630 -
src/Concurrency/Waitfor.cc
r75e3cb2 rac7d921 249 249 250 250 Statement * GenerateWaitForPass::postmutate( WaitForStmt * waitfor ) { 251 if( !decl_monitor || !decl_acceptable || !decl_mask ) 252 throw SemanticError( waitfor, "waitfor keyword requires monitors to be in scope, add #include <monitor>" ); 251 if( !decl_monitor || !decl_acceptable || !decl_mask ) throw SemanticError( "waitfor keyword requires monitors to be in scope, add #include <monitor>", waitfor ); 253 252 254 253 CompoundStmt * stmt = new CompoundStmt(); -
src/ControlStruct/ExceptTranslate.cc
r75e3cb2 rac7d921 572 572 // Pass. 573 573 } else if ( CatchStmt::Terminate == catchStmt->get_kind() ) { 574 throw SemanticError( catchStmt->location,"catch must have exception type");574 throw SemanticError("catch must have exception type"); 575 575 } else { 576 throw SemanticError( catchStmt->location,"catchResume must have exception type");576 throw SemanticError("catchResume must have exception type"); 577 577 } 578 578 -
src/ControlStruct/LabelFixer.cc
r75e3cb2 rac7d921 92 92 } else if ( labelTable[ l ]->defined() ) { 93 93 // defined twice, error 94 throw SemanticError( l.get_statement()->location,"Duplicate definition of label: " + l.get_name() );94 throw SemanticError( "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( i->first.get_statement()->location,"Use of undefined label: " + i->first.get_name() );123 throw SemanticError( "Use of undefined label: " + i->first.get_name() ); 124 124 } 125 125 (*ret)[ i->first ] = i->second->get_definition(); -
src/ControlStruct/MLEMutator.cc
r75e3cb2 rac7d921 115 115 } else { 116 116 // break target is outmost control structure 117 if ( enclosingControlStructures.empty() ) throw SemanticError( branchStmt->location,"'break' outside a loop, switch, or labelled block" );117 if ( enclosingControlStructures.empty() ) throw SemanticError( "'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( branchStmt->location,toString( (isContinue ? "'continue'" : "'break'"), " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "), originalTarget ) );126 throw SemanticError( toString( (isContinue ? "'continue'" : "'break'"), " target must be an enclosing ", (isContinue ? "loop: " : "control structure: "), originalTarget ) ); 127 127 } // if 128 128 break; -
src/GenPoly/Box.cc
r75e3cb2 rac7d921 229 229 } // if 230 230 } catch( SemanticError &e ) { 231 e.set_location( (*i)->location ); 231 232 errors.append( e ); 232 233 } // try … … 575 576 } 576 577 } else { 577 throw SemanticError( argBaseType, "Cannot pass non-struct type for generic struct: ");578 throw SemanticError( "Cannot pass non-struct type for generic struct: ", argBaseType ); 578 579 } 579 580 } … … 597 598 } else { 598 599 // xxx - should this be an assertion? 599 throw SemanticError( appExpr, toString( *env, "\nunbound type variable: ", tyParm->first, " in application " ));600 throw SemanticError( toString( *env, "\nunbound type variable: ", tyParm->first, " in application " ), appExpr ); 600 601 } // if 601 602 } // if -
src/InitTweak/FixInit.cc
r75e3cb2 rac7d921 282 282 translationUnit.splice( i, fixer.pass.staticDtorDecls ); 283 283 } catch( SemanticError &e ) { 284 e.set_location( (*i)->location ); 284 285 errors.append( e ); 285 286 } // try … … 894 895 ) 895 896 if ( ! diff.empty() ) { 896 throw SemanticError( st mt, std::string("jump to label '") + stmt->get_target().get_name() + "' crosses initialization of " + (*diff.begin())->get_name() + " ");897 throw SemanticError( std::string("jump to label '") + stmt->get_target().get_name() + "' crosses initialization of " + (*diff.begin())->get_name() + " ", stmt ); 897 898 } // if 898 899 // S_G-S_L results in set of objects that must be destructed … … 1110 1111 template< typename Visitor, typename... Params > 1111 1112 void error( Visitor & v, CodeLocation loc, const Params &... params ) { 1112 SemanticError err( loc, toString( params... ) ); 1113 SemanticError err( toString( params... ) ); 1114 err.set_location( loc ); 1113 1115 v.errors.append( err ); 1114 1116 } -
src/InitTweak/GenInit.cc
r75e3cb2 rac7d921 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( objDecl, "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n");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 ); 320 320 // constructed objects should not have initializers nested too deeply 321 if ( ! checkInitDepth( objDecl ) ) throw SemanticError( objDecl, "Managed object's initializer is too deep ");321 if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl ); 322 322 323 323 objDecl->set_init( genCtorInit( objDecl ) ); -
src/InitTweak/InitTweak.cc
r75e3cb2 rac7d921 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( init->location,"unbalanced list initializers" );227 throw SemanticError( "unbalanced list initializers" ); 228 228 } 229 229 -
src/Parser/DeclarationNode.cc
r75e3cb2 rac7d921 581 581 dst->basictype = src->basictype; 582 582 } else if ( src->basictype != DeclarationNode::NoBasicType ) 583 throw SemanticError( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: ");583 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::basicTypeNames[ src->basictype ] + " in type: ", src ); 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( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: ");588 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::complexTypeNames[ src->complextype ] + " in type: ", src ); 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( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: ");593 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::signednessNames[ src->signedness ] + " in type: ", src ); 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( yylloc, src, string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: ");600 throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::lengthNames[ src->length ] + " in type: ", src ); 601 601 } // if 602 602 break; … … 966 966 } // if 967 967 } catch( SemanticError &e ) { 968 e.set_location( cur->location ); 968 969 errors.append( e ); 969 970 } // try … … 1000 1001 } // if 1001 1002 } catch( SemanticError &e ) { 1003 e.set_location( cur->location ); 1002 1004 errors.append( e ); 1003 1005 } // try … … 1018 1020 * out++ = cur->buildType(); 1019 1021 } catch( SemanticError &e ) { 1022 e.set_location( cur->location ); 1020 1023 errors.append( e ); 1021 1024 } // try … … 1029 1032 1030 1033 Declaration * DeclarationNode::build() const { 1031 if ( ! error.empty() ) throw SemanticError( this, error + " in declaration of ");1034 if ( ! error.empty() ) throw SemanticError( error + " in declaration of ", this ); 1032 1035 1033 1036 if ( asmStmt ) { … … 1052 1055 // inline _Noreturn int i; // disallowed 1053 1056 if ( type->kind != TypeData::Function && funcSpecs.any() ) { 1054 throw SemanticError( this, "invalid function specifier for ");1057 throw SemanticError( "invalid function specifier for ", this ); 1055 1058 } // if 1056 1059 return buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, maybeBuild< Initializer >(initializer), attributes )->set_extension( extension ); … … 1062 1065 // inlne _Noreturn enum E { ... }; // disallowed 1063 1066 if ( funcSpecs.any() ) { 1064 throw SemanticError( this, "invalid function specifier for ");1067 throw SemanticError( "invalid function specifier for ", this ); 1065 1068 } // if 1066 1069 assertf( name, "ObjectDecl must a have name\n" ); -
src/Parser/ExpressionNode.cc
r75e3cb2 rac7d921 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( yylloc,"invalid tuple index " + str );358 if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( "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( yylloc,"invalid tuple index " + str );365 if ( str[str.size()-1] != '.' ) throw SemanticError( "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
r75e3cb2 rac7d921 24 24 namespace LinkageSpec { 25 25 26 Spec linkageCheck( CodeLocation location,const string * spec ) {26 Spec linkageCheck( 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( location,"Invalid linkage specifier " + *spec );36 throw SemanticError( "Invalid linkage specifier " + *spec ); 37 37 } // if 38 38 } 39 39 40 Spec linkageUpdate( CodeLocation location,Spec old_spec, const string * cmd ) {40 Spec linkageUpdate( 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( location,"Invalid linkage specifier " + *cmd );50 throw SemanticError( "Invalid linkage specifier " + *cmd ); 51 51 } // if 52 52 } -
src/Parser/LinkageSpec.h
r75e3cb2 rac7d921 17 17 18 18 #include <string> 19 20 #include "Common/CodeLocation.h"21 19 22 20 namespace LinkageSpec { … … 47 45 48 46 49 Spec linkageCheck( CodeLocation location,const std::string * );47 Spec linkageCheck( const std::string * ); 50 48 // Returns the Spec with the given name (limited to C, Cforall & BuiltinC) 51 Spec linkageUpdate( CodeLocation location,Spec old_spec, const std::string * cmd );49 Spec linkageUpdate( Spec old_spec, const std::string * cmd ); 52 50 /* If cmd = "C" returns a Spec that is old_spec with is_mangled = false 53 51 * If cmd = "Cforall" returns old_spec Spec with is_mangled = true -
src/Parser/ParseNode.h
r75e3cb2 rac7d921 434 434 } // if 435 435 } catch( SemanticError &e ) { 436 e.set_location( cur->location ); 436 437 errors.append( e ); 437 438 } // try -
src/Parser/TypeData.cc
r75e3cb2 rac7d921 521 521 522 522 static string genTSError( string msg, DeclarationNode::BasicType basictype ) { 523 throw SemanticError( yylloc,string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." );523 throw SemanticError( 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( param->location,string( "duplicate declaration name " ) + *param->name );925 if ( param->type ) throw SemanticError( 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( param->location,string( "duplicate parameter name " ) + *param->name );928 if ( ! decl->type ) throw SemanticError( 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( decl->location,string( "missing name in parameter list " ) + *decl->name );935 if ( decl->type ) throw SemanticError( string( "missing name in parameter list " ) + *decl->name ); 936 936 } // for 937 937 -
src/Parser/parser.yy
r75e3cb2 rac7d921 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( yylloc,"Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME484 { throw SemanticError("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( yylloc,"Qualified names are currently unimplemented."); $$ = nullptr; } // FIX ME486 { throw SemanticError("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( yylloc,"Mutex statement is currently unimplemented."); $$ = nullptr; } // FIX ME1074 { throw SemanticError("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( yylloc,"Static assert is currently unimplemented."); $$ = nullptr; } // FIX ME1295 { throw SemanticError("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( yylloc,linkage, $2 );2383 linkage = LinkageSpec::linkageUpdate( linkage, $2 ); 2384 2384 } 2385 2385 '{' external_definition_list_opt '}' -
src/ResolvExpr/AlternativeFinder.cc
r75e3cb2 rac7d921 252 252 std::cerr << "No reasonable alternatives for expression " << expr << std::endl; 253 253 ) 254 throw SemanticError( expr, "No reasonable alternatives for expression ");254 throw SemanticError( "No reasonable alternatives for expression ", expr ); 255 255 } 256 256 if ( prune ) { … … 270 270 stream << "Alternatives are:\n"; 271 271 printAlts( winners, stream, 1 ); 272 throw SemanticError( expr->location,stream.str() );272 throw SemanticError( stream.str() ); 273 273 } 274 274 alternatives = move(pruned); … … 507 507 return; 508 508 } else if ( level >= recursionLimit ) { 509 throw SemanticError( newAlt.expr->location,"Too many recursive assertions" );509 throw SemanticError( "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( sizeofExpr->get_expr(), "Ambiguous expression in sizeof operand: ");1423 throw SemanticError( "Ambiguous expression in sizeof operand: ", sizeofExpr->get_expr() ); 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( alignofExpr->get_expr(), "Ambiguous expression in alignof operand: ");1444 throw SemanticError( "Ambiguous expression in alignof operand: ", alignofExpr->get_expr() ); 1445 1445 } // if 1446 1446 // return the lowest cost alternative for the argument -
src/ResolvExpr/CurrentObject.cc
r75e3cb2 rac7d921 141 141 base = at->get_base(); 142 142 memberIter = createMemberIterator( base ); 143 if ( at->isVarLen ) throw SemanticError( at, "VLA initialization does not support @=");143 if ( at->isVarLen ) throw SemanticError( "VLA initialization does not support @=", at ); 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( expr, "Constant expression of non-integral type in array dimension: ");158 throw SemanticError( "Constant expression of non-integral type in array dimension: ", expr ); 159 159 } 160 160 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { … … 179 179 index = constExpr->intValue(); 180 180 } catch( SemanticError & ) { 181 throw SemanticError( expr, "Constant expression of non-integral type in array designator: ");181 throw SemanticError( "Constant expression of non-integral type in array designator: ", expr ); 182 182 } 183 183 } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { … … 532 532 } // for 533 533 if ( desigAlts.size() > 1 ) { 534 throw SemanticError( designation, toString("Too many alternatives (", desigAlts.size(), ") for designation: "));534 throw SemanticError( toString("Too many alternatives (", desigAlts.size(), ") for designation: "), designation ); 535 535 } else if ( desigAlts.size() == 0 ) { 536 throw SemanticError( designation, "No reasonable alternatives for designation: ");536 throw SemanticError( "No reasonable alternatives for designation: ", designation ); 537 537 } 538 538 DesignatorChain & d = desigAlts.back(); -
src/ResolvExpr/Resolver.cc
r75e3cb2 rac7d921 188 188 findMinCost( candidates.begin(), candidates.end(), back_inserter( winners ) ); 189 189 if ( winners.size() == 0 ) { 190 throw SemanticError( untyped, "No reasonable alternatives for " + kindStr + " expression: ");190 throw SemanticError( "No reasonable alternatives for " + kindStr + " expression: ", untyped ); 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( untyped->location,stream.str() );197 throw SemanticError( 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 tmt->location, ss.str() );431 throw SemanticError( 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( func.expr->get_result(), "candidate not viable: not a pointer type\n");453 throw SemanticError( "candidate not viable: not a pointer type\n", func.expr->get_result() ); 454 454 } 455 455 456 456 FunctionType * function = dynamic_cast< FunctionType* >( pointer->get_base() ); 457 457 if( !function ) { 458 throw SemanticError( pointer->get_base(), "candidate not viable: not a function type\n");458 throw SemanticError( "candidate not viable: not a function type\n", pointer->get_base() ); 459 459 } 460 460 … … 465 465 466 466 if( !advance_to_mutex( param, param_end ) ) { 467 throw SemanticError( function, "candidate function not viable: no mutex parameters\n");467 throw SemanticError("candidate function not viable: no mutex parameters\n", function); 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( function, "candidate function not viable: too many mutex arguments\n");506 throw SemanticError("candidate function not viable: too many mutex arguments\n", function); 507 507 } 508 508 … … 516 516 (*param)->get_type()->print( ss ); 517 517 ss << "'\n"; 518 throw SemanticError( function, ss.str());518 throw SemanticError(ss.str(), function); 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( function, "candidate function not viable: too few mutex arguments\n");530 throw SemanticError("candidate function not viable: too few mutex arguments\n", function); 531 531 } 532 532 … … 555 555 556 556 // Make sure we got the right number of arguments 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; }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; } 561 561 562 562 -
src/SymTab/Indexer.cc
r75e3cb2 rac7d921 388 388 if ( newentry && oldentry ) { 389 389 if ( newentry->get_statements() && oldentry->get_statements() ) { 390 throw SemanticError( added, "duplicate function definition for ");390 throw SemanticError( "duplicate function definition for ", added ); 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( added, "duplicate object definition for ");400 throw SemanticError( "duplicate object definition for ", added ); 401 401 } // if 402 402 } // if 403 403 } else { 404 throw SemanticError( added, "duplicate definition for ");404 throw SemanticError( "duplicate definition for ", added ); 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( decl, "conflicting overload of C function ");433 throw SemanticError( "conflicting overload of C function ", decl ); 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( decl, "Cforall declaration hides C function ");438 throw SemanticError( "Cforall declaration hides C function ", decl ); 439 439 } 440 440 } … … 455 455 return true; 456 456 } else { 457 throw SemanticError( added, "redeclaration of ");457 throw SemanticError( "redeclaration of ", added ); 458 458 } 459 459 } … … 482 482 return false; 483 483 } else if ( ! added->get_members().empty() ) { 484 throw SemanticError( added, "redeclaration of ");484 throw SemanticError( "redeclaration of ", added ); 485 485 } // if 486 486 return true; -
src/SymTab/Validate.cc
r75e3cb2 rac7d921 366 366 dwts.erase( j ); 367 367 if ( i != end ) { 368 throw SemanticError( func, "invalid type void in function type ");368 throw SemanticError( "invalid type void in function type ", func ); 369 369 } // if 370 370 } else { … … 374 374 *i = (*i)->acceptMutator( fixer ); 375 375 if ( fixer.pass.isVoid ) { 376 throw SemanticError( func, "invalid type void in function type ");376 throw SemanticError( "invalid type void in function type ", func ); 377 377 } // if 378 378 } // for … … 411 411 for ( Expression * param : inst->parameters ) { 412 412 if ( ! dynamic_cast< TypeExpr * >( param ) ) { 413 throw SemanticError( inst, "Expression parameters for generic types are currently unsupported: ");413 throw SemanticError( "Expression parameters for generic types are currently unsupported: ", inst ); 414 414 } 415 415 } … … 511 511 TraitDecl *traitDecl = local_indexer->lookupTrait( traitInst->name ); 512 512 if ( ! traitDecl ) { 513 throw SemanticError( traitInst->location,"use of undeclared trait " + traitInst->name );513 throw SemanticError( "use of undeclared trait " + traitInst->name ); 514 514 } // if 515 515 if ( traitDecl->get_parameters().size() != traitInst->get_parameters().size() ) { 516 throw SemanticError( traitInst, "incorrect number of trait parameters: ");516 throw SemanticError( "incorrect number of trait parameters: ", traitInst ); 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( std::get<1>(p), "Expression parameters for trait instances are currently unsupported: ");524 throw SemanticError( "Expression parameters for trait instances are currently unsupported: ", std::get<1>(p) ); 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( node, "invalid type void in assertion of function ");631 throw SemanticError( "invalid type void in assertion of function ", node ); 632 632 } // if 633 633 } // for … … 673 673 // were cast to void. 674 674 if ( ! returnStmt->get_expr() && returnVals.size() != 0 ) { 675 throw SemanticError( returnStmt, "Non-void function returns no values: ");675 throw SemanticError( "Non-void function returns no values: " , returnStmt ); 676 676 } 677 677 } … … 714 714 ReferenceToType *rtt = dynamic_cast<ReferenceToType*>(ret); 715 715 if ( ! rtt ) { 716 throw SemanticError( typeInst->location, "Cannot apply type parameters to base type of " + typeInst->name);716 throw SemanticError("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( tyDecl->location,"Cannot redefine typedef: " + tyDecl->name );754 throw SemanticError( "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( tyDecl->location,"Cannot redefine typedef: " + tyDecl->name );761 throw SemanticError( "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( funcDecl, "Constructors, destructors, and assignment functions require at least one parameter ");910 throw SemanticError( "Constructors, destructors, and assignment functions require at least one parameter ", funcDecl ); 911 911 } 912 912 ReferenceType * refType = dynamic_cast< ReferenceType * >( params.front()->get_type() ); 913 913 if ( ! refType ) { 914 throw SemanticError( funcDecl, "First parameter of a constructor, destructor, or assignment function must be a reference ");914 throw SemanticError( "First parameter of a constructor, destructor, or assignment function must be a reference ", funcDecl ); 915 915 } 916 916 if ( CodeGen::isCtorDtor( funcDecl->get_name() ) && returnVals.size() != 0 ) { 917 throw SemanticError( funcDecl, "Constructors and destructors cannot have explicit return values ");917 throw SemanticError( "Constructors and destructors cannot have explicit return values ", funcDecl ); 918 918 } 919 919 } … … 950 950 951 951 sub.apply( 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 ");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 ); 954 954 } 955 955 } -
src/SynTree/Expression.cc
r75e3cb2 rac7d921 93 93 return 0; 94 94 } 95 throw SemanticError( this, "Constant expression of non-integral type ");95 throw SemanticError( "Constant expression of non-integral type ", this ); 96 96 } 97 97 -
src/SynTree/Mutator.h
r75e3cb2 rac7d921 148 148 } // if 149 149 } catch( SemanticError &e ) { 150 e.set_location( (*i)->location ); 150 151 errors.append( e ); 151 152 } // try -
src/SynTree/Statement.cc
r75e3cb2 rac7d921 100 100 //actually this is a syntactic error signaled by the parser 101 101 if ( type == BranchStmt::Goto && target.empty() ) { 102 throw SemanticError( target.get_statement()->location,"goto without target");102 throw SemanticError("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( computedTarget->location,"Computed target not valid in branch statement");109 throw SemanticError("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( condition, "default case with condition: ");205 if ( isDefault() && condition != 0 ) throw SemanticError("default case with condition: ", condition); 206 206 } 207 207 -
src/SynTree/TypeSubstitution.h
r75e3cb2 rac7d921 98 98 } // if 99 99 } else { 100 throw SemanticError( formal, toString( "Attempt to provide non-type parameter: ", toString( *actualIt ).c_str(), " for type parameter " ));100 throw SemanticError( toString( "Attempt to provide non-type parameter: ", toString( *actualIt ).c_str(), " for type parameter " ), formal ); 101 101 } // if 102 102 } else { -
src/SynTree/Visitor.h
r75e3cb2 rac7d921 142 142 } 143 143 } catch( SemanticError &e ) { 144 e.set_location( (*i)->location ); 144 145 errors.append( e ); 145 146 } -
src/main.cc
r75e3cb2 rac7d921 361 361 cerr << endl << "---End of AST, begin error message:---\n" << endl; 362 362 } // if 363 e.print( );363 e.print( cerr ); 364 364 if ( output != &cout ) { 365 365 delete output;
Note:
See TracChangeset
for help on using the changeset viewer.