diff --git a/src/link/lexer.cpp b/src/link/lexer.cpp index 61b19211..f5fdb9bb 100644 --- a/src/link/lexer.cpp +++ b/src/link/lexer.cpp @@ -52,11 +52,10 @@ void lexer_IncludeFile(std::string &&path) { scriptError( "Failed to open included linker script \"%s\": %s", badPath.c_str(), strerror(errno) ); + // `.pop_back()` cannot invalidate an unpopped reference, so `prevContext` + // is still valid even if `.open()` failed. + ++prevContext.lineNo; } - - // `.pop_back()` cannot invalidate an unpopped reference, so `prevContext` - // is still valid even if `.open()` failed. - ++prevContext.lineNo; } void lexer_IncLineNo() { @@ -74,6 +73,8 @@ static yy::parser::symbol_type yywrap() { return yy::parser::make_newline(); } lexerStack.pop_back(); + // Increment the line number *after* an INCLUDE has finished. + ++lexerStack.back().lineNo; return yylex(); } if (!atEof) { diff --git a/src/link/script.y b/src/link/script.y index 8e442ac2..2b3b5b0f 100644 --- a/src/link/script.y +++ b/src/link/script.y @@ -52,7 +52,8 @@ lines: line: INCLUDE string newline { - lexer_IncludeFile(std::move($2)); // Note: this additionally increments the line number! + // This does *not* increment the line number until the included content has finished parsing! + lexer_IncludeFile(std::move($2)); } | directive newline { lexer_IncLineNo(); diff --git a/test/link/large-constant.out b/test/link/large-constant.out index 7c9ebf3b..f38467c4 100644 --- a/test/link/large-constant.out +++ b/test/link/large-constant.out @@ -1,2 +1,2 @@ warning: Integer constant is too large [-Wlarge-constant] - at large-constant.inc(1) <- large-constant.link(3) + at large-constant.inc(1) <- large-constant.link(2) diff --git a/test/link/linkerscript-include.out b/test/link/linkerscript-include.out index 61aeab4c..69a858ac 100644 --- a/test/link/linkerscript-include.out +++ b/test/link/linkerscript-include.out @@ -1,3 +1,3 @@ error: The linker script assigns section "test" to address $0000, but it was already at $002a - at linkerscript-include.inc(1) <- linkerscript-include.link(4) + at linkerscript-include.inc(1) <- linkerscript-include.link(3) Linking failed with 1 error