aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'mesalib/src/glsl')
-rw-r--r--mesalib/src/glsl/glcpp/README25
-rw-r--r--mesalib/src/glsl/glcpp/glcpp-parse.c8
-rw-r--r--mesalib/src/glsl/glcpp/glcpp-parse.y8
3 files changed, 32 insertions, 9 deletions
diff --git a/mesalib/src/glsl/glcpp/README b/mesalib/src/glsl/glcpp/README
index 0b5ef508c..9cc00e927 100644
--- a/mesalib/src/glsl/glcpp/README
+++ b/mesalib/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/mesalib/src/glsl/glcpp/glcpp-parse.c b/mesalib/src/glsl/glcpp/glcpp-parse.c
index 8567bda1e..2bf96e035 100644
--- a/mesalib/src/glsl/glcpp/glcpp-parse.c
+++ b/mesalib/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/mesalib/src/glsl/glcpp/glcpp-parse.y b/mesalib/src/glsl/glcpp/glcpp-parse.y
index b449eb288..797e61428 100644
--- a/mesalib/src/glsl/glcpp/glcpp-parse.y
+++ b/mesalib/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);