[Mesa-dev] [PATCH 04/10] glsl: Fix an off-by-one error in line numbers in error messages

Carl Worth cworth at cworth.org
Sat Dec 8 13:43:39 PST 2012


The #line directive specifies the line number for the subsequent line of text.
So, since we will see another newline before that line, (and hence, increment
yylineno one more time), we have to set the yylineno value to one less than
we would otherwise.

This is in addition to setting it to one less for sake of being zero-based,
(which we were already doing).

So, subtract 2 for the value we want.
---
 src/glsl/glsl_lexer.ll |   18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
index 4fca4ea..2a0e01b 100644
--- a/src/glsl/glsl_lexer.ll
+++ b/src/glsl/glsl_lexer.ll
@@ -177,11 +177,12 @@ HASH		^{SPC}#{SPC}
 				   while (!isdigit(*ptr))
 				      ptr++;
 
-				   /* Subtract one from the line number because
-				    * yylineno is zero-based instead of
-				    * one-based.
+				   /* Subtract two from the line number parsed.
+				    * 1 because yylineno is zero-based and
+				    * 2 because #line gives the line number for
+				    * the subsequent line of the source.
 				    */
-				   yylineno = strtol(ptr, &ptr, 0) - 1;
+				   yylineno = strtol(ptr, &ptr, 0) - 2;
 				   yylloc->source = strtol(ptr, NULL, 0);
 				}
 {HASH}line{SPCP}{INT}{SPC}$	{
@@ -192,11 +193,12 @@ HASH		^{SPC}#{SPC}
 				   while (!isdigit(*ptr))
 				      ptr++;
 
-				   /* Subtract one from the line number because
-				    * yylineno is zero-based instead of
-				    * one-based.
+				   /* Subtract two from the line number parsed.
+				    * 1 because yylineno is zero-based and
+				    * 2 because #line gives the line number for
+				    * the subsequent line of the source.
 				    */
-				   yylineno = strtol(ptr, &ptr, 0) - 1;
+				   yylineno = strtol(ptr, &ptr, 0) - 2;
 				}
 ^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) {
 				  BEGIN PP;
-- 
1.7.10



More information about the mesa-dev mailing list