Browse Source

cppparser: Support `__restrict` and `__restrict__` keywords

To compile C code, you can do `-Drestrict=__restrict`
rdb 1 year ago
parent
commit
6e81fb5cdf

+ 27 - 1
dtool/src/cppparser/cppBison.yxx

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

+ 1 - 0
dtool/src/cppparser/cppInstanceIdentifier.cxx

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

+ 1 - 0
dtool/src/cppparser/cppInstanceIdentifier.h

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

+ 3 - 0
dtool/src/cppparser/cppPreprocessor.cxx

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

+ 8 - 0
dtool/src/cppparser/cppToken.cxx

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