Changes in / [b83c575:96b0e49]
- Location:
- src
- Files:
-
- 17 edited
-
AST/Decl.cpp (modified) (2 diffs)
-
AST/Expr.cpp (modified) (3 diffs)
-
AST/LinkageSpec.cpp (modified) (2 diffs)
-
AST/TypeSubstitution.hpp (modified) (2 diffs)
-
Common/SemanticError.cc (modified) (3 diffs)
-
Common/SemanticError.h (modified) (5 diffs)
-
ControlStruct/FixLabels.cpp (modified) (2 diffs)
-
ControlStruct/MultiLevelExit.cpp (modified) (2 diffs)
-
Parser/ParseNode.h (modified) (3 diffs)
-
Parser/TypeData.cc (modified) (3 diffs)
-
Parser/parser.yy (modified) (7 diffs)
-
ResolvExpr/CurrentObject.cc (modified) (2 diffs)
-
ResolvExpr/Resolver.cc (modified) (2 diffs)
-
Validate/FixQualifiedTypes.cpp (modified) (5 diffs)
-
Validate/ForallPointerDecay.cpp (modified) (2 diffs)
-
Validate/ReplaceTypedef.cpp (modified) (3 diffs)
-
Virtual/ExpandCasts.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Decl.cpp
rb83c575 r96b0e49 9 9 // Author : Aaron B. Moss 10 10 // Created On : Thu May 9 10:00:00 2019 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Dec 9 16:28:51 202313 // Update Count : 3111 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu May 5 12:10:00 2022 13 // Update Count : 24 14 14 // 15 15 … … 113 113 // --- EnumDecl 114 114 115 bool EnumDecl::valueOf( const Decl * enumerator, long long & value ) const {115 bool EnumDecl::valueOf( const Decl * enumerator, long long& value ) const { 116 116 if ( enumValues.empty() ) { 117 117 Evaluation crntVal = {0, true, true}; // until expression is given, we know to start counting from 0 118 118 for ( const Decl * member : members ) { 119 const ObjectDecl * field = strict_dynamic_cast< const ObjectDecl* >( member );119 const ObjectDecl* field = strict_dynamic_cast< const ObjectDecl* >( member ); 120 120 if ( field->init ) { 121 const SingleInit * init = strict_dynamic_cast< const SingleInit * >( field->init.get() );121 const SingleInit * init = strict_dynamic_cast< const SingleInit* >( field->init.get() ); 122 122 crntVal = eval( init->value ); 123 123 if ( ! crntVal.isEvaluableInGCC ) { 124 SemanticError( init->location, "Non-constexpr in initialization of enumerator %s", field->name.c_str() ); 124 SemanticError( init->location, ::toString( "Non-constexpr in initialization of " 125 "enumerator: ", field ) ); 125 126 } 126 127 } 127 128 if ( enumValues.count( field->name ) != 0 ) { 128 SemanticError( location, "Enum %s has multiple members with %s", name.c_str(), field->name.c_str() );129 SemanticError( location, ::toString( "Enum ", name, " has multiple members with the " "name ", field->name ) ); 129 130 } 130 131 if (crntVal.hasKnownValue) { -
src/AST/Expr.cpp
rb83c575 r96b0e49 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed May 15 17:00:00 2019 11 // Last Modified By : Peter A. Buhr11 // Last Modified By : Andrew Beach 12 12 // Created On : Wed May 18 13:56:00 2022 13 // Update Count : 1213 // Update Count : 8 14 14 // 15 15 … … 168 168 return addrType( refType->base ); 169 169 } else { 170 SemanticError( loc, "Attempt to take address of non-lvalue expression %s",171 toString( arg->result.get() ).c_str());170 SemanticError( loc, arg->result.get(), 171 "Attempt to take address of non-lvalue expression: " ); 172 172 } 173 173 } … … 240 240 return 1; 241 241 } 242 SemanticError( this->location, "Constant expression of non-integral type %s", 243 toString( this ).c_str() ); 242 SemanticError( this, "Constant expression of non-integral type " ); 244 243 } 245 244 -
src/AST/LinkageSpec.cpp
rb83c575 r96b0e49 9 9 // Author : Aaron B. Moss 10 10 // Created On : Thu May 9 10:00:00 2019 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Dec 11 16:08:58 202313 // Update Count : 211 // Last Modified By : Aaron B. Moss 12 // Last Modified On : Thu May 9 10:00:00 2019 13 // Update Count : 1 14 14 // 15 15 … … 37 37 return spec; 38 38 } else { 39 SemanticError( loc, "Invalid linkage specifier %s", cmd->c_str());39 SemanticError( loc, "Invalid linkage specifier " + *cmd ); 40 40 } 41 41 } -
src/AST/TypeSubstitution.hpp
rb83c575 r96b0e49 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Dec 11 16:07:30 202313 // Update Count : 1 511 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr May 25 12:31:00 2023 13 // Update Count : 10 14 14 // 15 15 … … 156 156 } // if 157 157 } else { 158 SemanticError( formal->location, "Attempt to provide non-type parameter %s for type parameter %s", 159 toString( *actualIt ).c_str(), formal->name.c_str() ); 158 SemanticError( formal, toString( "Attempt to provide non-type parameter: ", toString( *actualIt ).c_str(), " for type parameter " ) ); 160 159 } // if 161 160 } else { -
src/Common/SemanticError.cc
rb83c575 r96b0e49 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Dec 11 15:59:09 202313 // Update Count : 1 412 // Last Modified On : Thu Jun 7 08:05:26 2018 13 // Update Count : 10 14 14 // 15 15 … … 70 70 //----------------------------------------------------------------------------- 71 71 // Semantic Error 72 73 72 bool SemanticErrorThrow = false; 74 73 … … 102 101 std::cerr << ErrorHelpers::bold() << err.location << ErrorHelpers::error_str() << ErrorHelpers::reset_font() << err.description << std::endl; 103 102 } 104 }105 106 void SemanticError( CodeLocation location, const char * fmt, ... ) {107 char msg[2048]; // worst-case error-message buffer108 va_list args;109 va_start( args, fmt );110 vsnprintf( msg, sizeof(msg), fmt, args ); // always null terminated, but may be truncated111 va_end( args );112 113 SemanticErrorThrow = true;114 throw SemanticErrorException( location, msg ); // convert msg to string115 103 } 116 104 -
src/Common/SemanticError.h
rb83c575 r96b0e49 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Dec 11 21:54:22202313 // Update Count : 5412 // Last Modified On : Sat Feb 25 12:01:31 2023 13 // Update Count : 37 14 14 // 15 15 … … 18 18 #include "ErrorObjects.h" 19 19 #include "AST/Node.hpp" 20 #include "AST/ParseNode.hpp"21 20 #include <cstring> 22 21 … … 26 25 extern bool SemanticErrorThrow; 27 26 28 __attribute__((noreturn, format(printf, 2, 3))) void SemanticError( CodeLocation location, const char fmt[], ... );29 30 27 __attribute__((noreturn)) void SemanticError( CodeLocation location, std::string error ); 31 28 32 __attribute__((noreturn)) static inline void SemanticError( const ast::ParseNode * obj, const std::string & error ) { 29 template< typename T > 30 __attribute__((noreturn)) static inline void SemanticError( const T * obj, const std::string & error ) { 33 31 SemanticError( obj->location, toString( error, obj ) ); 34 32 } 35 33 36 __attribute__((noreturn)) static inline void SemanticError( CodeLocation location, const ast::Node * obj, const std::string & error ) { 34 template< typename T > 35 __attribute__((noreturn)) static inline void SemanticError( CodeLocation location, const T * obj, const std::string & error ) { 37 36 SemanticError( location, toString( error, obj ) ); 38 37 } … … 55 54 56 55 constexpr WarningData WarningFormats[] = { 57 {"self-assign" , Severity::Warn , "self assignment of expression: %s" },58 {"reference-conversion" , Severity::Warn , "rvalue to reference conversion of rvalue: %s" },59 {"qualifiers-zero_t-one_t" , Severity::Warn , "questionable use of type qualifier(s) with %s" },60 {"aggregate-forward-decl" , Severity::Warn , "forward declaration of nested aggregate: %s" },61 {"superfluous-decl" , Severity::Warn , "declaration does not allocate storage: %s" },62 {"superfluous-else" , Severity::Warn , "else clause never executed for empty loop conditional" },63 {"gcc-attributes" , Severity::Warn , "invalid attribute: %s" },64 {"c++-like-copy" , Severity::Warn , "Constructor from reference is not a valid copy constructor" },65 {"depreciated-trait-syntax" , Severity::Warn , "trait type-parameters are now specified using the forall clause" },56 {"self-assign" , Severity::Warn , "self assignment of expression: %s" }, 57 {"reference-conversion" , Severity::Warn , "rvalue to reference conversion of rvalue: %s" }, 58 {"qualifiers-zero_t-one_t" , Severity::Warn , "questionable use of type qualifier(s) with %s" }, 59 {"aggregate-forward-decl" , Severity::Warn , "forward declaration of nested aggregate: %s" }, 60 {"superfluous-decl" , Severity::Warn , "declaration does not allocate storage: %s" }, 61 {"superfluous-else" , Severity::Warn , "else clause never executed for empty loop conditional" }, 62 {"gcc-attributes" , Severity::Warn , "invalid attribute: %s" }, 63 {"c++-like-copy" , Severity::Warn , "Constructor from reference is not a valid copy constructor" }, 64 {"depreciated-trait-syntax" , Severity::Warn , "trait type-parameters are now specified using the forall clause" }, 66 65 }; 67 66 … … 76 75 CppCopy, 77 76 DeprecTraitSyntax, 78 NUMBER_OF_WARNINGS, // MUST be the last warning77 NUMBER_OF_WARNINGS, // This MUST be the last warning 79 78 }; 80 79 -
src/ControlStruct/FixLabels.cpp
rb83c575 r96b0e49 10 10 // Created On : Mon Nov 1 09:39:00 2021 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Nov 26 15:06:51 202313 // Update Count : 1012 // Last Modified On : Mon Jan 31 22:19:17 2022 13 // Update Count : 9 14 14 // 15 15 … … 47 47 for ( auto kvp : labelTable ) { 48 48 if ( nullptr == kvp.second ) { 49 SemanticError( kvp.first.location, "Use of undefined label %s.", kvp.first.name.c_str() ); 49 SemanticError( kvp.first.location, 50 "Use of undefined label: " + kvp.first.name ); 50 51 } 51 52 } -
src/ControlStruct/MultiLevelExit.cpp
rb83c575 r96b0e49 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Nov 1 13:48:00 2021 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Dec 11 13:44:45202313 // Update Count : 3 811 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Sep 8 17:04:00 2023 13 // Update Count : 36 14 14 // 15 15 … … 521 521 assert(0); 522 522 } 523 SemanticError( stmt->location, "'return' may not appear in a %s", context);523 SemanticError( stmt->location, toString( "'return' may not appear in a ", context ) ); 524 524 } 525 525 -
src/Parser/ParseNode.h
rb83c575 r96b0e49 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Dec 9 17:39:34202313 // Update Count : 94 511 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Apr 3 17:55:00 2023 13 // Update Count : 942 14 14 // 15 15 … … 37 37 class ExpressionNode; 38 38 struct StatementNode; 39 40 39 41 40 //############################################################################## … … 98 97 std::ostream & operator<<( std::ostream & out, const ParseNode * node ); 99 98 100 __attribute__((noreturn)) static inline void SemanticError( const ParseNode * obj, const std::string & error ) {101 SemanticError( obj->location, toString( error, obj ) );102 }103 104 99 // Local Variables: // 105 100 // tab-width: 4 // -
src/Parser/TypeData.cc
rb83c575 r96b0e49 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 15:12:51 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun Nov 26 15:51:05202313 // Update Count : 68 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Apr 4 13:39:00 2023 13 // Update Count : 680 14 14 // 15 15 … … 864 864 865 865 static string genTSError( string msg, DeclarationNode::BasicType basictype ) { 866 SemanticError( yylloc, "invalid type specifier \"%s\" for type \"%s\".", msg.c_str(), DeclarationNode::basicTypeNames[basictype]);866 SemanticError( yylloc, string( "invalid type specifier \"" ) + msg + "\" for type \"" + DeclarationNode::basicTypeNames[basictype] + "\"." ); 867 867 } // genTSError 868 868 … … 1507 1507 } // for 1508 1508 // declaration type still set => type not moved to a matching parameter so there is a missing parameter name 1509 if ( decl->type ) SemanticError( decl->location, "missing name in parameter list %s", decl->name->c_str());1509 if ( decl->type ) SemanticError( decl->location, string( "missing name in parameter list " ) + *decl->name ); 1510 1510 } // for 1511 1511 -
src/Parser/parser.yy
rb83c575 r96b0e49 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Nov 26 13:18:06202313 // Update Count : 639 812 // Last Modified On : Tue Oct 3 17:14:12 2023 13 // Update Count : 6396 14 14 // 15 15 … … 260 260 } // if 261 261 } else { 262 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed. " ); return nullptr;262 SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed. ." ); return nullptr; 263 263 } // if 264 264 } // forCtrl 265 265 266 266 static void IdentifierBeforeIdentifier( string & identifier1, string & identifier2, const char * kind ) { 267 SemanticError( yylloc, "syntax error, adjacent identifiers \"%s\" and \"%s\" are not meaningful in an %s.\n" 268 "Possible cause is misspelled type name or missing generic parameter.", 269 identifier1.c_str(), identifier2.c_str(), kind ); 267 SemanticError( yylloc, ::toString( "syntax error, adjacent identifiers \"", identifier1, "\" and \"", identifier2, "\" are not meaningful in a", kind, ".\n" 268 "Possible cause is misspelled type name or missing generic parameter." ) ); 270 269 } // IdentifierBeforeIdentifier 271 270 272 271 static void IdentifierBeforeType( string & identifier, const char * kind ) { 273 SemanticError( yylloc, "syntax error, identifier \"%s\" cannot appear before a %s.\n" 274 "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter.", 275 identifier.c_str(), kind ); 272 SemanticError( yylloc, ::toString( "syntax error, identifier \"", identifier, "\" cannot appear before a ", kind, ".\n" 273 "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter." ) ); 276 274 } // IdentifierBeforeType 277 275 … … 691 689 // { SemanticError( yylloc, "Resume expression is currently unimplemented." ); $$ = nullptr; } 692 690 | IDENTIFIER IDENTIFIER // invalid syntax rule 693 { IdentifierBeforeIdentifier( *$1.str, *$2.str, " expression" ); $$ = nullptr; }691 { IdentifierBeforeIdentifier( *$1.str, *$2.str, "n expression" ); $$ = nullptr; } 694 692 | IDENTIFIER type_qualifier // invalid syntax rule 695 693 { IdentifierBeforeType( *$1.str, "type qualifier" ); $$ = nullptr; } … … 1157 1155 | identifier_or_type_name ':' attribute_list_opt error // invalid syntax rule 1158 1156 { 1159 SemanticError( yylloc, "syntx error, label \"%s\" must be associated with a statement, "1160 "where a declaration, case, or default is not a statement.\n"1161 "Move the label or terminate with a semicolon.", $1.str->c_str() );1157 SemanticError( yylloc, ::toString( "syntx error, label \"", *$1.str, "\" must be associated with a statement, " 1158 "where a declaration, case, or default is not a statement. " 1159 "Move the label or terminate with a semi-colon." ) ); 1162 1160 $$ = nullptr; 1163 1161 } … … 2103 2101 | sue_declaration_specifier invalid_types // invalid syntax rule 2104 2102 { 2105 SemanticError( yylloc, "syntax error, expecting ';' at end of \"%s\" declaration.", 2106 $1->type->enumeration.name ? "enum" : ast::AggregateDecl::aggrString( $1->type->aggregate.kind ) ); 2103 SemanticError( yylloc, ::toString( "syntax error, expecting ';' at end of ", 2104 $1->type->enumeration.name ? "enum" : ast::AggregateDecl::aggrString( $1->type->aggregate.kind ), 2105 " declaration." ) ); 2107 2106 $$ = nullptr; 2108 2107 } … … 2162 2161 type_qualifier: 2163 2162 type_qualifier_name 2164 | attribute // trick handles most at tribute locations2163 | attribute // trick handles most atrribute locations 2165 2164 ; 2166 2165 … … 2586 2585 | type_specifier field_declaring_list_opt '}' // invalid syntax rule 2587 2586 { 2588 SemanticError( yylloc, "syntax error, expecting ';' at end of previous declaration.");2587 SemanticError( yylloc, ::toString( "syntax error, expecting ';' at end of previous declaration." ) ); 2589 2588 $$ = nullptr; 2590 2589 } -
src/ResolvExpr/CurrentObject.cc
rb83c575 r96b0e49 9 9 // Author : Rob Schluntz 10 10 // Created On : Tue Jun 13 15:28:32 2017 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Dec 9 17:49:51202313 // Update Count : 2011 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Apr 10 9:40:00 2023 13 // Update Count : 18 14 14 // 15 15 … … 181 181 auto res = eval( expr ); 182 182 if ( !res.hasKnownValue ) { 183 SemanticError( location, "Array designator must be a constant expression %s", toString( expr ).c_str() );183 SemanticError( location, toString( "Array designator must be a constant expression: ", expr ) ); 184 184 } 185 185 return res.knownValue; -
src/ResolvExpr/Resolver.cc
rb83c575 r96b0e49 9 9 // Author : Aaron B. Moss 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Dec 9 17:45:57 202313 // Update Count : 24 911 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Apr 20 10:41:00 2022 13 // Update Count : 248 14 14 // 15 15 … … 958 958 ++n_mutex_param; 959 959 960 // Check if the argument matches the parameter type in the current scope. 960 // Check if the argument matches the parameter type in the current 961 // scope 961 962 // ast::ptr< ast::Type > paramType = (*param)->get_type(); 962 963 963 if ( 964 964 ! unify( -
src/Validate/FixQualifiedTypes.cpp
rb83c575 r96b0e49 9 9 // Author : Andrew Beach 10 10 // Created On : Thr Apr 21 11:13:00 2022 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Dec 13 09:00:25 202313 // Update Count : 611 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Sep 20 16:15:00 2022 13 // Update Count : 1 14 14 // 15 15 … … 41 41 auto td = symtab.globalLookupType( inst->name ); 42 42 if ( !td ) { 43 SemanticError( *location, "Use of undefined global type %s.", inst->name.c_str() );43 SemanticError( *location, toString("Use of undefined global type ", inst->name) ); 44 44 } 45 45 auto base = td->base; … … 50 50 } else { 51 51 // .T => T is not a type name. 52 assertf( false, "unhandled global qualified child type: %s", toCString( child) );52 assertf( false, "unhandled global qualified child type: %s", toCString(child) ); 53 53 } 54 54 } else { … … 63 63 instp = inst; 64 64 } else { 65 SemanticError( *location, "Qualified type requires an aggregate on the left, but has %s.", toCString( parent) );65 SemanticError( *location, toString("Qualified type requires an aggregate on the left, but has: ", parent) ); 66 66 } 67 67 // TODO: Need to handle forward declarations. … … 81 81 } else { 82 82 // S.T - S is not an aggregate => error. 83 assertf( false, "unhandled qualified child type %s.", toCString( type) );83 assertf( false, "unhandled qualified child type: %s", toCString(type) ); 84 84 } 85 85 } 86 86 // failed to find a satisfying definition of type 87 SemanticError( *location, "Undefined type in qualified type %s", toCString( type) );87 SemanticError( *location, toString("Undefined type in qualified type: ", type) ); 88 88 } 89 89 } -
src/Validate/ForallPointerDecay.cpp
rb83c575 r96b0e49 9 9 // Author : Andrew Beach 10 10 // Created On : Tue Dec 7 16:15:00 2021 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : S un Nov 26 18:49:57 202313 // Update Count : 211 // Last Modified By : Andrew Beach 12 // Last Modified On : Sat Apr 23 13:10:00 2022 13 // Update Count : 1 14 14 // 15 15 … … 213 213 auto type = obj->type->stripDeclarator(); 214 214 if ( dynamic_cast< const ast::FunctionType * >( type ) ) return; 215 SemanticError( obj->location, "operator %s is not a function or function pointer.", obj->name.c_str() ); 215 SemanticError( obj->location, 216 toCString( "operator ", obj->name.c_str(), 217 " is not a function or function pointer." ) ); 216 218 } 217 219 }; -
src/Validate/ReplaceTypedef.cpp
rb83c575 r96b0e49 9 9 // Author : Andrew Beach 10 10 // Created On : Tue Jun 29 14:59:00 2022 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Nov 27 08:55:06 202313 // Update Count : 311 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Sep 20 17:00:00 2022 13 // Update Count : 2 14 14 // 15 15 … … 111 111 if ( !rtt ) { 112 112 assert( location ); 113 SemanticError( *location, "Cannot apply type parameters to base type of %s.", type->name.c_str());113 SemanticError( *location, "Cannot apply type parameters to base type of " + type->name ); 114 114 } 115 115 rtt->params.clear(); … … 125 125 if ( base == typedeclNames.end() ) { 126 126 assert( location ); 127 SemanticError( *location, "Use of undefined type %s.", type->name.c_str() );127 SemanticError( *location, toString( "Use of undefined type ", type->name ) ); 128 128 } 129 129 return ast::mutate_field( type, &ast::TypeInstType::base, base->second ); -
src/Virtual/ExpandCasts.cc
rb83c575 r96b0e49 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Jul 24 13:59:00 2017 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Nov 27 09:28:20 202313 // Update Count : 1011 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 11 12:06:00 2022 13 // Update Count : 5 14 14 // 15 15 … … 160 160 161 161 // Helper function for throwing semantic errors. 162 auto throwError = [&fieldName, &errorLocation, &oldDecl]( std::string const & message ) { 163 SemanticError( errorLocation, "While following head pointer of %s named \"%s\": %s", 164 oldDecl->name.c_str(), fieldName.c_str(), message.c_str() ); 162 auto throwError = [&fieldName, &errorLocation, &oldDecl]( 163 std::string const & message ) { 164 std::string const & context = "While following head pointer of " + 165 oldDecl->name + " named '" + fieldName + "': "; 166 SemanticError( errorLocation, context + message ); 165 167 }; 166 168
Note:
See TracChangeset
for help on using the changeset viewer.