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.
This commit is contained in:
Carl Worth
2010-08-23 11:38:45 -07:00
parent 476db2bd3d
commit d3df641f0a
4 changed files with 38 additions and 15 deletions

View File

@@ -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).
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.

View File

@@ -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);

View File

@@ -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);

View File

@@ -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