$OpenBSD: patch-src_webidl-parser_y,v 1.1 2016/11/30 07:35:00 bentley Exp $
Fix undefined behavior in AST node creation.

From upstream 3b3b926d7fb92361b1e8eed2efb351c32cb7bfaa.
--- src/webidl-parser.y.orig	Sat Nov 19 02:44:03 2016
+++ src/webidl-parser.y	Mon Nov 28 18:51:54 2016
@@ -735,9 +735,9 @@ ConstValue:
         |
         TOK_INT_LITERAL
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT,
-                                     NULL,
-                                     (void *)$1);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_LITERAL_INT,
+                                            NULL,
+                                            $1);
         }
         |
         TOK_NULL_LITERAL
@@ -750,16 +750,16 @@ ConstValue:
 BooleanLiteral:
         TOK_TRUE
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
-                                     NULL,
-                                     (void *)true);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+                                            NULL,
+                                            (int)true);
         }
         |
         TOK_FALSE
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
-                                     NULL,
-                                     (void *)false);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+                                            NULL,
+                                            (int)false);
         }
         ;
 
@@ -846,16 +846,18 @@ Attribute:
 
                 /* deal with inherit modifier */
                 if ($1) {
-                        attribute = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
+                        attribute = webidl_new_number_node(
+                                          WEBIDL_NODE_TYPE_MODIFIER,
                                           attribute,
-                                          (void *)WEBIDL_TYPE_MODIFIER_INHERIT);
+                                          WEBIDL_TYPE_MODIFIER_INHERIT);
                 }
 
                 /* deal with readonly modifier */
                 if ($2) {
-                        attribute = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
+                        attribute = webidl_new_number_node(
+                                         WEBIDL_NODE_TYPE_MODIFIER,
                                          attribute,
-                                         (void *)WEBIDL_TYPE_MODIFIER_READONLY);
+                                         WEBIDL_TYPE_MODIFIER_READONLY);
                 }
 
                 $$ = webidl_node_new(WEBIDL_NODE_TYPE_ATTRIBUTE,
@@ -880,14 +882,16 @@ StaticMemberRest:
         {
                 struct webidl_node *attribute;
 
-                attribute = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
-                                       $2, (void *)WEBIDL_TYPE_MODIFIER_STATIC);
+                attribute = webidl_new_number_node(WEBIDL_NODE_TYPE_MODIFIER,
+                                                   $2,
+                                                   WEBIDL_TYPE_MODIFIER_STATIC);
 
                 /* deal with readonly modifier */
                 if ($1) {
-                        attribute = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
+                        attribute = webidl_new_number_node(
+                                         WEBIDL_NODE_TYPE_MODIFIER,
                                          attribute,
-                                         (void *)WEBIDL_TYPE_MODIFIER_READONLY);
+                                         WEBIDL_TYPE_MODIFIER_READONLY);
                 }
 
                 $$ = webidl_node_new(WEBIDL_NODE_TYPE_ATTRIBUTE,
@@ -900,8 +904,9 @@ StaticMemberRest:
                 struct webidl_node *operation;
 
                 /* add static modifier */
-                operation = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
-                                       $2, (void *)WEBIDL_TYPE_MODIFIER_STATIC);
+                operation = webidl_new_number_node(WEBIDL_NODE_TYPE_MODIFIER,
+                                                   $2,
+                                                   WEBIDL_TYPE_MODIFIER_STATIC);
 
                 /* put return type on the operation */
                 operation = webidl_node_prepend($1, operation);
@@ -1015,16 +1020,16 @@ Specials:
 Special:
         TOK_GETTER
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
-                                     NULL,
-                                     (void *)WEBIDL_TYPE_SPECIAL_GETTER);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_SPECIAL,
+                                            NULL,
+                                            WEBIDL_TYPE_SPECIAL_GETTER);
         }
         |
         TOK_SETTER
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
-                                     NULL,
-                                     (void *)WEBIDL_TYPE_SPECIAL_SETTER);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_SPECIAL,
+                                            NULL,
+                                            WEBIDL_TYPE_SPECIAL_SETTER);
         }
         |
         TOK_CREATOR
@@ -1032,23 +1037,23 @@ Special:
                 /* second edition removed this special but the
                  * specifications still use it!
                  */
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
-                                     NULL,
-                                     (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_SPECIAL,
+                                            NULL,
+                                            WEBIDL_TYPE_SPECIAL_CREATOR);
         }
         |
         TOK_DELETER
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
-                                     NULL,
-                                     (void *)WEBIDL_TYPE_SPECIAL_DELETER);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_SPECIAL,
+                                            NULL,
+                                            WEBIDL_TYPE_SPECIAL_DELETER);
         }
         |
         TOK_LEGACYCALLER
         {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
-                                     NULL,
-                                     (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_SPECIAL,
+                                            NULL,
+                                            WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
         }
         ;
 
@@ -1679,8 +1684,9 @@ SingleType:
         TOK_ANY TypeSuffixStartingWithArray
         {
                 /* todo deal with TypeSuffixStartingWithArray */
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE,
-                                     NULL, (void *)WEBIDL_TYPE_ANY);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                            NULL,
+                                            WEBIDL_TYPE_ANY);
         }
         ;
 
@@ -1742,29 +1748,39 @@ NonAnyType:
         |
         TOK_STRING TypeSuffix
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_STRING);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        $2,
+                                        WEBIDL_TYPE_STRING);
         }
         |
         TOK_IDENTIFIER TypeSuffix
         {
             struct webidl_node *type;
-            type = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_USER);
+            type = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                          $2,
+                                          WEBIDL_TYPE_USER);
             $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, type, $1);
         }
         |
         TOK_SEQUENCE '<' Type '>' Null
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $3, (void *)WEBIDL_TYPE_SEQUENCE);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        $3,
+                                        WEBIDL_TYPE_SEQUENCE);
         }
         |
         TOK_OBJECT TypeSuffix
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_OBJECT);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        $2,
+                                        WEBIDL_TYPE_OBJECT);
         }
         |
         TOK_DATE TypeSuffix
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, $2, (void *)WEBIDL_TYPE_DATE);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        $2,
+                                        WEBIDL_TYPE_DATE);
         }
         ;
 
@@ -1778,7 +1794,9 @@ ConstType:
         TOK_IDENTIFIER Null
         {
             struct webidl_node *type;
-            type = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_USER);
+            type = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                          NULL,
+                                          WEBIDL_TYPE_USER);
             type = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, type, $1);
             $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE, NULL, type);
         }
@@ -1793,17 +1811,23 @@ PrimitiveType:
         |
         TOK_BOOLEAN
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_BOOL);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        NULL,
+                                        WEBIDL_TYPE_BOOL);
         }
         |
         TOK_BYTE
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_BYTE);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        NULL,
+                                        WEBIDL_TYPE_BYTE);
         }
         |
         TOK_OCTET
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_OCTET);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        NULL,
+                                        WEBIDL_TYPE_OCTET);
         }
         ;
 
@@ -1811,9 +1835,9 @@ PrimitiveType:
 UnrestrictedFloatType:
         TOK_UNRESTRICTED FloatType
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
-                                 $2,
-                                 (void *)WEBIDL_TYPE_MODIFIER_UNRESTRICTED);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_MODIFIER,
+                                        $2,
+                                        WEBIDL_TYPE_MODIFIER_UNRESTRICTED);
         }
         |
         FloatType
@@ -1823,12 +1847,16 @@ UnrestrictedFloatType:
 FloatType:
         TOK_FLOAT
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_FLOAT);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        NULL,
+                                        WEBIDL_TYPE_FLOAT);
         }
         |
         TOK_DOUBLE
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_DOUBLE);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        NULL,
+                                        WEBIDL_TYPE_DOUBLE);
         }
         ;
 
@@ -1836,9 +1864,9 @@ FloatType:
 UnsignedIntegerType:
         TOK_UNSIGNED IntegerType
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_MODIFIER,
-                                 $2,
-                                 (void *)WEBIDL_TYPE_MODIFIER_UNSIGNED);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_MODIFIER,
+                                        $2,
+                                        WEBIDL_TYPE_MODIFIER_UNSIGNED);
         }
         |
         IntegerType
@@ -1848,15 +1876,21 @@ UnsignedIntegerType:
 IntegerType:
         TOK_SHORT
         {
-            $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_SHORT);
+            $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                        NULL,
+                                        WEBIDL_TYPE_SHORT);
         }
         |
         TOK_LONG OptionalLong
         {
             if ($2) {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_LONGLONG);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                            NULL,
+                                            WEBIDL_TYPE_LONGLONG);
             } else {
-                $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_LONG);
+                $$ = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                            NULL,
+                                            WEBIDL_TYPE_LONG);
             }
         }
         ;
@@ -1927,7 +1961,9 @@ ReturnType:
         TOK_VOID
         {
             struct webidl_node *type;
-            type = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_VOID);
+            type = webidl_new_number_node(WEBIDL_NODE_TYPE_TYPE_BASE,
+                                          NULL,
+                                          WEBIDL_TYPE_VOID);
             $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE, NULL, type);
         }
 
