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:
@@ -30,3 +30,26 @@ The __LINE__ and __FILE__ macros are not yet supported.
|
|||||||
A file that ends with a function-like macro name as the last
|
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
|
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.
|
||||||
|
@@ -4012,7 +4012,7 @@ _define_object_macro (glcpp_parser_t *parser,
|
|||||||
talloc_free (macro);
|
talloc_free (macro);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
glcpp_error (loc, parser, "Redefinition of macro %s\n",
|
glcpp_warning (loc, parser, "Redefinition of macro %s\n",
|
||||||
identifier);
|
identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4043,7 +4043,7 @@ _define_function_macro (glcpp_parser_t *parser,
|
|||||||
talloc_free (macro);
|
talloc_free (macro);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
glcpp_error (loc, parser, "Redefinition of macro %s\n",
|
glcpp_warning (loc, parser, "Redefinition of macro %s\n",
|
||||||
identifier);
|
identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1687,7 +1687,7 @@ _define_object_macro (glcpp_parser_t *parser,
|
|||||||
talloc_free (macro);
|
talloc_free (macro);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
glcpp_error (loc, parser, "Redefinition of macro %s\n",
|
glcpp_warning (loc, parser, "Redefinition of macro %s\n",
|
||||||
identifier);
|
identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1718,7 +1718,7 @@ _define_function_macro (glcpp_parser_t *parser,
|
|||||||
talloc_free (macro);
|
talloc_free (macro);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
glcpp_error (loc, parser, "Redefinition of macro %s\n",
|
glcpp_warning (loc, parser, "Redefinition of macro %s\n",
|
||||||
identifier);
|
identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user