cppparser: Support __restrict and __restrict__ keywords

To compile C code, you can do `-Drestrict=__restrict`
This commit is contained in:
rdb 2024-03-29 11:36:14 +01:00
parent e16cb8af98
commit 6e81fb5cdf
5 changed files with 40 additions and 1 deletions

View File

@ -333,6 +333,7 @@ pop_struct() {
%token KW_PUBLIC %token KW_PUBLIC
%token KW_REGISTER %token KW_REGISTER
%token KW_REINTERPRET_CAST %token KW_REINTERPRET_CAST
%token KW_RESTRICT
%token KW_RETURN %token KW_RETURN
%token KW_SHORT %token KW_SHORT
%token KW_SIGNED %token KW_SIGNED
@ -2265,6 +2266,11 @@ not_paren_formal_parameter_identifier:
{ {
$$ = $2; $$ = $2;
$$->add_modifier(IIT_volatile); $$->add_modifier(IIT_volatile);
}
| KW_RESTRICT not_paren_formal_parameter_identifier %prec UNARY
{
$$ = $2;
$$->add_modifier(IIT_restrict);
} }
| '*' optional_attributes not_paren_formal_parameter_identifier %prec UNARY | '*' optional_attributes not_paren_formal_parameter_identifier %prec UNARY
{ {
@ -2311,6 +2317,11 @@ formal_parameter_identifier:
{ {
$$ = $2; $$ = $2;
$$->add_modifier(IIT_volatile); $$->add_modifier(IIT_volatile);
}
| KW_RESTRICT formal_parameter_identifier %prec UNARY
{
$$ = $2;
$$->add_modifier(IIT_restrict);
} }
| '*' optional_attributes formal_parameter_identifier %prec UNARY | '*' optional_attributes formal_parameter_identifier %prec UNARY
{ {
@ -2370,6 +2381,11 @@ parameter_pack_identifier:
{ {
$$ = $2; $$ = $2;
$$->add_modifier(IIT_volatile); $$->add_modifier(IIT_volatile);
}
| KW_RESTRICT parameter_pack_identifier %prec UNARY
{
$$ = $2;
$$->add_modifier(IIT_restrict);
} }
| '*' optional_attributes parameter_pack_identifier %prec UNARY | '*' optional_attributes parameter_pack_identifier %prec UNARY
{ {
@ -2433,6 +2449,11 @@ not_paren_empty_instance_identifier:
{ {
$$ = $2; $$ = $2;
$$->add_modifier(IIT_volatile); $$->add_modifier(IIT_volatile);
}
| KW_RESTRICT not_paren_empty_instance_identifier %prec UNARY
{
$$ = $2;
$$->add_modifier(IIT_restrict);
} }
| '*' optional_attributes not_paren_empty_instance_identifier %prec UNARY | '*' optional_attributes not_paren_empty_instance_identifier %prec UNARY
{ {
@ -2485,6 +2506,11 @@ empty_instance_identifier:
{ {
$$ = $2; $$ = $2;
$$->add_modifier(IIT_volatile); $$->add_modifier(IIT_volatile);
}
| KW_RESTRICT empty_instance_identifier %prec UNARY
{
$$ = $2;
$$->add_modifier(IIT_restrict);
} }
| '*' optional_attributes not_paren_empty_instance_identifier %prec UNARY | '*' optional_attributes not_paren_empty_instance_identifier %prec UNARY
{ {
@ -3318,7 +3344,7 @@ element:
| KW_NAMESPACE | KW_NEW | KW_NOEXCEPT | KW_NOEXCEPT_LPAREN | KW_NULLPTR | KW_NAMESPACE | KW_NEW | KW_NOEXCEPT | KW_NOEXCEPT_LPAREN | KW_NULLPTR
| KW_OPERATOR | KW_OVERRIDE | KW_PRIVATE | KW_PROTECTED | KW_OPERATOR | KW_OVERRIDE | KW_PRIVATE | KW_PROTECTED
| KW_PUBLIC | KW_PUBLISHED | KW_REGISTER | KW_REINTERPRET_CAST | KW_PUBLIC | KW_PUBLISHED | KW_REGISTER | KW_REINTERPRET_CAST
| KW_RETURN | KW_SHORT | KW_SIGNED | KW_SIZEOF | KW_STATIC | KW_RESTRICT | KW_RETURN | KW_SHORT | KW_SIGNED | KW_SIZEOF | KW_STATIC
| KW_STATIC_ASSERT | KW_STATIC_CAST | KW_STRUCT | KW_TEMPLATE | KW_STATIC_ASSERT | KW_STATIC_CAST | KW_STRUCT | KW_TEMPLATE
| KW_THREAD_LOCAL | KW_THROW | KW_TRUE | KW_TRY | KW_TYPEDEF | KW_THREAD_LOCAL | KW_THROW | KW_TRUE | KW_TRY | KW_TYPEDEF
| KW_TYPEID | KW_TYPENAME | KW_UNDERLYING_TYPE | KW_UNION | KW_TYPEID | KW_TYPENAME | KW_UNDERLYING_TYPE | KW_UNION

View File

@ -302,6 +302,7 @@ r_unroll_type(CPPType *start_type,
break; break;
case IIT_volatile: case IIT_volatile:
case IIT_restrict:
// Just pass it through for now. // Just pass it through for now.
result = r_unroll_type(start_type, mi); result = r_unroll_type(start_type, mi);
break; break;

View File

@ -35,6 +35,7 @@ enum CPPInstanceIdentifierType {
IIT_array, IIT_array,
IIT_const, IIT_const,
IIT_volatile, IIT_volatile,
IIT_restrict,
IIT_paren, IIT_paren,
IIT_func, IIT_func,
IIT_initializer, IIT_initializer,

View File

@ -2816,6 +2816,9 @@ check_keyword(const string &name) {
if (name == "public") return KW_PUBLIC; if (name == "public") return KW_PUBLIC;
if (name == "register") return KW_REGISTER; if (name == "register") return KW_REGISTER;
if (name == "reinterpret_cast") return KW_REINTERPRET_CAST; if (name == "reinterpret_cast") return KW_REINTERPRET_CAST;
//if (name == "restrict") return KW_RESTRICT;
if (name == "__restrict") return KW_RESTRICT;
if (name == "__restrict__") return KW_RESTRICT;
if (name == "return") return KW_RETURN; if (name == "return") return KW_RETURN;
if (name == "short") return KW_SHORT; if (name == "short") return KW_SHORT;
if (name == "signed") return KW_SIGNED; if (name == "signed") return KW_SIGNED;

View File

@ -567,6 +567,10 @@ output(std::ostream &out) const {
out << "KW_REINTERPRET_CAST"; out << "KW_REINTERPRET_CAST";
break; break;
case KW_RESTRICT:
out << "KW_RESTRICT";
break;
case KW_RETURN: case KW_RETURN:
out << "KW_RETURN"; out << "KW_RETURN";
break; break;
@ -1227,6 +1231,10 @@ output_code(std::ostream &out) const {
out << "reinterpret_cast"; out << "reinterpret_cast";
break; break;
case KW_RESTRICT:
out << "__restrict";
break;
case KW_RETURN: case KW_RETURN:
out << "return"; out << "return";
break; break;