summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glsl/glcpp/glcpp-lex.l38
-rw-r--r--src/glsl/glcpp/glcpp-parse.y1
-rw-r--r--src/glsl/glcpp/glcpp.h1
-rw-r--r--src/glsl/glcpp/tests/063-comments.c.expected4
-rw-r--r--src/glsl/glcpp/tests/094-divide-by-zero-short-circuit.c.expected2
-rw-r--r--src/glsl/glcpp/tests/117-line-continuation-and-non-continuation-backslash.c.expected2
-rw-r--r--src/glsl/glcpp/tests/118-comment-becomes-space.c4
-rw-r--r--src/glsl/glcpp/tests/118-comment-becomes-space.c.expected5
8 files changed, 48 insertions, 9 deletions
diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index f1db165d199..f1fa192c5f4 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -67,7 +67,7 @@ void glcpp_set_column (int column_no , yyscan_t yyscanner);
%option stack
%option never-interactive
-%x DONE COMMENT UNREACHABLE SKIP DEFINE
+%x DONE COMMENT UNREACHABLE SKIP DEFINE NEWLINE_CATCHUP
SPACE [[:space:]]
NONSPACE [^[:space:]]
@@ -93,6 +93,25 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
%%
+ glcpp_parser_t *parser = yyextra;
+
+ /* When we lex a multi-line comment, we replace it (as
+ * specified) with a single space. But if the comment spanned
+ * multiple lines, then subsequent parsing stages will not
+ * count correct line numbers. To avoid this problem we keep
+ * track of all newlines that were commented out by a
+ * multi-line comment, and we emit a NEWLINE token for each at
+ * the next legal opportunity, (which is when the lexer would
+ * be emitting a NEWLINE token anyway).
+ */
+ if (YY_START == NEWLINE_CATCHUP) {
+ if (parser->commented_newlines)
+ parser->commented_newlines--;
+ if (parser->commented_newlines == 0)
+ BEGIN INITIAL;
+ return NEWLINE;
+ }
+
/* The handling of the SKIP vs INITIAL start states requires
* some special handling. Typically, a lexer would change
* start states with statements like "BEGIN SKIP" within the
@@ -123,7 +142,6 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
* expression so the parser can correctly update the
* skip_stack state.
*/
- glcpp_parser_t *parser = yyextra;
if (YY_START == INITIAL || YY_START == SKIP) {
if (parser->lexing_if ||
parser->skip_stack == NULL ||
@@ -137,14 +155,16 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
/* Single-line comments */
"//"[^\n]* {
+ if (parser->commented_newlines)
+ BEGIN NEWLINE_CATCHUP;
}
/* Multi-line comments */
"/*" { yy_push_state(COMMENT, yyscanner); }
<COMMENT>[^*\n]*
-<COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; return NEWLINE; }
+<COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; parser->commented_newlines++; }
<COMMENT>"*"+[^*/\n]*
-<COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; return NEWLINE; }
+<COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; parser->commented_newlines++; }
<COMMENT>"*"+"/" {
yy_pop_state(yyscanner);
if (yyextra->space_tokens)
@@ -160,6 +180,8 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
/* glcpp doesn't handle #extension, #version, or #pragma directives.
* Simply pass them through to the main compiler's lexer/parser. */
{HASH}(extension|pragma)[^\n]+ {
+ if (parser->commented_newlines)
+ BEGIN NEWLINE_CATCHUP;
yylval->str = ralloc_strdup (yyextra, yytext);
yylineno++;
yycolumn = 0;
@@ -206,7 +228,10 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
}
}
-<SKIP>[^\n] ;
+<SKIP>[^\n] {
+ if (parser->commented_newlines)
+ BEGIN NEWLINE_CATCHUP;
+}
{HASH}error.* {
char *p;
@@ -321,6 +346,9 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
}
<SKIP,INITIAL>\n {
+ if (parser->commented_newlines) {
+ BEGIN NEWLINE_CATCHUP;
+ }
yyextra->lexing_if = 0;
yylineno++;
yycolumn = 0;
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index 7edc27488a0..5474577ebe4 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -1164,6 +1164,7 @@ glcpp_parser_create (const struct gl_extensions *extensions, int api)
parser->newline_as_space = 0;
parser->in_control_line = 0;
parser->paren_count = 0;
+ parser->commented_newlines = 0;
parser->skip_stack = NULL;
diff --git a/src/glsl/glcpp/glcpp.h b/src/glsl/glcpp/glcpp.h
index 8aaa551d128..e95ab8497d8 100644
--- a/src/glsl/glcpp/glcpp.h
+++ b/src/glsl/glcpp/glcpp.h
@@ -172,6 +172,7 @@ struct glcpp_parser {
int newline_as_space;
int in_control_line;
int paren_count;
+ int commented_newlines;
skip_node_t *skip_stack;
token_list_t *lex_from_list;
token_node_t *lex_from_node;
diff --git a/src/glsl/glcpp/tests/063-comments.c.expected b/src/glsl/glcpp/tests/063-comments.c.expected
index 73ca7071faa..1965c9be02d 100644
--- a/src/glsl/glcpp/tests/063-comments.c.expected
+++ b/src/glsl/glcpp/tests/063-comments.c.expected
@@ -5,16 +5,16 @@ f = g /h;
l();
m = n
+ p;
+
-
more code here
-
+
are not treated like comments.
diff --git a/src/glsl/glcpp/tests/094-divide-by-zero-short-circuit.c.expected b/src/glsl/glcpp/tests/094-divide-by-zero-short-circuit.c.expected
index 84fdc50c920..be20b7c8909 100644
--- a/src/glsl/glcpp/tests/094-divide-by-zero-short-circuit.c.expected
+++ b/src/glsl/glcpp/tests/094-divide-by-zero-short-circuit.c.expected
@@ -1,4 +1,5 @@
0:12(17): preprocessor error: division by 0 in preprocessor directive
+
@@ -9,7 +10,6 @@
-
diff --git a/src/glsl/glcpp/tests/117-line-continuation-and-non-continuation-backslash.c.expected b/src/glsl/glcpp/tests/117-line-continuation-and-non-continuation-backslash.c.expected
index 9b3eb676f08..292d6516fe0 100644
--- a/src/glsl/glcpp/tests/117-line-continuation-and-non-continuation-backslash.c.expected
+++ b/src/glsl/glcpp/tests/117-line-continuation-and-non-continuation-backslash.c.expected
@@ -1,3 +1,4 @@
+
@@ -6,7 +7,6 @@
-
diff --git a/src/glsl/glcpp/tests/118-comment-becomes-space.c b/src/glsl/glcpp/tests/118-comment-becomes-space.c
new file mode 100644
index 00000000000..53e80394ab6
--- /dev/null
+++ b/src/glsl/glcpp/tests/118-comment-becomes-space.c
@@ -0,0 +1,4 @@
+#define FOO first/*
+*/second
+
+FOO
diff --git a/src/glsl/glcpp/tests/118-comment-becomes-space.c.expected b/src/glsl/glcpp/tests/118-comment-becomes-space.c.expected
new file mode 100644
index 00000000000..2adf5d1ba90
--- /dev/null
+++ b/src/glsl/glcpp/tests/118-comment-becomes-space.c.expected
@@ -0,0 +1,5 @@
+
+
+
+first second
+