Reject identifiers reserved in C++

C reserves all identifiers with leading underscores in file scope, and
reservers identifiers with two leading underscores or an underscore
followed by a capital letter in any context.  C++ also reserves
identifiers with two consecutive underscores in any context.  Ensure
that code generated by wayland-scanner obeys these restrictions.

Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
This commit is contained in:
Demi Marie Obenour 2021-10-16 12:01:03 -04:00
parent 7cdc20cee6
commit ee7141ef88

View file

@ -653,6 +653,7 @@ validate_identifier(struct location *loc,
enum identifier_role role)
{
const char *scan;
bool last_was_underscore = true;
if (!*str) {
fail(loc, "element name is empty");
@ -665,6 +666,12 @@ validate_identifier(struct location *loc,
bool is_alpha = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
bool is_digit = c >= '0' && c <= '9';
bool leading_char = (scan == str) && role == STANDALONE_IDENT;
if (c == '_' && last_was_underscore)
fail(loc,
"'%s' is not a valid identifier: identifiers must "
"not start with an underscore or have consecutive "
"underscores", str);
last_was_underscore = c == '_';
if (is_alpha || c == '_' || (!leading_char && is_digit))
continue;