Mesa (master): glcpp: Demote "macro redefined" from an error to a warning

Carl Worth cworth at kemper.freedesktop.org
Fri Jan 28 05:16:57 UTC 2011


Module: Mesa
Branch: master
Commit: d3df641f0aba99b0b65ecd4d9b06798bca090a29
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d3df641f0aba99b0b65ecd4d9b06798bca090a29

Author: Carl Worth <cworth at cworth.org>
Date:   Mon Aug 23 11:38:45 2010 -0700

glcpp: Demote "macro redefined" from an error to a warning

The GLSL specification is vague here, (just says "as is standard for
C++"), though the C specifications seem quite clear that this should
be an error.

However, an existing piglit test (CorrectPreprocess11.frag) expects
this to be a warning, not an error, so we change this, and document in
README the deviation from the specification.

---

 src/glsl/glcpp/README                              |   25 +++++++++++++++++++-
 src/glsl/glcpp/glcpp-parse.c                       |    8 +++---
 src/glsl/glcpp/glcpp-parse.y                       |    8 +++---
 .../tests/089-redefine-macro-error.c.expected      |   12 ++++----
 4 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/src/glsl/glcpp/README b/src/glsl/glcpp/README
index 0b5ef50..9cc00e9 100644
--- a/src/glsl/glcpp/README
+++ b/src/glsl/glcpp/README
@@ -29,4 +29,27 @@ The __LINE__ and __FILE__ macros are not yet supported.
 
 A file that ends with a function-like macro name as the last
 non-whitespace token will result in a parse error, (where it should be
-passed through as is).
\ No newline at end of file
+passed through as is).
+
+Known deviations from the specification
+---------------------------------------
+As mentoned above, the GLSL specification (as of 1.30.10) is fairly
+vague on some aspects of the preprocessor, and we've been using C99 to
+fill in details. Here is a list of cases where we have deviated from
+the behavior specified in C99 to obtain better compatibility with
+other GLSL implementations:
+
+  * Redefining a macro with a different value
+
+    C89 says that a macro "may be redefined ... provided that the
+    second definition [is equivalent]" (Section 3.8.3 Macro
+    Replacement/constraints)
+
+    C99 is even more explicit, saying tthat a macro "shall not be
+    redefined by another #define preprocessing directive unless the
+    second definition [is equivalent]" (Section 6.10.3 Macro
+    Replacement/Constraints)
+
+    In spite of this, glcpp emits a warning rather than an error for
+    non-equivalent redefinition of macros since this matches the
+    behavior of other, widely-used implementations.
diff --git a/src/glsl/glcpp/glcpp-parse.c b/src/glsl/glcpp/glcpp-parse.c
index 8567bda..2bf96e0 100644
--- a/src/glsl/glcpp/glcpp-parse.c
+++ b/src/glsl/glcpp/glcpp-parse.c
@@ -4012,8 +4012,8 @@ _define_object_macro (glcpp_parser_t *parser,
 			talloc_free (macro);
 			return;
 		}
-		glcpp_error (loc, parser, "Redefinition of macro %s\n",
-			     identifier);
+		glcpp_warning (loc, parser, "Redefinition of macro %s\n",
+			       identifier);
 	}
 
 	hash_table_insert (parser->defines, macro, identifier);
@@ -4043,8 +4043,8 @@ _define_function_macro (glcpp_parser_t *parser,
 			talloc_free (macro);
 			return;
 		}
-		glcpp_error (loc, parser, "Redefinition of macro %s\n",
-			     identifier);
+		glcpp_warning (loc, parser, "Redefinition of macro %s\n",
+			       identifier);
 	}
 
 	hash_table_insert (parser->defines, macro, identifier);
diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
index b449eb2..797e614 100644
--- a/src/glsl/glcpp/glcpp-parse.y
+++ b/src/glsl/glcpp/glcpp-parse.y
@@ -1687,8 +1687,8 @@ _define_object_macro (glcpp_parser_t *parser,
 			talloc_free (macro);
 			return;
 		}
-		glcpp_error (loc, parser, "Redefinition of macro %s\n",
-			     identifier);
+		glcpp_warning (loc, parser, "Redefinition of macro %s\n",
+			       identifier);
 	}
 
 	hash_table_insert (parser->defines, macro, identifier);
@@ -1718,8 +1718,8 @@ _define_function_macro (glcpp_parser_t *parser,
 			talloc_free (macro);
 			return;
 		}
-		glcpp_error (loc, parser, "Redefinition of macro %s\n",
-			     identifier);
+		glcpp_warning (loc, parser, "Redefinition of macro %s\n",
+			       identifier);
 	}
 
 	hash_table_insert (parser->defines, macro, identifier);
diff --git a/src/glsl/glcpp/tests/089-redefine-macro-error.c.expected b/src/glsl/glcpp/tests/089-redefine-macro-error.c.expected
index 6209ead..4c92e1d 100644
--- a/src/glsl/glcpp/tests/089-redefine-macro-error.c.expected
+++ b/src/glsl/glcpp/tests/089-redefine-macro-error.c.expected
@@ -1,14 +1,14 @@
-0:2(9): preprocessor error: Redefinition of macro x
+0:2(9): preprocessor warning: Redefinition of macro x
 
-0:5(9): preprocessor error: Redefinition of macro abc
+0:5(9): preprocessor warning: Redefinition of macro abc
 
-0:8(9): preprocessor error: Redefinition of macro foo
+0:8(9): preprocessor warning: Redefinition of macro foo
 
-0:11(9): preprocessor error: Redefinition of macro bar
+0:11(9): preprocessor warning: Redefinition of macro bar
 
-0:14(9): preprocessor error: Redefinition of macro biff
+0:14(9): preprocessor warning: Redefinition of macro biff
 
-0:17(9): preprocessor error: Redefinition of macro oper
+0:17(9): preprocessor warning: Redefinition of macro oper
 
 
 




More information about the mesa-commit mailing list