widl: Update to current Wine version.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
diff --git a/mingw-w64-tools/widl/VERSION b/mingw-w64-tools/widl/VERSION
index e99ac93..caf7b8b 100644
--- a/mingw-w64-tools/widl/VERSION
+++ b/mingw-w64-tools/widl/VERSION
@@ -1 +1 @@
-WIDL version 8.19
+WIDL version 8.21
diff --git a/mingw-w64-tools/widl/configure b/mingw-w64-tools/widl/configure
index d8a0982..ba98b23 100755
--- a/mingw-w64-tools/widl/configure
+++ b/mingw-w64-tools/widl/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for widl 8.19.
+# Generated by GNU Autoconf 2.71 for widl 8.21.
 #
 # Report bugs to <mingw-w64-public@lists.sourceforge.net>.
 #
@@ -610,8 +610,8 @@
 # Identity of this package.
 PACKAGE_NAME='widl'
 PACKAGE_TARNAME='widl'
-PACKAGE_VERSION='8.19'
-PACKAGE_STRING='widl 8.19'
+PACKAGE_VERSION='8.21'
+PACKAGE_STRING='widl 8.21'
 PACKAGE_BUGREPORT='mingw-w64-public@lists.sourceforge.net'
 PACKAGE_URL=''
 
@@ -1319,7 +1319,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures widl 8.19 to adapt to many kinds of systems.
+\`configure' configures widl 8.21 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1391,7 +1391,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of widl 8.19:";;
+     short | recursive ) echo "Configuration of widl 8.21:";;
    esac
   cat <<\_ACEOF
 
@@ -1493,7 +1493,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-widl configure 8.19
+widl configure 8.21
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1905,7 +1905,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by widl $as_me 8.19, which was
+It was created by widl $as_me 8.21, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3295,7 +3295,7 @@
 
 # Define the identity of the package.
  PACKAGE='widl'
- VERSION='8.19'
+ VERSION='8.21'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -5789,7 +5789,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by widl $as_me 8.19, which was
+This file was extended by widl $as_me 8.21, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5857,7 +5857,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-widl config.status 8.19
+widl config.status 8.21
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 
diff --git a/mingw-w64-tools/widl/include/windef.h b/mingw-w64-tools/widl/include/windef.h
index b22e15c..78e4f56 100644
--- a/mingw-w64-tools/widl/include/windef.h
+++ b/mingw-w64-tools/widl/include/windef.h
@@ -439,4 +439,10 @@
 }
 #endif
 
+typedef enum {
+  DPI_HOSTING_BEHAVIOR_INVALID = -1,
+  DPI_HOSTING_BEHAVIOR_DEFAULT = 0,
+  DPI_HOSTING_BEHAVIOR_MIXED = 1
+} DPI_HOSTING_BEHAVIOR;
+
 #endif /* _WINDEF_ */
diff --git a/mingw-w64-tools/widl/include/winnt.h b/mingw-w64-tools/widl/include/winnt.h
index d864dd3..39332ef 100644
--- a/mingw-w64-tools/widl/include/winnt.h
+++ b/mingw-w64-tools/widl/include/winnt.h
@@ -180,7 +180,10 @@
 
 /* a couple of useful Wine extensions */
 
-#ifdef _MSC_VER
+#if defined(__WINESRC__) && !defined(WINE_UNIX_LIB)
+/* Wine uses .spec file for PE exports */
+# define DECLSPEC_EXPORT
+#elif defined(_MSC_VER)
 # define DECLSPEC_EXPORT __declspec(dllexport)
 #elif defined(__MINGW32__)
 # define DECLSPEC_EXPORT __attribute__((dllexport))
@@ -6756,6 +6759,7 @@
 #define InterlockedDecrement64 _InterlockedDecrement64
 #define InterlockedExchange _InterlockedExchange
 #define InterlockedExchangeAdd _InterlockedExchangeAdd
+#define InterlockedExchangeAdd16 _InterlockedExchangeAdd16
 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
 #define InterlockedExchangePointer _InterlockedExchangePointer
 #define InterlockedIncrement _InterlockedIncrement
@@ -6776,6 +6780,7 @@
 #pragma intrinsic(_InterlockedCompareExchangePointer)
 #pragma intrinsic(_InterlockedExchange)
 #pragma intrinsic(_InterlockedExchangeAdd)
+#pragma intrinsic(_InterlockedExchangeAdd16)
 #pragma intrinsic(_InterlockedExchangePointer)
 #pragma intrinsic(_InterlockedIncrement)
 #pragma intrinsic(_InterlockedIncrement16)
@@ -6795,6 +6800,7 @@
 short     _InterlockedDecrement16(short volatile*);
 long      _InterlockedExchange(long volatile*,long);
 long      _InterlockedExchangeAdd(long volatile*,long);
+short     _InterlockedExchangeAdd16(short volatile*,short);
 void *    _InterlockedExchangePointer(void *volatile*,void*);
 long      _InterlockedIncrement(long volatile*);
 short     _InterlockedIncrement16(short volatile*);
@@ -7027,6 +7033,11 @@
     return __sync_fetch_and_add( dest, incr );
 }
 
+static FORCEINLINE short WINAPI InterlockedExchangeAdd16( short volatile *dest, short incr )
+{
+    return __sync_fetch_and_add( dest, incr );
+}
+
 static FORCEINLINE LONGLONG WINAPI InterlockedExchangeAdd64( LONGLONG volatile *dest, LONGLONG incr )
 {
     return __sync_fetch_and_add( dest, incr );
diff --git a/mingw-w64-tools/widl/src/parser.tab.c b/mingw-w64-tools/widl/src/parser.tab.c
index db44ac5..b453f4b 100644
--- a/mingw-w64-tools/widl/src/parser.tab.c
+++ b/mingw-w64-tools/widl/src/parser.tab.c
@@ -205,7 +205,333 @@
 #  endif
 # endif
 
-#include "parser.tab.h"
+
+/* Debug traces.  */
+#ifndef PARSER_DEBUG
+# if defined YYDEBUG
+#if YYDEBUG
+#   define PARSER_DEBUG 1
+#  else
+#   define PARSER_DEBUG 0
+#  endif
+# else /* ! defined YYDEBUG */
+#  define PARSER_DEBUG 0
+# endif /* ! defined YYDEBUG */
+#endif  /* ! defined PARSER_DEBUG */
+#if PARSER_DEBUG
+extern int parser_debug;
+#endif
+/* "%code requires" blocks.  */
+#line 110 "tools/widl/parser.y"
+
+
+#define PARSER_LTYPE struct location
+
+
+#line 232 "tools/widl/parser.tab.c"
+
+/* Token kinds.  */
+#ifndef PARSER_TOKENTYPE
+# define PARSER_TOKENTYPE
+  enum parser_tokentype
+  {
+    PARSER_EMPTY = -2,
+    PARSER_EOF = 0,                /* "end of file"  */
+    PARSER_error = 256,            /* error  */
+    PARSER_UNDEF = 257,            /* "invalid token"  */
+    aIDENTIFIER = 258,             /* aIDENTIFIER  */
+    aPRAGMA = 259,                 /* aPRAGMA  */
+    aKNOWNTYPE = 260,              /* aKNOWNTYPE  */
+    aNUM = 261,                    /* aNUM  */
+    aHEXNUM = 262,                 /* aHEXNUM  */
+    aDOUBLE = 263,                 /* aDOUBLE  */
+    aSTRING = 264,                 /* aSTRING  */
+    aWSTRING = 265,                /* aWSTRING  */
+    aSQSTRING = 266,               /* aSQSTRING  */
+    tCDECL = 267,                  /* tCDECL  */
+    tFASTCALL = 268,               /* tFASTCALL  */
+    tPASCAL = 269,                 /* tPASCAL  */
+    tSTDCALL = 270,                /* tSTDCALL  */
+    aUUID = 271,                   /* aUUID  */
+    aEOF = 272,                    /* aEOF  */
+    aACF = 273,                    /* aACF  */
+    SHL = 274,                     /* SHL  */
+    SHR = 275,                     /* SHR  */
+    MEMBERPTR = 276,               /* MEMBERPTR  */
+    EQUALITY = 277,                /* EQUALITY  */
+    INEQUALITY = 278,              /* INEQUALITY  */
+    GREATEREQUAL = 279,            /* GREATEREQUAL  */
+    LESSEQUAL = 280,               /* LESSEQUAL  */
+    LOGICALOR = 281,               /* LOGICALOR  */
+    LOGICALAND = 282,              /* LOGICALAND  */
+    ELLIPSIS = 283,                /* ELLIPSIS  */
+    tACTIVATABLE = 284,            /* tACTIVATABLE  */
+    tAGGREGATABLE = 285,           /* tAGGREGATABLE  */
+    tAGILE = 286,                  /* tAGILE  */
+    tALLNODES = 287,               /* tALLNODES  */
+    tALLOCATE = 288,               /* tALLOCATE  */
+    tANNOTATION = 289,             /* tANNOTATION  */
+    tAPICONTRACT = 290,            /* tAPICONTRACT  */
+    tAPPOBJECT = 291,              /* tAPPOBJECT  */
+    tASYNC = 292,                  /* tASYNC  */
+    tASYNCUUID = 293,              /* tASYNCUUID  */
+    tAUTOHANDLE = 294,             /* tAUTOHANDLE  */
+    tBINDABLE = 295,               /* tBINDABLE  */
+    tBOOLEAN = 296,                /* tBOOLEAN  */
+    tBROADCAST = 297,              /* tBROADCAST  */
+    tBYTE = 298,                   /* tBYTE  */
+    tBYTECOUNT = 299,              /* tBYTECOUNT  */
+    tCALLAS = 300,                 /* tCALLAS  */
+    tCALLBACK = 301,               /* tCALLBACK  */
+    tCASE = 302,                   /* tCASE  */
+    tCHAR = 303,                   /* tCHAR  */
+    tCOCLASS = 304,                /* tCOCLASS  */
+    tCODE = 305,                   /* tCODE  */
+    tCOMMSTATUS = 306,             /* tCOMMSTATUS  */
+    tCOMPOSABLE = 307,             /* tCOMPOSABLE  */
+    tCONST = 308,                  /* tCONST  */
+    tCONTEXTHANDLE = 309,          /* tCONTEXTHANDLE  */
+    tCONTEXTHANDLENOSERIALIZE = 310, /* tCONTEXTHANDLENOSERIALIZE  */
+    tCONTEXTHANDLESERIALIZE = 311, /* tCONTEXTHANDLESERIALIZE  */
+    tCONTRACT = 312,               /* tCONTRACT  */
+    tCONTRACTVERSION = 313,        /* tCONTRACTVERSION  */
+    tCONTROL = 314,                /* tCONTROL  */
+    tCPPQUOTE = 315,               /* tCPPQUOTE  */
+    tCUSTOM = 316,                 /* tCUSTOM  */
+    tDECLARE = 317,                /* tDECLARE  */
+    tDECODE = 318,                 /* tDECODE  */
+    tDEFAULT = 319,                /* tDEFAULT  */
+    tDEFAULTBIND = 320,            /* tDEFAULTBIND  */
+    tDELEGATE = 321,               /* tDELEGATE  */
+    tDEFAULT_OVERLOAD = 322,       /* tDEFAULT_OVERLOAD  */
+    tDEFAULTCOLLELEM = 323,        /* tDEFAULTCOLLELEM  */
+    tDEFAULTVALUE = 324,           /* tDEFAULTVALUE  */
+    tDEFAULTVTABLE = 325,          /* tDEFAULTVTABLE  */
+    tDEPRECATED = 326,             /* tDEPRECATED  */
+    tDISABLECONSISTENCYCHECK = 327, /* tDISABLECONSISTENCYCHECK  */
+    tDISPLAYBIND = 328,            /* tDISPLAYBIND  */
+    tDISPINTERFACE = 329,          /* tDISPINTERFACE  */
+    tDLLNAME = 330,                /* tDLLNAME  */
+    tDONTFREE = 331,               /* tDONTFREE  */
+    tDOUBLE = 332,                 /* tDOUBLE  */
+    tDUAL = 333,                   /* tDUAL  */
+    tENABLEALLOCATE = 334,         /* tENABLEALLOCATE  */
+    tENCODE = 335,                 /* tENCODE  */
+    tENDPOINT = 336,               /* tENDPOINT  */
+    tENTRY = 337,                  /* tENTRY  */
+    tENUM = 338,                   /* tENUM  */
+    tERRORSTATUST = 339,           /* tERRORSTATUST  */
+    tEVENTADD = 340,               /* tEVENTADD  */
+    tEVENTREMOVE = 341,            /* tEVENTREMOVE  */
+    tEXCLUSIVETO = 342,            /* tEXCLUSIVETO  */
+    tEXPLICITHANDLE = 343,         /* tEXPLICITHANDLE  */
+    tEXTERN = 344,                 /* tEXTERN  */
+    tFALSE = 345,                  /* tFALSE  */
+    tFAULTSTATUS = 346,            /* tFAULTSTATUS  */
+    tFLAGS = 347,                  /* tFLAGS  */
+    tFLOAT = 348,                  /* tFLOAT  */
+    tFORCEALLOCATE = 349,          /* tFORCEALLOCATE  */
+    tHANDLE = 350,                 /* tHANDLE  */
+    tHANDLET = 351,                /* tHANDLET  */
+    tHELPCONTEXT = 352,            /* tHELPCONTEXT  */
+    tHELPFILE = 353,               /* tHELPFILE  */
+    tHELPSTRING = 354,             /* tHELPSTRING  */
+    tHELPSTRINGCONTEXT = 355,      /* tHELPSTRINGCONTEXT  */
+    tHELPSTRINGDLL = 356,          /* tHELPSTRINGDLL  */
+    tHIDDEN = 357,                 /* tHIDDEN  */
+    tHYPER = 358,                  /* tHYPER  */
+    tID = 359,                     /* tID  */
+    tIDEMPOTENT = 360,             /* tIDEMPOTENT  */
+    tIGNORE = 361,                 /* tIGNORE  */
+    tIIDIS = 362,                  /* tIIDIS  */
+    tIMMEDIATEBIND = 363,          /* tIMMEDIATEBIND  */
+    tIMPLICITHANDLE = 364,         /* tIMPLICITHANDLE  */
+    tIMPORT = 365,                 /* tIMPORT  */
+    tIMPORTLIB = 366,              /* tIMPORTLIB  */
+    tIN = 367,                     /* tIN  */
+    tIN_LINE = 368,                /* tIN_LINE  */
+    tINLINE = 369,                 /* tINLINE  */
+    tINPUTSYNC = 370,              /* tINPUTSYNC  */
+    tINT = 371,                    /* tINT  */
+    tINT32 = 372,                  /* tINT32  */
+    tINT3264 = 373,                /* tINT3264  */
+    tINT64 = 374,                  /* tINT64  */
+    tINTERFACE = 375,              /* tINTERFACE  */
+    tLCID = 376,                   /* tLCID  */
+    tLENGTHIS = 377,               /* tLENGTHIS  */
+    tLIBRARY = 378,                /* tLIBRARY  */
+    tLICENSED = 379,               /* tLICENSED  */
+    tLOCAL = 380,                  /* tLOCAL  */
+    tLONG = 381,                   /* tLONG  */
+    tMARSHALINGBEHAVIOR = 382,     /* tMARSHALINGBEHAVIOR  */
+    tMAYBE = 383,                  /* tMAYBE  */
+    tMESSAGE = 384,                /* tMESSAGE  */
+    tMETHODS = 385,                /* tMETHODS  */
+    tMODULE = 386,                 /* tMODULE  */
+    tMTA = 387,                    /* tMTA  */
+    tNAMESPACE = 388,              /* tNAMESPACE  */
+    tNOCODE = 389,                 /* tNOCODE  */
+    tNONBROWSABLE = 390,           /* tNONBROWSABLE  */
+    tNONCREATABLE = 391,           /* tNONCREATABLE  */
+    tNONE = 392,                   /* tNONE  */
+    tNONEXTENSIBLE = 393,          /* tNONEXTENSIBLE  */
+    tNOTIFY = 394,                 /* tNOTIFY  */
+    tNOTIFYFLAG = 395,             /* tNOTIFYFLAG  */
+    tNULL = 396,                   /* tNULL  */
+    tOBJECT = 397,                 /* tOBJECT  */
+    tODL = 398,                    /* tODL  */
+    tOLEAUTOMATION = 399,          /* tOLEAUTOMATION  */
+    tOPTIMIZE = 400,               /* tOPTIMIZE  */
+    tOPTIONAL = 401,               /* tOPTIONAL  */
+    tOUT = 402,                    /* tOUT  */
+    tOVERLOAD = 403,               /* tOVERLOAD  */
+    tPARTIALIGNORE = 404,          /* tPARTIALIGNORE  */
+    tPOINTERDEFAULT = 405,         /* tPOINTERDEFAULT  */
+    tPRAGMA_WARNING = 406,         /* tPRAGMA_WARNING  */
+    tPROGID = 407,                 /* tPROGID  */
+    tPROPERTIES = 408,             /* tPROPERTIES  */
+    tPROPGET = 409,                /* tPROPGET  */
+    tPROPPUT = 410,                /* tPROPPUT  */
+    tPROPPUTREF = 411,             /* tPROPPUTREF  */
+    tPROTECTED = 412,              /* tPROTECTED  */
+    tPROXY = 413,                  /* tPROXY  */
+    tPTR = 414,                    /* tPTR  */
+    tPUBLIC = 415,                 /* tPUBLIC  */
+    tRANGE = 416,                  /* tRANGE  */
+    tREADONLY = 417,               /* tREADONLY  */
+    tREF = 418,                    /* tREF  */
+    tREGISTER = 419,               /* tREGISTER  */
+    tREPRESENTAS = 420,            /* tREPRESENTAS  */
+    tREQUESTEDIT = 421,            /* tREQUESTEDIT  */
+    tREQUIRES = 422,               /* tREQUIRES  */
+    tRESTRICTED = 423,             /* tRESTRICTED  */
+    tRETVAL = 424,                 /* tRETVAL  */
+    tRUNTIMECLASS = 425,           /* tRUNTIMECLASS  */
+    tSAFEARRAY = 426,              /* tSAFEARRAY  */
+    tSHORT = 427,                  /* tSHORT  */
+    tSIGNED = 428,                 /* tSIGNED  */
+    tSINGLENODE = 429,             /* tSINGLENODE  */
+    tSIZEIS = 430,                 /* tSIZEIS  */
+    tSIZEOF = 431,                 /* tSIZEOF  */
+    tSMALL = 432,                  /* tSMALL  */
+    tSOURCE = 433,                 /* tSOURCE  */
+    tSTANDARD = 434,               /* tSTANDARD  */
+    tSTATIC = 435,                 /* tSTATIC  */
+    tSTRICTCONTEXTHANDLE = 436,    /* tSTRICTCONTEXTHANDLE  */
+    tSTRING = 437,                 /* tSTRING  */
+    tSTRUCT = 438,                 /* tSTRUCT  */
+    tSWITCH = 439,                 /* tSWITCH  */
+    tSWITCHIS = 440,               /* tSWITCHIS  */
+    tSWITCHTYPE = 441,             /* tSWITCHTYPE  */
+    tTHREADING = 442,              /* tTHREADING  */
+    tTRANSMITAS = 443,             /* tTRANSMITAS  */
+    tTRUE = 444,                   /* tTRUE  */
+    tTYPEDEF = 445,                /* tTYPEDEF  */
+    tUIDEFAULT = 446,              /* tUIDEFAULT  */
+    tUNION = 447,                  /* tUNION  */
+    tUNIQUE = 448,                 /* tUNIQUE  */
+    tUNSIGNED = 449,               /* tUNSIGNED  */
+    tUSESGETLASTERROR = 450,       /* tUSESGETLASTERROR  */
+    tUSERMARSHAL = 451,            /* tUSERMARSHAL  */
+    tUUID = 452,                   /* tUUID  */
+    tV1ENUM = 453,                 /* tV1ENUM  */
+    tVARARG = 454,                 /* tVARARG  */
+    tVERSION = 455,                /* tVERSION  */
+    tVIPROGID = 456,               /* tVIPROGID  */
+    tVOID = 457,                   /* tVOID  */
+    tWCHAR = 458,                  /* tWCHAR  */
+    tWIREMARSHAL = 459,            /* tWIREMARSHAL  */
+    tAPARTMENT = 460,              /* tAPARTMENT  */
+    tNEUTRAL = 461,                /* tNEUTRAL  */
+    tSINGLE = 462,                 /* tSINGLE  */
+    tFREE = 463,                   /* tFREE  */
+    tBOTH = 464,                   /* tBOTH  */
+    CAST = 465,                    /* CAST  */
+    PPTR = 466,                    /* PPTR  */
+    POS = 467,                     /* POS  */
+    NEG = 468,                     /* NEG  */
+    ADDRESSOF = 469                /* ADDRESSOF  */
+  };
+  typedef enum parser_tokentype parser_token_kind_t;
+#endif
+
+/* Value type.  */
+#if ! defined PARSER_STYPE && ! defined PARSER_STYPE_IS_DECLARED
+union PARSER_STYPE
+{
+#line 134 "tools/widl/parser.y"
+
+	attr_t *attr;
+	attr_list_t *attr_list;
+	str_list_t *str_list;
+	expr_t *expr;
+	expr_list_t *expr_list;
+	type_t *type;
+	var_t *var;
+	var_list_t *var_list;
+	declarator_t *declarator;
+	declarator_list_t *declarator_list;
+	statement_t *statement;
+	statement_list_t *stmt_list;
+	warning_t *warning;
+	warning_list_t *warning_list;
+	typeref_t *typeref;
+	typeref_list_t *typeref_list;
+	char *str;
+	struct uuid *uuid;
+	unsigned int num;
+	double dbl;
+	typelib_t *typelib;
+	struct _import_t *import;
+	struct _decl_spec_t *declspec;
+	enum storage_class stgclass;
+	enum type_qualifier type_qualifier;
+	enum function_specifier function_specifier;
+	struct namespace *namespace;
+
+#line 493 "tools/widl/parser.tab.c"
+
+};
+typedef union PARSER_STYPE PARSER_STYPE;
+# define PARSER_STYPE_IS_TRIVIAL 1
+# define PARSER_STYPE_IS_DECLARED 1
+#endif
+
+/* Location type.  */
+#if ! defined PARSER_LTYPE && ! defined PARSER_LTYPE_IS_DECLARED
+typedef struct PARSER_LTYPE PARSER_LTYPE;
+struct PARSER_LTYPE
+{
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
+};
+# define PARSER_LTYPE_IS_DECLARED 1
+# define PARSER_LTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+
+int parser_parse (void);
+
+/* "%code provides" blocks.  */
+#line 117 "tools/widl/parser.y"
+
+
+int parser_lex( PARSER_STYPE *yylval, PARSER_LTYPE *yylloc );
+void push_import( const char *fname, PARSER_LTYPE *yylloc );
+void pop_import( PARSER_LTYPE *yylloc );
+
+# define YYLLOC_DEFAULT( cur, rhs, n ) \
+        do { if (n) init_location( &(cur), &YYRHSLOC( rhs, 1 ), &YYRHSLOC( rhs, n ) ); \
+             else init_location( &(cur), &YYRHSLOC( rhs, 0 ), NULL ); } while(0)
+
+
+#line 533 "tools/widl/parser.tab.c"
+
+
 /* Symbol kind.  */
 enum yysymbol_kind_t
 {
@@ -3256,13 +3582,13 @@
 						  write_dlldata((yyvsp[-1].stmt_list));
 						  write_local_stubs((yyvsp[-1].stmt_list));
 						}
-#line 3260 "tools/widl/parser.tab.c"
+#line 3586 "tools/widl/parser.tab.c"
     break;
 
   case 5: /* decl_statements: %empty  */
 #line 390 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3266 "tools/widl/parser.tab.c"
+#line 3592 "tools/widl/parser.tab.c"
     break;
 
   case 6: /* decl_statements: decl_statements tINTERFACE qualified_type '<' parameterized_type_args '>' ';'  */
@@ -3270,73 +3596,73 @@
                                                 { parameterized_type_stmts = append_statement(parameterized_type_stmts, make_statement_parameterized_type((yyvsp[-4].type), (yyvsp[-2].typeref_list)));
 						  (yyval.stmt_list) = append_statement((yyvsp[-6].stmt_list), make_statement_reference(type_parameterized_type_specialize_declare((yyvsp[-4].type), (yyvsp[-2].typeref_list))));
 						}
-#line 3274 "tools/widl/parser.tab.c"
+#line 3600 "tools/widl/parser.tab.c"
     break;
 
   case 7: /* decl_block: tDECLARE '{' decl_statements '}'  */
 #line 397 "tools/widl/parser.y"
                                              { (yyval.stmt_list) = (yyvsp[-1].stmt_list); }
-#line 3280 "tools/widl/parser.tab.c"
+#line 3606 "tools/widl/parser.tab.c"
     break;
 
   case 8: /* imp_decl_statements: %empty  */
 #line 401 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3286 "tools/widl/parser.tab.c"
+#line 3612 "tools/widl/parser.tab.c"
     break;
 
   case 9: /* imp_decl_statements: imp_decl_statements tINTERFACE qualified_type '<' parameterized_type_args '>' ';'  */
 #line 403 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-6].stmt_list), make_statement_reference(type_parameterized_type_specialize_declare((yyvsp[-4].type), (yyvsp[-2].typeref_list)))); }
-#line 3292 "tools/widl/parser.tab.c"
+#line 3618 "tools/widl/parser.tab.c"
     break;
 
   case 10: /* imp_decl_block: tDECLARE '{' imp_decl_statements '}'  */
 #line 407 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-1].stmt_list); }
-#line 3298 "tools/widl/parser.tab.c"
+#line 3624 "tools/widl/parser.tab.c"
     break;
 
   case 11: /* gbl_statements: %empty  */
 #line 411 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3304 "tools/widl/parser.tab.c"
+#line 3630 "tools/widl/parser.tab.c"
     break;
 
   case 12: /* $@1: %empty  */
 #line 412 "tools/widl/parser.y"
                                           { push_namespaces((yyvsp[-1].str_list)); }
-#line 3310 "tools/widl/parser.tab.c"
+#line 3636 "tools/widl/parser.tab.c"
     break;
 
   case 13: /* gbl_statements: gbl_statements namespacedef '{' $@1 gbl_statements '}'  */
 #line 413 "tools/widl/parser.y"
                                                 { pop_namespaces((yyvsp[-4].str_list)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
-#line 3316 "tools/widl/parser.tab.c"
+#line 3642 "tools/widl/parser.tab.c"
     break;
 
   case 14: /* gbl_statements: gbl_statements interface ';'  */
 #line 414 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
-#line 3322 "tools/widl/parser.tab.c"
+#line 3648 "tools/widl/parser.tab.c"
     break;
 
   case 15: /* gbl_statements: gbl_statements dispinterface ';'  */
 #line 415 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
-#line 3328 "tools/widl/parser.tab.c"
+#line 3654 "tools/widl/parser.tab.c"
     break;
 
   case 16: /* gbl_statements: gbl_statements interfacedef  */
 #line 416 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3334 "tools/widl/parser.tab.c"
+#line 3660 "tools/widl/parser.tab.c"
     break;
 
   case 17: /* gbl_statements: gbl_statements delegatedef  */
 #line 417 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3340 "tools/widl/parser.tab.c"
+#line 3666 "tools/widl/parser.tab.c"
     break;
 
   case 18: /* gbl_statements: gbl_statements coclass ';'  */
@@ -3344,7 +3670,7 @@
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list);
 						  reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0);
 						}
-#line 3348 "tools/widl/parser.tab.c"
+#line 3674 "tools/widl/parser.tab.c"
     break;
 
   case 19: /* gbl_statements: gbl_statements coclassdef  */
@@ -3352,105 +3678,105 @@
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
 						}
-#line 3356 "tools/widl/parser.tab.c"
+#line 3682 "tools/widl/parser.tab.c"
     break;
 
   case 20: /* gbl_statements: gbl_statements apicontract ';'  */
 #line 424 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3362 "tools/widl/parser.tab.c"
+#line 3688 "tools/widl/parser.tab.c"
     break;
 
   case 21: /* gbl_statements: gbl_statements apicontract_def  */
 #line 425 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
-#line 3369 "tools/widl/parser.tab.c"
+#line 3695 "tools/widl/parser.tab.c"
     break;
 
   case 22: /* gbl_statements: gbl_statements runtimeclass ';'  */
 #line 427 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3375 "tools/widl/parser.tab.c"
+#line 3701 "tools/widl/parser.tab.c"
     break;
 
   case 23: /* gbl_statements: gbl_statements runtimeclass_def  */
 #line 428 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 	                                          reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
-#line 3382 "tools/widl/parser.tab.c"
+#line 3708 "tools/widl/parser.tab.c"
     break;
 
   case 24: /* gbl_statements: gbl_statements moduledef  */
 #line 430 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
-#line 3388 "tools/widl/parser.tab.c"
+#line 3714 "tools/widl/parser.tab.c"
     break;
 
   case 25: /* gbl_statements: gbl_statements librarydef  */
 #line 431 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
-#line 3394 "tools/widl/parser.tab.c"
+#line 3720 "tools/widl/parser.tab.c"
     break;
 
   case 26: /* gbl_statements: gbl_statements statement  */
 #line 432 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3400 "tools/widl/parser.tab.c"
+#line 3726 "tools/widl/parser.tab.c"
     break;
 
   case 27: /* gbl_statements: gbl_statements decl_block  */
 #line 433 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statements((yyvsp[-1].stmt_list), (yyvsp[0].stmt_list)); }
-#line 3406 "tools/widl/parser.tab.c"
+#line 3732 "tools/widl/parser.tab.c"
     break;
 
   case 28: /* imp_statements: %empty  */
 #line 437 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3412 "tools/widl/parser.tab.c"
+#line 3738 "tools/widl/parser.tab.c"
     break;
 
   case 29: /* imp_statements: imp_statements interface ';'  */
 #line 438 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
-#line 3418 "tools/widl/parser.tab.c"
+#line 3744 "tools/widl/parser.tab.c"
     break;
 
   case 30: /* imp_statements: imp_statements dispinterface ';'  */
 #line 439 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-2].stmt_list), make_statement_reference((yyvsp[-1].type))); }
-#line 3424 "tools/widl/parser.tab.c"
+#line 3750 "tools/widl/parser.tab.c"
     break;
 
   case 31: /* $@2: %empty  */
 #line 440 "tools/widl/parser.y"
                                           { push_namespaces((yyvsp[-1].str_list)); }
-#line 3430 "tools/widl/parser.tab.c"
+#line 3756 "tools/widl/parser.tab.c"
     break;
 
   case 32: /* imp_statements: imp_statements namespacedef '{' $@2 imp_statements '}'  */
 #line 441 "tools/widl/parser.y"
                                                 { pop_namespaces((yyvsp[-4].str_list)); (yyval.stmt_list) = append_statements((yyvsp[-5].stmt_list), (yyvsp[-1].stmt_list)); }
-#line 3436 "tools/widl/parser.tab.c"
+#line 3762 "tools/widl/parser.tab.c"
     break;
 
   case 33: /* imp_statements: imp_statements interfacedef  */
 #line 442 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3442 "tools/widl/parser.tab.c"
+#line 3768 "tools/widl/parser.tab.c"
     break;
 
   case 34: /* imp_statements: imp_statements delegatedef  */
 #line 443 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type))); }
-#line 3448 "tools/widl/parser.tab.c"
+#line 3774 "tools/widl/parser.tab.c"
     break;
 
   case 35: /* imp_statements: imp_statements coclass ';'  */
 #line 444 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3454 "tools/widl/parser.tab.c"
+#line 3780 "tools/widl/parser.tab.c"
     break;
 
   case 36: /* imp_statements: imp_statements coclassdef  */
@@ -3458,117 +3784,117 @@
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0);
 						}
-#line 3462 "tools/widl/parser.tab.c"
+#line 3788 "tools/widl/parser.tab.c"
     break;
 
   case 37: /* imp_statements: imp_statements apicontract ';'  */
 #line 448 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3468 "tools/widl/parser.tab.c"
+#line 3794 "tools/widl/parser.tab.c"
     break;
 
   case 38: /* imp_statements: imp_statements apicontract_def  */
 #line 449 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 						  reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
-#line 3475 "tools/widl/parser.tab.c"
+#line 3801 "tools/widl/parser.tab.c"
     break;
 
   case 39: /* imp_statements: imp_statements runtimeclass ';'  */
 #line 451 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = (yyvsp[-2].stmt_list); reg_type((yyvsp[-1].type), (yyvsp[-1].type)->name, current_namespace, 0); }
-#line 3481 "tools/widl/parser.tab.c"
+#line 3807 "tools/widl/parser.tab.c"
     break;
 
   case 40: /* imp_statements: imp_statements runtimeclass_def  */
 #line 452 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_type_decl((yyvsp[0].type)));
 	                                          reg_type((yyvsp[0].type), (yyvsp[0].type)->name, current_namespace, 0); }
-#line 3488 "tools/widl/parser.tab.c"
+#line 3814 "tools/widl/parser.tab.c"
     break;
 
   case 41: /* imp_statements: imp_statements moduledef  */
 #line 454 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_module((yyvsp[0].type))); }
-#line 3494 "tools/widl/parser.tab.c"
+#line 3820 "tools/widl/parser.tab.c"
     break;
 
   case 42: /* imp_statements: imp_statements statement  */
 #line 455 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3500 "tools/widl/parser.tab.c"
+#line 3826 "tools/widl/parser.tab.c"
     break;
 
   case 43: /* imp_statements: imp_statements importlib  */
 #line 456 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_importlib((yyvsp[0].str))); }
-#line 3506 "tools/widl/parser.tab.c"
+#line 3832 "tools/widl/parser.tab.c"
     break;
 
   case 44: /* imp_statements: imp_statements librarydef  */
 #line 457 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), make_statement_library((yyvsp[0].typelib))); }
-#line 3512 "tools/widl/parser.tab.c"
+#line 3838 "tools/widl/parser.tab.c"
     break;
 
   case 45: /* imp_statements: imp_statements imp_decl_block  */
 #line 458 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statements((yyvsp[-1].stmt_list), (yyvsp[0].stmt_list)); }
-#line 3518 "tools/widl/parser.tab.c"
+#line 3844 "tools/widl/parser.tab.c"
     break;
 
   case 46: /* int_statements: %empty  */
 #line 462 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = NULL; }
-#line 3524 "tools/widl/parser.tab.c"
+#line 3850 "tools/widl/parser.tab.c"
     break;
 
   case 47: /* int_statements: int_statements statement  */
 #line 463 "tools/widl/parser.y"
                                                 { (yyval.stmt_list) = append_statement((yyvsp[-1].stmt_list), (yyvsp[0].statement)); }
-#line 3530 "tools/widl/parser.tab.c"
+#line 3856 "tools/widl/parser.tab.c"
     break;
 
   case 50: /* statement: cppquote  */
 #line 472 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_cppquote((yyvsp[0].str)); }
-#line 3536 "tools/widl/parser.tab.c"
+#line 3862 "tools/widl/parser.tab.c"
     break;
 
   case 51: /* statement: typedecl ';'  */
 #line 473 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_type_decl((yyvsp[-1].type)); }
-#line 3542 "tools/widl/parser.tab.c"
+#line 3868 "tools/widl/parser.tab.c"
     break;
 
   case 52: /* statement: declaration ';'  */
 #line 474 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_declaration((yyvsp[-1].var)); }
-#line 3548 "tools/widl/parser.tab.c"
+#line 3874 "tools/widl/parser.tab.c"
     break;
 
   case 53: /* statement: import  */
 #line 475 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_import((yyvsp[0].str)); }
-#line 3554 "tools/widl/parser.tab.c"
+#line 3880 "tools/widl/parser.tab.c"
     break;
 
   case 54: /* statement: typedef ';'  */
 #line 476 "tools/widl/parser.y"
                                                 { (yyval.statement) = (yyvsp[-1].statement); }
-#line 3560 "tools/widl/parser.tab.c"
+#line 3886 "tools/widl/parser.tab.c"
     break;
 
   case 55: /* statement: aPRAGMA  */
 #line 477 "tools/widl/parser.y"
                                                 { (yyval.statement) = make_statement_pragma((yyvsp[0].str)); }
-#line 3566 "tools/widl/parser.tab.c"
+#line 3892 "tools/widl/parser.tab.c"
     break;
 
   case 56: /* statement: pragma_warning  */
 #line 478 "tools/widl/parser.y"
                          { (yyval.statement) = NULL; }
-#line 3572 "tools/widl/parser.tab.c"
+#line 3898 "tools/widl/parser.tab.c"
     break;
 
   case 57: /* pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')'  */
@@ -3580,7 +3906,7 @@
                       if(!result)
                           error_loc("expected \"disable\", \"enable\" or \"default\"\n");
                   }
-#line 3584 "tools/widl/parser.tab.c"
+#line 3910 "tools/widl/parser.tab.c"
     break;
 
   case 58: /* pragma_warning: tPRAGMA_WARNING '(' tDEFAULT ':' warnings ')'  */
@@ -3589,85 +3915,85 @@
                       (yyval.statement) = NULL;
                       do_warning("default", (yyvsp[-1].warning_list));
                   }
-#line 3593 "tools/widl/parser.tab.c"
+#line 3919 "tools/widl/parser.tab.c"
     break;
 
   case 59: /* warnings: aNUM  */
 #line 497 "tools/widl/parser.y"
                { (yyval.warning_list) = append_warning(NULL, (yyvsp[0].num)); }
-#line 3599 "tools/widl/parser.tab.c"
+#line 3925 "tools/widl/parser.tab.c"
     break;
 
   case 60: /* warnings: warnings aNUM  */
 #line 498 "tools/widl/parser.y"
                         { (yyval.warning_list) = append_warning((yyvsp[-1].warning_list), (yyvsp[0].num)); }
-#line 3605 "tools/widl/parser.tab.c"
+#line 3931 "tools/widl/parser.tab.c"
     break;
 
   case 62: /* typedecl: tENUM aIDENTIFIER  */
 #line 503 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3611 "tools/widl/parser.tab.c"
+#line 3937 "tools/widl/parser.tab.c"
     break;
 
   case 64: /* typedecl: tSTRUCT aIDENTIFIER  */
 #line 505 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3617 "tools/widl/parser.tab.c"
+#line 3943 "tools/widl/parser.tab.c"
     break;
 
   case 66: /* typedecl: tUNION aIDENTIFIER  */
 #line 507 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 3623 "tools/widl/parser.tab.c"
+#line 3949 "tools/widl/parser.tab.c"
     break;
 
   case 67: /* typedecl: attributes enumdef  */
 #line 508 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_enum_attrs((yyvsp[-1].attr_list)); }
-#line 3629 "tools/widl/parser.tab.c"
+#line 3955 "tools/widl/parser.tab.c"
     break;
 
   case 68: /* typedecl: attributes structdef  */
 #line 509 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_struct_attrs((yyvsp[-1].attr_list)); }
-#line 3635 "tools/widl/parser.tab.c"
+#line 3961 "tools/widl/parser.tab.c"
     break;
 
   case 69: /* typedecl: attributes uniondef  */
 #line 510 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); (yyval.type)->attrs = check_union_attrs((yyvsp[-1].attr_list)); }
-#line 3641 "tools/widl/parser.tab.c"
+#line 3967 "tools/widl/parser.tab.c"
     break;
 
   case 70: /* cppquote: tCPPQUOTE '(' aSTRING ')'  */
 #line 513 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-1].str); }
-#line 3647 "tools/widl/parser.tab.c"
+#line 3973 "tools/widl/parser.tab.c"
     break;
 
   case 71: /* import_start: tIMPORT aSTRING ';'  */
 #line 516 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-1].str); push_import( (yyvsp[-1].str), &yylloc ); }
-#line 3653 "tools/widl/parser.tab.c"
+#line 3979 "tools/widl/parser.tab.c"
     break;
 
   case 72: /* import: import_start imp_statements aEOF  */
 #line 518 "tools/widl/parser.y"
                                                 { pop_import( &yylloc ); }
-#line 3659 "tools/widl/parser.tab.c"
+#line 3985 "tools/widl/parser.tab.c"
     break;
 
   case 73: /* importlib: tIMPORTLIB '(' aSTRING ')' semicolon_opt  */
 #line 522 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[-2].str); if(!parse_only) add_importlib((yyvsp[-2].str), current_typelib); }
-#line 3665 "tools/widl/parser.tab.c"
+#line 3991 "tools/widl/parser.tab.c"
     break;
 
   case 74: /* libraryhdr: tLIBRARY typename  */
 #line 525 "tools/widl/parser.y"
                                                 { (yyval.str) = (yyvsp[0].str); }
-#line 3671 "tools/widl/parser.tab.c"
+#line 3997 "tools/widl/parser.tab.c"
     break;
 
   case 75: /* library_start: attributes libraryhdr '{'  */
@@ -3675,37 +4001,37 @@
                                                 { (yyval.typelib) = make_library((yyvsp[-1].str), check_library_attrs((yyvsp[-1].str), (yyvsp[-2].attr_list)));
 						  if (!parse_only && do_typelib) current_typelib = (yyval.typelib);
 						}
-#line 3679 "tools/widl/parser.tab.c"
+#line 4005 "tools/widl/parser.tab.c"
     break;
 
   case 76: /* librarydef: library_start imp_statements '}' semicolon_opt  */
 #line 532 "tools/widl/parser.y"
                                                 { (yyval.typelib) = (yyvsp[-3].typelib); (yyval.typelib)->stmts = (yyvsp[-2].stmt_list); }
-#line 3685 "tools/widl/parser.tab.c"
+#line 4011 "tools/widl/parser.tab.c"
     break;
 
   case 77: /* m_args: %empty  */
 #line 536 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 3691 "tools/widl/parser.tab.c"
+#line 4017 "tools/widl/parser.tab.c"
     break;
 
   case 79: /* arg_list: arg  */
 #line 540 "tools/widl/parser.y"
                                                 { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( NULL, (yyvsp[0].var) ); }
-#line 3697 "tools/widl/parser.tab.c"
+#line 4023 "tools/widl/parser.tab.c"
     break;
 
   case 80: /* arg_list: arg_list ',' arg  */
 #line 541 "tools/widl/parser.y"
                                                 { check_arg_attrs((yyvsp[0].var)); (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) ); }
-#line 3703 "tools/widl/parser.tab.c"
+#line 4029 "tools/widl/parser.tab.c"
     break;
 
   case 82: /* args: arg_list ',' ELLIPSIS  */
 #line 545 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-2].var_list), make_var(xstrdup("...")) ); }
-#line 3709 "tools/widl/parser.tab.c"
+#line 4035 "tools/widl/parser.tab.c"
     break;
 
   case 83: /* arg: attributes decl_spec m_any_declarator  */
@@ -3715,7 +4041,7 @@
 						  (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
 						  free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
 						}
-#line 3719 "tools/widl/parser.tab.c"
+#line 4045 "tools/widl/parser.tab.c"
     break;
 
   case 84: /* arg: decl_spec m_any_declarator  */
@@ -3725,7 +4051,7 @@
 						  (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), TRUE);
 						  free((yyvsp[-1].declspec)); free((yyvsp[0].declarator));
 						}
-#line 3729 "tools/widl/parser.tab.c"
+#line 4055 "tools/widl/parser.tab.c"
     break;
 
   case 85: /* array: '[' expr ']'  */
@@ -3734,91 +4060,91 @@
 						  if (!(yyval.expr)->is_const || (yyval.expr)->cval <= 0)
 						      error_loc("array dimension is not a positive integer constant\n");
 						}
-#line 3738 "tools/widl/parser.tab.c"
+#line 4064 "tools/widl/parser.tab.c"
     break;
 
   case 86: /* array: '[' '*' ']'  */
 #line 565 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 3744 "tools/widl/parser.tab.c"
+#line 4070 "tools/widl/parser.tab.c"
     break;
 
   case 87: /* array: '[' ']'  */
 #line 566 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 3750 "tools/widl/parser.tab.c"
+#line 4076 "tools/widl/parser.tab.c"
     break;
 
   case 88: /* m_attributes: %empty  */
 #line 570 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = NULL; }
-#line 3756 "tools/widl/parser.tab.c"
+#line 4082 "tools/widl/parser.tab.c"
     break;
 
   case 90: /* attributes: '[' attrib_list ']'  */
 #line 575 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = (yyvsp[-1].attr_list); }
-#line 3762 "tools/widl/parser.tab.c"
+#line 4088 "tools/widl/parser.tab.c"
     break;
 
   case 91: /* attrib_list: attribute  */
 #line 578 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( NULL, (yyvsp[0].attr) ); }
-#line 3768 "tools/widl/parser.tab.c"
+#line 4094 "tools/widl/parser.tab.c"
     break;
 
   case 92: /* attrib_list: attrib_list ',' attribute  */
 #line 579 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( (yyvsp[-2].attr_list), (yyvsp[0].attr) ); }
-#line 3774 "tools/widl/parser.tab.c"
+#line 4100 "tools/widl/parser.tab.c"
     break;
 
   case 93: /* attrib_list: attrib_list ']' '[' attribute  */
 #line 580 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( (yyvsp[-3].attr_list), (yyvsp[0].attr) ); }
-#line 3780 "tools/widl/parser.tab.c"
+#line 4106 "tools/widl/parser.tab.c"
     break;
 
   case 94: /* str_list: aSTRING  */
 #line 583 "tools/widl/parser.y"
                                                 { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
-#line 3786 "tools/widl/parser.tab.c"
+#line 4112 "tools/widl/parser.tab.c"
     break;
 
   case 95: /* str_list: str_list ',' aSTRING  */
 #line 584 "tools/widl/parser.y"
                                                 { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
-#line 3792 "tools/widl/parser.tab.c"
+#line 4118 "tools/widl/parser.tab.c"
     break;
 
   case 96: /* marshaling_behavior: tAGILE  */
 #line 588 "tools/widl/parser.y"
                                                 { (yyval.num) = MARSHALING_AGILE; }
-#line 3798 "tools/widl/parser.tab.c"
+#line 4124 "tools/widl/parser.tab.c"
     break;
 
   case 97: /* marshaling_behavior: tNONE  */
 #line 589 "tools/widl/parser.y"
                                                 { (yyval.num) = MARSHALING_NONE; }
-#line 3804 "tools/widl/parser.tab.c"
+#line 4130 "tools/widl/parser.tab.c"
     break;
 
   case 98: /* marshaling_behavior: tSTANDARD  */
 #line 590 "tools/widl/parser.y"
                                                 { (yyval.num) = MARSHALING_STANDARD; }
-#line 3810 "tools/widl/parser.tab.c"
+#line 4136 "tools/widl/parser.tab.c"
     break;
 
   case 99: /* contract_ver: aNUM  */
 #line 594 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION(0, (yyvsp[0].num)); }
-#line 3816 "tools/widl/parser.tab.c"
+#line 4142 "tools/widl/parser.tab.c"
     break;
 
   case 100: /* contract_ver: aNUM '.' aNUM  */
 #line 595 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[0].num), (yyvsp[-2].num)); }
-#line 3822 "tools/widl/parser.tab.c"
+#line 4148 "tools/widl/parser.tab.c"
     break;
 
   case 101: /* contract_req: decl_spec ',' contract_ver  */
@@ -3828,7 +4154,7 @@
 						  (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num));
 						  (yyval.expr) = make_exprt(EXPR_GTREQL, declare_var(NULL, (yyvsp[-2].declspec), make_declarator(NULL), 0), (yyval.expr));
 						}
-#line 3832 "tools/widl/parser.tab.c"
+#line 4158 "tools/widl/parser.tab.c"
     break;
 
   case 102: /* static_attr: decl_spec ',' contract_req  */
@@ -3837,7 +4163,7 @@
 						      error_loc("type %s is not an interface\n", (yyvsp[-2].declspec)->type->name);
 						  (yyval.expr) = make_exprt(EXPR_MEMBER, declare_var(NULL, (yyvsp[-2].declspec), make_declarator(NULL), 0), (yyvsp[0].expr));
 						}
-#line 3841 "tools/widl/parser.tab.c"
+#line 4167 "tools/widl/parser.tab.c"
     break;
 
   case 103: /* activatable_attr: decl_spec ',' contract_req  */
@@ -3846,25 +4172,25 @@
 						      error_loc("type %s is not an interface\n", (yyvsp[-2].declspec)->type->name);
 						  (yyval.expr) = make_exprt(EXPR_MEMBER, declare_var(NULL, (yyvsp[-2].declspec), make_declarator(NULL), 0), (yyvsp[0].expr));
 						}
-#line 3850 "tools/widl/parser.tab.c"
+#line 4176 "tools/widl/parser.tab.c"
     break;
 
   case 104: /* activatable_attr: contract_req  */
 #line 618 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr); }
-#line 3856 "tools/widl/parser.tab.c"
+#line 4182 "tools/widl/parser.tab.c"
     break;
 
   case 105: /* access_attr: tPUBLIC  */
 #line 622 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PUBLIC, 0 ); }
-#line 3862 "tools/widl/parser.tab.c"
+#line 4188 "tools/widl/parser.tab.c"
     break;
 
   case 106: /* access_attr: tPROTECTED  */
 #line 623 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PROTECTED, 0 ); }
-#line 3868 "tools/widl/parser.tab.c"
+#line 4194 "tools/widl/parser.tab.c"
     break;
 
   case 107: /* composable_attr: decl_spec ',' access_attr ',' contract_req  */
@@ -3873,133 +4199,133 @@
                                                       error_loc( "type %s is not an interface\n", (yyvsp[-4].declspec)->type->name );
                                                   (yyval.expr) = make_exprt( EXPR_MEMBER, declare_var( append_attr( NULL, (yyvsp[-2].attr) ), (yyvsp[-4].declspec), make_declarator( NULL ), 0 ), (yyvsp[0].expr) );
                                                 }
-#line 3877 "tools/widl/parser.tab.c"
+#line 4203 "tools/widl/parser.tab.c"
     break;
 
   case 108: /* deprecated_attr: aSTRING ',' aIDENTIFIER ',' contract_req  */
 #line 636 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr3( EXPR_MEMBER, make_exprs( EXPR_STRLIT, (yyvsp[-4].str) ), make_exprs( EXPR_IDENTIFIER, (yyvsp[-2].str) ), (yyvsp[0].expr) ); }
-#line 3883 "tools/widl/parser.tab.c"
+#line 4209 "tools/widl/parser.tab.c"
     break;
 
   case 109: /* attribute: %empty  */
 #line 640 "tools/widl/parser.y"
                                                 { (yyval.attr) = NULL; }
-#line 3889 "tools/widl/parser.tab.c"
+#line 4215 "tools/widl/parser.tab.c"
     break;
 
   case 110: /* attribute: tACTIVATABLE '(' activatable_attr ')'  */
 #line 641 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_ACTIVATABLE, (yyvsp[-1].expr) ); }
-#line 3895 "tools/widl/parser.tab.c"
+#line 4221 "tools/widl/parser.tab.c"
     break;
 
   case 111: /* attribute: tAGGREGATABLE  */
 #line 642 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_AGGREGATABLE, 0 ); }
-#line 3901 "tools/widl/parser.tab.c"
+#line 4227 "tools/widl/parser.tab.c"
     break;
 
   case 112: /* attribute: tANNOTATION '(' aSTRING ')'  */
 #line 643 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_ANNOTATION, (yyvsp[-1].str) ); }
-#line 3907 "tools/widl/parser.tab.c"
+#line 4233 "tools/widl/parser.tab.c"
     break;
 
   case 113: /* attribute: tAPPOBJECT  */
 #line 644 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_APPOBJECT, 0 ); }
-#line 3913 "tools/widl/parser.tab.c"
+#line 4239 "tools/widl/parser.tab.c"
     break;
 
   case 114: /* attribute: tASYNC  */
 #line 645 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_ASYNC, 0 ); }
-#line 3919 "tools/widl/parser.tab.c"
+#line 4245 "tools/widl/parser.tab.c"
     break;
 
   case 115: /* attribute: tAUTOHANDLE  */
 #line 646 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_AUTO_HANDLE, 0 ); }
-#line 3925 "tools/widl/parser.tab.c"
+#line 4251 "tools/widl/parser.tab.c"
     break;
 
   case 116: /* attribute: tBINDABLE  */
 #line 647 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_BINDABLE, 0 ); }
-#line 3931 "tools/widl/parser.tab.c"
+#line 4257 "tools/widl/parser.tab.c"
     break;
 
   case 117: /* attribute: tBROADCAST  */
 #line 648 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_BROADCAST, 0 ); }
-#line 3937 "tools/widl/parser.tab.c"
+#line 4263 "tools/widl/parser.tab.c"
     break;
 
   case 118: /* attribute: tCALLAS '(' ident ')'  */
 #line 649 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_CALLAS, (yyvsp[-1].var) ); }
-#line 3943 "tools/widl/parser.tab.c"
+#line 4269 "tools/widl/parser.tab.c"
     break;
 
   case 119: /* attribute: tCASE '(' expr_list_int_const ')'  */
 #line 650 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_CASE, (yyvsp[-1].expr_list) ); }
-#line 3949 "tools/widl/parser.tab.c"
+#line 4275 "tools/widl/parser.tab.c"
     break;
 
   case 120: /* attribute: tCODE  */
 #line 651 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_CODE, 0 ); }
-#line 3955 "tools/widl/parser.tab.c"
+#line 4281 "tools/widl/parser.tab.c"
     break;
 
   case 121: /* attribute: tCOMPOSABLE '(' composable_attr ')'  */
 #line 652 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_COMPOSABLE, (yyvsp[-1].expr) ); }
-#line 3961 "tools/widl/parser.tab.c"
+#line 4287 "tools/widl/parser.tab.c"
     break;
 
   case 122: /* attribute: tCOMMSTATUS  */
 #line 653 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_COMMSTATUS, 0 ); }
-#line 3967 "tools/widl/parser.tab.c"
+#line 4293 "tools/widl/parser.tab.c"
     break;
 
   case 123: /* attribute: tCONTEXTHANDLE  */
 #line 654 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_CONTEXTHANDLE, 0 ); }
-#line 3973 "tools/widl/parser.tab.c"
+#line 4299 "tools/widl/parser.tab.c"
     break;
 
   case 124: /* attribute: tCONTEXTHANDLENOSERIALIZE  */
 #line 655 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_CONTEXTHANDLE, 0 ); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
-#line 3979 "tools/widl/parser.tab.c"
+#line 4305 "tools/widl/parser.tab.c"
     break;
 
   case 125: /* attribute: tCONTEXTHANDLESERIALIZE  */
 #line 656 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_CONTEXTHANDLE, 0 ); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
-#line 3985 "tools/widl/parser.tab.c"
+#line 4311 "tools/widl/parser.tab.c"
     break;
 
   case 126: /* attribute: tCONTRACT '(' contract_req ')'  */
 #line 657 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_CONTRACT, (yyvsp[-1].expr) ); }
-#line 3991 "tools/widl/parser.tab.c"
+#line 4317 "tools/widl/parser.tab.c"
     break;
 
   case 127: /* attribute: tCONTRACTVERSION '(' contract_ver ')'  */
 #line 658 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_CONTRACTVERSION, (yyvsp[-1].num) ); }
-#line 3997 "tools/widl/parser.tab.c"
+#line 4323 "tools/widl/parser.tab.c"
     break;
 
   case 128: /* attribute: tCONTROL  */
 #line 659 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_CONTROL, 0 ); }
-#line 4003 "tools/widl/parser.tab.c"
+#line 4329 "tools/widl/parser.tab.c"
     break;
 
   case 129: /* attribute: tCUSTOM '(' aUUID ',' expr_const ')'  */
@@ -4008,115 +4334,115 @@
                                                   data->id = *(yyvsp[-3].uuid); data->pval = (yyvsp[-1].expr);
                                                   (yyval.attr) = attr_ptr( (yyloc), ATTR_CUSTOM, data );
                                                 }
-#line 4012 "tools/widl/parser.tab.c"
+#line 4338 "tools/widl/parser.tab.c"
     break;
 
   case 130: /* attribute: tDECODE  */
 #line 664 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DECODE, 0 ); }
-#line 4018 "tools/widl/parser.tab.c"
+#line 4344 "tools/widl/parser.tab.c"
     break;
 
   case 131: /* attribute: tDEFAULT  */
 #line 665 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DEFAULT, 0 ); }
-#line 4024 "tools/widl/parser.tab.c"
+#line 4350 "tools/widl/parser.tab.c"
     break;
 
   case 132: /* attribute: tDEFAULT_OVERLOAD  */
 #line 666 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DEFAULT_OVERLOAD, 0 ); }
-#line 4030 "tools/widl/parser.tab.c"
+#line 4356 "tools/widl/parser.tab.c"
     break;
 
   case 133: /* attribute: tDEFAULTBIND  */
 #line 667 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DEFAULTBIND, 0 ); }
-#line 4036 "tools/widl/parser.tab.c"
+#line 4362 "tools/widl/parser.tab.c"
     break;
 
   case 134: /* attribute: tDEFAULTCOLLELEM  */
 #line 668 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DEFAULTCOLLELEM, 0 ); }
-#line 4042 "tools/widl/parser.tab.c"
+#line 4368 "tools/widl/parser.tab.c"
     break;
 
   case 135: /* attribute: tDEFAULTVALUE '(' expr_const ')'  */
 #line 669 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_DEFAULTVALUE, (yyvsp[-1].expr) ); }
-#line 4048 "tools/widl/parser.tab.c"
+#line 4374 "tools/widl/parser.tab.c"
     break;
 
   case 136: /* attribute: tDEFAULTVTABLE  */
 #line 670 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DEFAULTVTABLE, 0 ); }
-#line 4054 "tools/widl/parser.tab.c"
+#line 4380 "tools/widl/parser.tab.c"
     break;
 
   case 137: /* attribute: tDEPRECATED '(' deprecated_attr ')'  */
 #line 671 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_DEPRECATED, (yyvsp[-1].expr) ); }
-#line 4060 "tools/widl/parser.tab.c"
+#line 4386 "tools/widl/parser.tab.c"
     break;
 
   case 138: /* attribute: tDISABLECONSISTENCYCHECK  */
 #line 672 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DISABLECONSISTENCYCHECK, 0 ); }
-#line 4066 "tools/widl/parser.tab.c"
+#line 4392 "tools/widl/parser.tab.c"
     break;
 
   case 139: /* attribute: tDISPLAYBIND  */
 #line 673 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DISPLAYBIND, 0 ); }
-#line 4072 "tools/widl/parser.tab.c"
+#line 4398 "tools/widl/parser.tab.c"
     break;
 
   case 140: /* attribute: tDLLNAME '(' aSTRING ')'  */
 #line 674 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_DLLNAME, (yyvsp[-1].str) ); }
-#line 4078 "tools/widl/parser.tab.c"
+#line 4404 "tools/widl/parser.tab.c"
     break;
 
   case 141: /* attribute: tDUAL  */
 #line 675 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DUAL, 0 ); }
-#line 4084 "tools/widl/parser.tab.c"
+#line 4410 "tools/widl/parser.tab.c"
     break;
 
   case 142: /* attribute: tENABLEALLOCATE  */
 #line 676 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_ENABLEALLOCATE, 0 ); }
-#line 4090 "tools/widl/parser.tab.c"
+#line 4416 "tools/widl/parser.tab.c"
     break;
 
   case 143: /* attribute: tENCODE  */
 #line 677 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_ENCODE, 0 ); }
-#line 4096 "tools/widl/parser.tab.c"
+#line 4422 "tools/widl/parser.tab.c"
     break;
 
   case 144: /* attribute: tENDPOINT '(' str_list ')'  */
 #line 678 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_ENDPOINT, (yyvsp[-1].str_list) ); }
-#line 4102 "tools/widl/parser.tab.c"
+#line 4428 "tools/widl/parser.tab.c"
     break;
 
   case 145: /* attribute: tENTRY '(' expr_const ')'  */
 #line 679 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_ENTRY, (yyvsp[-1].expr) ); }
-#line 4108 "tools/widl/parser.tab.c"
+#line 4434 "tools/widl/parser.tab.c"
     break;
 
   case 146: /* attribute: tEVENTADD  */
 #line 680 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_EVENTADD, 0 ); }
-#line 4114 "tools/widl/parser.tab.c"
+#line 4440 "tools/widl/parser.tab.c"
     break;
 
   case 147: /* attribute: tEVENTREMOVE  */
 #line 681 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_EVENTREMOVE, 0 ); }
-#line 4120 "tools/widl/parser.tab.c"
+#line 4446 "tools/widl/parser.tab.c"
     break;
 
   case 148: /* attribute: tEXCLUSIVETO '(' decl_spec ')'  */
@@ -4125,301 +4451,301 @@
                                                       error_loc( "type %s is not a runtimeclass\n", (yyvsp[-1].declspec)->type->name );
                                                   (yyval.attr) = attr_ptr( (yyloc), ATTR_EXCLUSIVETO, (yyvsp[-1].declspec)->type );
                                                 }
-#line 4129 "tools/widl/parser.tab.c"
+#line 4455 "tools/widl/parser.tab.c"
     break;
 
   case 149: /* attribute: tEXPLICITHANDLE  */
 #line 686 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_EXPLICIT_HANDLE, 0 ); }
-#line 4135 "tools/widl/parser.tab.c"
+#line 4461 "tools/widl/parser.tab.c"
     break;
 
   case 150: /* attribute: tFAULTSTATUS  */
 #line 687 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_FAULTSTATUS, 0 ); }
-#line 4141 "tools/widl/parser.tab.c"
+#line 4467 "tools/widl/parser.tab.c"
     break;
 
   case 151: /* attribute: tFLAGS  */
 #line 688 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_FLAGS, 0 ); }
-#line 4147 "tools/widl/parser.tab.c"
+#line 4473 "tools/widl/parser.tab.c"
     break;
 
   case 152: /* attribute: tFORCEALLOCATE  */
 #line 689 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_FORCEALLOCATE, 0 ); }
-#line 4153 "tools/widl/parser.tab.c"
+#line 4479 "tools/widl/parser.tab.c"
     break;
 
   case 153: /* attribute: tHANDLE  */
 #line 690 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_HANDLE, 0 ); }
-#line 4159 "tools/widl/parser.tab.c"
+#line 4485 "tools/widl/parser.tab.c"
     break;
 
   case 154: /* attribute: tHELPCONTEXT '(' expr_int_const ')'  */
 #line 691 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_HELPCONTEXT, (yyvsp[-1].expr) ); }
-#line 4165 "tools/widl/parser.tab.c"
+#line 4491 "tools/widl/parser.tab.c"
     break;
 
   case 155: /* attribute: tHELPFILE '(' aSTRING ')'  */
 #line 692 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_HELPFILE, (yyvsp[-1].str) ); }
-#line 4171 "tools/widl/parser.tab.c"
+#line 4497 "tools/widl/parser.tab.c"
     break;
 
   case 156: /* attribute: tHELPSTRING '(' aSTRING ')'  */
 #line 693 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_HELPSTRING, (yyvsp[-1].str) ); }
-#line 4177 "tools/widl/parser.tab.c"
+#line 4503 "tools/widl/parser.tab.c"
     break;
 
   case 157: /* attribute: tHELPSTRINGCONTEXT '(' expr_int_const ')'  */
 #line 695 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_HELPSTRINGCONTEXT, (yyvsp[-1].expr) ); }
-#line 4183 "tools/widl/parser.tab.c"
+#line 4509 "tools/widl/parser.tab.c"
     break;
 
   case 158: /* attribute: tHELPSTRINGDLL '(' aSTRING ')'  */
 #line 696 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_HELPSTRINGDLL, (yyvsp[-1].str) ); }
-#line 4189 "tools/widl/parser.tab.c"
+#line 4515 "tools/widl/parser.tab.c"
     break;
 
   case 159: /* attribute: tHIDDEN  */
 #line 697 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_HIDDEN, 0 ); }
-#line 4195 "tools/widl/parser.tab.c"
+#line 4521 "tools/widl/parser.tab.c"
     break;
 
   case 160: /* attribute: tID '(' expr_int_const ')'  */
 #line 698 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_ID, (yyvsp[-1].expr) ); }
-#line 4201 "tools/widl/parser.tab.c"
+#line 4527 "tools/widl/parser.tab.c"
     break;
 
   case 161: /* attribute: tIDEMPOTENT  */
 #line 699 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_IDEMPOTENT, 0 ); }
-#line 4207 "tools/widl/parser.tab.c"
+#line 4533 "tools/widl/parser.tab.c"
     break;
 
   case 162: /* attribute: tIGNORE  */
 #line 700 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_IGNORE, 0 ); }
-#line 4213 "tools/widl/parser.tab.c"
+#line 4539 "tools/widl/parser.tab.c"
     break;
 
   case 163: /* attribute: tIIDIS '(' expr ')'  */
 #line 701 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_IIDIS, (yyvsp[-1].expr) ); }
-#line 4219 "tools/widl/parser.tab.c"
+#line 4545 "tools/widl/parser.tab.c"
     break;
 
   case 164: /* attribute: tIMMEDIATEBIND  */
 #line 702 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_IMMEDIATEBIND, 0 ); }
-#line 4225 "tools/widl/parser.tab.c"
+#line 4551 "tools/widl/parser.tab.c"
     break;
 
   case 165: /* attribute: tIMPLICITHANDLE '(' arg ')'  */
 #line 703 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_IMPLICIT_HANDLE, (yyvsp[-1].var) ); }
-#line 4231 "tools/widl/parser.tab.c"
+#line 4557 "tools/widl/parser.tab.c"
     break;
 
   case 166: /* attribute: tIN  */
 #line 704 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_IN, 0 ); }
-#line 4237 "tools/widl/parser.tab.c"
+#line 4563 "tools/widl/parser.tab.c"
     break;
 
   case 167: /* attribute: tINPUTSYNC  */
 #line 705 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_INPUTSYNC, 0 ); }
-#line 4243 "tools/widl/parser.tab.c"
+#line 4569 "tools/widl/parser.tab.c"
     break;
 
   case 168: /* attribute: tLENGTHIS '(' m_exprs ')'  */
 #line 706 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_LENGTHIS, (yyvsp[-1].expr_list) ); }
-#line 4249 "tools/widl/parser.tab.c"
+#line 4575 "tools/widl/parser.tab.c"
     break;
 
   case 169: /* attribute: tLCID '(' expr_int_const ')'  */
 #line 707 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_LIBLCID, (yyvsp[-1].expr) ); }
-#line 4255 "tools/widl/parser.tab.c"
+#line 4581 "tools/widl/parser.tab.c"
     break;
 
   case 170: /* attribute: tLCID  */
 #line 708 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PARAMLCID, 0 ); }
-#line 4261 "tools/widl/parser.tab.c"
+#line 4587 "tools/widl/parser.tab.c"
     break;
 
   case 171: /* attribute: tLICENSED  */
 #line 709 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_LICENSED, 0 ); }
-#line 4267 "tools/widl/parser.tab.c"
+#line 4593 "tools/widl/parser.tab.c"
     break;
 
   case 172: /* attribute: tLOCAL  */
 #line 710 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_LOCAL, 0 ); }
-#line 4273 "tools/widl/parser.tab.c"
+#line 4599 "tools/widl/parser.tab.c"
     break;
 
   case 173: /* attribute: tMARSHALINGBEHAVIOR '(' marshaling_behavior ')'  */
 #line 712 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_MARSHALING_BEHAVIOR, (yyvsp[-1].num) ); }
-#line 4279 "tools/widl/parser.tab.c"
+#line 4605 "tools/widl/parser.tab.c"
     break;
 
   case 174: /* attribute: tMAYBE  */
 #line 713 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_MAYBE, 0 ); }
-#line 4285 "tools/widl/parser.tab.c"
+#line 4611 "tools/widl/parser.tab.c"
     break;
 
   case 175: /* attribute: tMESSAGE  */
 #line 714 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_MESSAGE, 0 ); }
-#line 4291 "tools/widl/parser.tab.c"
+#line 4617 "tools/widl/parser.tab.c"
     break;
 
   case 176: /* attribute: tNOCODE  */
 #line 715 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_NOCODE, 0 ); }
-#line 4297 "tools/widl/parser.tab.c"
+#line 4623 "tools/widl/parser.tab.c"
     break;
 
   case 177: /* attribute: tNONBROWSABLE  */
 #line 716 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_NONBROWSABLE, 0 ); }
-#line 4303 "tools/widl/parser.tab.c"
+#line 4629 "tools/widl/parser.tab.c"
     break;
 
   case 178: /* attribute: tNONCREATABLE  */
 #line 717 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_NONCREATABLE, 0 ); }
-#line 4309 "tools/widl/parser.tab.c"
+#line 4635 "tools/widl/parser.tab.c"
     break;
 
   case 179: /* attribute: tNONEXTENSIBLE  */
 #line 718 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_NONEXTENSIBLE, 0 ); }
-#line 4315 "tools/widl/parser.tab.c"
+#line 4641 "tools/widl/parser.tab.c"
     break;
 
   case 180: /* attribute: tNOTIFY  */
 #line 719 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_NOTIFY, 0 ); }
-#line 4321 "tools/widl/parser.tab.c"
+#line 4647 "tools/widl/parser.tab.c"
     break;
 
   case 181: /* attribute: tNOTIFYFLAG  */
 #line 720 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_NOTIFYFLAG, 0 ); }
-#line 4327 "tools/widl/parser.tab.c"
+#line 4653 "tools/widl/parser.tab.c"
     break;
 
   case 182: /* attribute: tOBJECT  */
 #line 721 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_OBJECT, 0 ); }
-#line 4333 "tools/widl/parser.tab.c"
+#line 4659 "tools/widl/parser.tab.c"
     break;
 
   case 183: /* attribute: tODL  */
 #line 722 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_ODL, 0 ); }
-#line 4339 "tools/widl/parser.tab.c"
+#line 4665 "tools/widl/parser.tab.c"
     break;
 
   case 184: /* attribute: tOLEAUTOMATION  */
 #line 723 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_OLEAUTOMATION, 0 ); }
-#line 4345 "tools/widl/parser.tab.c"
+#line 4671 "tools/widl/parser.tab.c"
     break;
 
   case 185: /* attribute: tOPTIMIZE '(' aSTRING ')'  */
 #line 724 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_OPTIMIZE, (yyvsp[-1].str) ); }
-#line 4351 "tools/widl/parser.tab.c"
+#line 4677 "tools/widl/parser.tab.c"
     break;
 
   case 186: /* attribute: tOPTIONAL  */
 #line 725 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_OPTIONAL, 0 ); }
-#line 4357 "tools/widl/parser.tab.c"
+#line 4683 "tools/widl/parser.tab.c"
     break;
 
   case 187: /* attribute: tOUT  */
 #line 726 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_OUT, 0 ); }
-#line 4363 "tools/widl/parser.tab.c"
+#line 4689 "tools/widl/parser.tab.c"
     break;
 
   case 188: /* attribute: tOVERLOAD '(' aSTRING ')'  */
 #line 727 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_OVERLOAD, (yyvsp[-1].str) ); }
-#line 4369 "tools/widl/parser.tab.c"
+#line 4695 "tools/widl/parser.tab.c"
     break;
 
   case 189: /* attribute: tPARTIALIGNORE  */
 #line 728 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PARTIALIGNORE, 0 ); }
-#line 4375 "tools/widl/parser.tab.c"
+#line 4701 "tools/widl/parser.tab.c"
     break;
 
   case 190: /* attribute: tPOINTERDEFAULT '(' pointer_type ')'  */
 #line 729 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_POINTERDEFAULT, (yyvsp[-1].num) ); }
-#line 4381 "tools/widl/parser.tab.c"
+#line 4707 "tools/widl/parser.tab.c"
     break;
 
   case 191: /* attribute: tPROGID '(' aSTRING ')'  */
 #line 730 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_PROGID, (yyvsp[-1].str) ); }
-#line 4387 "tools/widl/parser.tab.c"
+#line 4713 "tools/widl/parser.tab.c"
     break;
 
   case 192: /* attribute: tPROPGET  */
 #line 731 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PROPGET, 0 ); }
-#line 4393 "tools/widl/parser.tab.c"
+#line 4719 "tools/widl/parser.tab.c"
     break;
 
   case 193: /* attribute: tPROPPUT  */
 #line 732 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PROPPUT, 0 ); }
-#line 4399 "tools/widl/parser.tab.c"
+#line 4725 "tools/widl/parser.tab.c"
     break;
 
   case 194: /* attribute: tPROPPUTREF  */
 #line 733 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PROPPUTREF, 0 ); }
-#line 4405 "tools/widl/parser.tab.c"
+#line 4731 "tools/widl/parser.tab.c"
     break;
 
   case 195: /* attribute: tPROTECTED  */
 #line 734 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PROTECTED, 0 ); }
-#line 4411 "tools/widl/parser.tab.c"
+#line 4737 "tools/widl/parser.tab.c"
     break;
 
   case 196: /* attribute: tPROXY  */
 #line 735 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PROXY, 0 ); }
-#line 4417 "tools/widl/parser.tab.c"
+#line 4743 "tools/widl/parser.tab.c"
     break;
 
   case 197: /* attribute: tPUBLIC  */
 #line 736 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_PUBLIC, 0 ); }
-#line 4423 "tools/widl/parser.tab.c"
+#line 4749 "tools/widl/parser.tab.c"
     break;
 
   case 198: /* attribute: tRANGE '(' expr_int_const ',' expr_int_const ')'  */
@@ -4428,169 +4754,169 @@
                                                   list = append_expr( list, (yyvsp[-1].expr) );
                                                   (yyval.attr) = attr_ptr( (yyloc), ATTR_RANGE, list );
                                                 }
-#line 4432 "tools/widl/parser.tab.c"
+#line 4758 "tools/widl/parser.tab.c"
     break;
 
   case 199: /* attribute: tREADONLY  */
 #line 742 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_READONLY, 0 ); }
-#line 4438 "tools/widl/parser.tab.c"
+#line 4764 "tools/widl/parser.tab.c"
     break;
 
   case 200: /* attribute: tREPRESENTAS '(' type ')'  */
 #line 743 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_REPRESENTAS, (yyvsp[-1].type) ); }
-#line 4444 "tools/widl/parser.tab.c"
+#line 4770 "tools/widl/parser.tab.c"
     break;
 
   case 201: /* attribute: tREQUESTEDIT  */
 #line 744 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_REQUESTEDIT, 0 ); }
-#line 4450 "tools/widl/parser.tab.c"
+#line 4776 "tools/widl/parser.tab.c"
     break;
 
   case 202: /* attribute: tRESTRICTED  */
 #line 745 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_RESTRICTED, 0 ); }
-#line 4456 "tools/widl/parser.tab.c"
+#line 4782 "tools/widl/parser.tab.c"
     break;
 
   case 203: /* attribute: tRETVAL  */
 #line 746 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_RETVAL, 0 ); }
-#line 4462 "tools/widl/parser.tab.c"
+#line 4788 "tools/widl/parser.tab.c"
     break;
 
   case 204: /* attribute: tSIZEIS '(' m_exprs ')'  */
 #line 747 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_SIZEIS, (yyvsp[-1].expr_list) ); }
-#line 4468 "tools/widl/parser.tab.c"
+#line 4794 "tools/widl/parser.tab.c"
     break;
 
   case 205: /* attribute: tSOURCE  */
 #line 748 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_SOURCE, 0 ); }
-#line 4474 "tools/widl/parser.tab.c"
+#line 4800 "tools/widl/parser.tab.c"
     break;
 
   case 206: /* attribute: tSTATIC '(' static_attr ')'  */
 #line 749 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_STATIC, (yyvsp[-1].expr) ); }
-#line 4480 "tools/widl/parser.tab.c"
+#line 4806 "tools/widl/parser.tab.c"
     break;
 
   case 207: /* attribute: tSTRICTCONTEXTHANDLE  */
 #line 750 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_STRICTCONTEXTHANDLE, 0 ); }
-#line 4486 "tools/widl/parser.tab.c"
+#line 4812 "tools/widl/parser.tab.c"
     break;
 
   case 208: /* attribute: tSTRING  */
 #line 751 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_STRING, 0 ); }
-#line 4492 "tools/widl/parser.tab.c"
+#line 4818 "tools/widl/parser.tab.c"
     break;
 
   case 209: /* attribute: tSWITCHIS '(' expr ')'  */
 #line 752 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_SWITCHIS, (yyvsp[-1].expr) ); }
-#line 4498 "tools/widl/parser.tab.c"
+#line 4824 "tools/widl/parser.tab.c"
     break;
 
   case 210: /* attribute: tSWITCHTYPE '(' type ')'  */
 #line 753 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_SWITCHTYPE, (yyvsp[-1].type) ); }
-#line 4504 "tools/widl/parser.tab.c"
+#line 4830 "tools/widl/parser.tab.c"
     break;
 
   case 211: /* attribute: tTRANSMITAS '(' type ')'  */
 #line 754 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_TRANSMITAS, (yyvsp[-1].type) ); }
-#line 4510 "tools/widl/parser.tab.c"
+#line 4836 "tools/widl/parser.tab.c"
     break;
 
   case 212: /* attribute: tTHREADING '(' threading_type ')'  */
 #line 755 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_THREADING, (yyvsp[-1].num) ); }
-#line 4516 "tools/widl/parser.tab.c"
+#line 4842 "tools/widl/parser.tab.c"
     break;
 
   case 213: /* attribute: tUIDEFAULT  */
 #line 756 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_UIDEFAULT, 0 ); }
-#line 4522 "tools/widl/parser.tab.c"
+#line 4848 "tools/widl/parser.tab.c"
     break;
 
   case 214: /* attribute: tUSESGETLASTERROR  */
 #line 757 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_USESGETLASTERROR, 0 ); }
-#line 4528 "tools/widl/parser.tab.c"
+#line 4854 "tools/widl/parser.tab.c"
     break;
 
   case 215: /* attribute: tUSERMARSHAL '(' type ')'  */
 #line 758 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_USERMARSHAL, (yyvsp[-1].type) ); }
-#line 4534 "tools/widl/parser.tab.c"
+#line 4860 "tools/widl/parser.tab.c"
     break;
 
   case 216: /* attribute: tUUID '(' aUUID ')'  */
 #line 759 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_UUID, (yyvsp[-1].uuid) ); }
-#line 4540 "tools/widl/parser.tab.c"
+#line 4866 "tools/widl/parser.tab.c"
     break;
 
   case 217: /* attribute: tASYNCUUID '(' aUUID ')'  */
 #line 760 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_ASYNCUUID, (yyvsp[-1].uuid) ); }
-#line 4546 "tools/widl/parser.tab.c"
+#line 4872 "tools/widl/parser.tab.c"
     break;
 
   case 218: /* attribute: tV1ENUM  */
 #line 761 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_V1ENUM, 0 ); }
-#line 4552 "tools/widl/parser.tab.c"
+#line 4878 "tools/widl/parser.tab.c"
     break;
 
   case 219: /* attribute: tVARARG  */
 #line 762 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_VARARG, 0 ); }
-#line 4558 "tools/widl/parser.tab.c"
+#line 4884 "tools/widl/parser.tab.c"
     break;
 
   case 220: /* attribute: tVERSION '(' version ')'  */
 #line 763 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_VERSION, (yyvsp[-1].num) ); }
-#line 4564 "tools/widl/parser.tab.c"
+#line 4890 "tools/widl/parser.tab.c"
     break;
 
   case 221: /* attribute: tVIPROGID '(' aSTRING ')'  */
 #line 764 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_VIPROGID, (yyvsp[-1].str) ); }
-#line 4570 "tools/widl/parser.tab.c"
+#line 4896 "tools/widl/parser.tab.c"
     break;
 
   case 222: /* attribute: tWIREMARSHAL '(' type ')'  */
 #line 765 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_ptr( (yyloc), ATTR_WIREMARSHAL, (yyvsp[-1].type) ); }
-#line 4576 "tools/widl/parser.tab.c"
+#line 4902 "tools/widl/parser.tab.c"
     break;
 
   case 223: /* attribute: pointer_type  */
 #line 766 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_POINTERTYPE, (yyvsp[0].num) ); }
-#line 4582 "tools/widl/parser.tab.c"
+#line 4908 "tools/widl/parser.tab.c"
     break;
 
   case 228: /* cases: %empty  */
 #line 776 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4588 "tools/widl/parser.tab.c"
+#line 4914 "tools/widl/parser.tab.c"
     break;
 
   case 229: /* cases: cases case  */
 #line 777 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
-#line 4594 "tools/widl/parser.tab.c"
+#line 4920 "tools/widl/parser.tab.c"
     break;
 
   case 230: /* case: tCASE expr_int_const ':' union_field  */
@@ -4599,7 +4925,7 @@
                                                   (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var( NULL );
                                                   (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
                                                 }
-#line 4603 "tools/widl/parser.tab.c"
+#line 4929 "tools/widl/parser.tab.c"
     break;
 
   case 231: /* case: tDEFAULT ':' union_field  */
@@ -4608,19 +4934,19 @@
                                                   (yyval.var) = (yyvsp[0].var); if (!(yyval.var)) (yyval.var) = make_var( NULL );
                                                   (yyval.var)->attrs = append_attr( (yyval.var)->attrs, a );
                                                 }
-#line 4612 "tools/widl/parser.tab.c"
+#line 4938 "tools/widl/parser.tab.c"
     break;
 
   case 232: /* enums: %empty  */
 #line 791 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4618 "tools/widl/parser.tab.c"
+#line 4944 "tools/widl/parser.tab.c"
     break;
 
   case 233: /* enums: enum_list ','  */
 #line 792 "tools/widl/parser.y"
                                                 { (yyval.var_list) = (yyvsp[-1].var_list); }
-#line 4624 "tools/widl/parser.tab.c"
+#line 4950 "tools/widl/parser.tab.c"
     break;
 
   case 235: /* enum_list: enum  */
@@ -4629,7 +4955,7 @@
 						    (yyvsp[0].var)->eval = make_exprl(EXPR_NUM, 0 /* default for first enum entry */);
                                                   (yyval.var_list) = append_var( NULL, (yyvsp[0].var) );
 						}
-#line 4633 "tools/widl/parser.tab.c"
+#line 4959 "tools/widl/parser.tab.c"
     break;
 
   case 236: /* enum_list: enum_list ',' enum  */
@@ -4644,7 +4970,7 @@
                                                   }
                                                   (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[0].var) );
 						}
-#line 4648 "tools/widl/parser.tab.c"
+#line 4974 "tools/widl/parser.tab.c"
     break;
 
   case 237: /* enum_member: m_attributes ident  */
@@ -4652,7 +4978,7 @@
                                                 { (yyval.var) = (yyvsp[0].var);
 						  (yyval.var)->attrs = check_enum_member_attrs((yyvsp[-1].attr_list));
 						}
-#line 4656 "tools/widl/parser.tab.c"
+#line 4982 "tools/widl/parser.tab.c"
     break;
 
   case 238: /* enum: enum_member '=' expr_int_const  */
@@ -4661,7 +4987,7 @@
 						  (yyval.var)->eval = (yyvsp[0].expr);
                                                   (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
 						}
-#line 4665 "tools/widl/parser.tab.c"
+#line 4991 "tools/widl/parser.tab.c"
     break;
 
   case 239: /* enum: enum_member  */
@@ -4669,289 +4995,289 @@
                                                 { (yyval.var) = reg_const((yyvsp[0].var));
                                                   (yyval.var)->declspec.type = type_new_int(TYPE_BASIC_INT, 0);
 						}
-#line 4673 "tools/widl/parser.tab.c"
+#line 4999 "tools/widl/parser.tab.c"
     break;
 
   case 240: /* enumdef: tENUM m_typename '{' enums '}'  */
 #line 826 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 4679 "tools/widl/parser.tab.c"
+#line 5005 "tools/widl/parser.tab.c"
     break;
 
   case 241: /* m_exprs: m_expr  */
 #line 829 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
-#line 4685 "tools/widl/parser.tab.c"
+#line 5011 "tools/widl/parser.tab.c"
     break;
 
   case 242: /* m_exprs: m_exprs ',' m_expr  */
 #line 830 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
-#line 4691 "tools/widl/parser.tab.c"
+#line 5017 "tools/widl/parser.tab.c"
     break;
 
   case 243: /* m_expr: %empty  */
 #line 834 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr(EXPR_VOID); }
-#line 4697 "tools/widl/parser.tab.c"
+#line 5023 "tools/widl/parser.tab.c"
     break;
 
   case 245: /* expr: aNUM  */
 #line 838 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprl(EXPR_NUM, (yyvsp[0].num)); }
-#line 4703 "tools/widl/parser.tab.c"
+#line 5029 "tools/widl/parser.tab.c"
     break;
 
   case 246: /* expr: aHEXNUM  */
 #line 839 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprl(EXPR_HEXNUM, (yyvsp[0].num)); }
-#line 4709 "tools/widl/parser.tab.c"
+#line 5035 "tools/widl/parser.tab.c"
     break;
 
   case 247: /* expr: aDOUBLE  */
 #line 840 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprd(EXPR_DOUBLE, (yyvsp[0].dbl)); }
-#line 4715 "tools/widl/parser.tab.c"
+#line 5041 "tools/widl/parser.tab.c"
     break;
 
   case 248: /* expr: tFALSE  */
 #line 841 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 0); }
-#line 4721 "tools/widl/parser.tab.c"
+#line 5047 "tools/widl/parser.tab.c"
     break;
 
   case 249: /* expr: tNULL  */
 #line 842 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprl(EXPR_NUM, 0); }
-#line 4727 "tools/widl/parser.tab.c"
+#line 5053 "tools/widl/parser.tab.c"
     break;
 
   case 250: /* expr: tTRUE  */
 #line 843 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprl(EXPR_TRUEFALSE, 1); }
-#line 4733 "tools/widl/parser.tab.c"
+#line 5059 "tools/widl/parser.tab.c"
     break;
 
   case 251: /* expr: aSTRING  */
 #line 844 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprs(EXPR_STRLIT, (yyvsp[0].str)); }
-#line 4739 "tools/widl/parser.tab.c"
+#line 5065 "tools/widl/parser.tab.c"
     break;
 
   case 252: /* expr: aWSTRING  */
 #line 845 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprs(EXPR_WSTRLIT, (yyvsp[0].str)); }
-#line 4745 "tools/widl/parser.tab.c"
+#line 5071 "tools/widl/parser.tab.c"
     break;
 
   case 253: /* expr: aSQSTRING  */
 #line 846 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[0].str)); }
-#line 4751 "tools/widl/parser.tab.c"
+#line 5077 "tools/widl/parser.tab.c"
     break;
 
   case 254: /* expr: aIDENTIFIER  */
 #line 847 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str)); }
-#line 4757 "tools/widl/parser.tab.c"
+#line 5083 "tools/widl/parser.tab.c"
     break;
 
   case 255: /* expr: expr '?' expr ':' expr  */
 #line 848 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4763 "tools/widl/parser.tab.c"
+#line 5089 "tools/widl/parser.tab.c"
     break;
 
   case 256: /* expr: expr LOGICALOR expr  */
 #line 849 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4769 "tools/widl/parser.tab.c"
+#line 5095 "tools/widl/parser.tab.c"
     break;
 
   case 257: /* expr: expr LOGICALAND expr  */
 #line 850 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4775 "tools/widl/parser.tab.c"
+#line 5101 "tools/widl/parser.tab.c"
     break;
 
   case 258: /* expr: expr '|' expr  */
 #line 851 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4781 "tools/widl/parser.tab.c"
+#line 5107 "tools/widl/parser.tab.c"
     break;
 
   case 259: /* expr: expr '^' expr  */
 #line 852 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4787 "tools/widl/parser.tab.c"
+#line 5113 "tools/widl/parser.tab.c"
     break;
 
   case 260: /* expr: expr '&' expr  */
 #line 853 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4793 "tools/widl/parser.tab.c"
+#line 5119 "tools/widl/parser.tab.c"
     break;
 
   case 261: /* expr: expr EQUALITY expr  */
 #line 854 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4799 "tools/widl/parser.tab.c"
+#line 5125 "tools/widl/parser.tab.c"
     break;
 
   case 262: /* expr: expr INEQUALITY expr  */
 #line 855 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4805 "tools/widl/parser.tab.c"
+#line 5131 "tools/widl/parser.tab.c"
     break;
 
   case 263: /* expr: expr '>' expr  */
 #line 856 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4811 "tools/widl/parser.tab.c"
+#line 5137 "tools/widl/parser.tab.c"
     break;
 
   case 264: /* expr: expr '<' expr  */
 #line 857 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4817 "tools/widl/parser.tab.c"
+#line 5143 "tools/widl/parser.tab.c"
     break;
 
   case 265: /* expr: expr GREATEREQUAL expr  */
 #line 858 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4823 "tools/widl/parser.tab.c"
+#line 5149 "tools/widl/parser.tab.c"
     break;
 
   case 266: /* expr: expr LESSEQUAL expr  */
 #line 859 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4829 "tools/widl/parser.tab.c"
+#line 5155 "tools/widl/parser.tab.c"
     break;
 
   case 267: /* expr: expr SHL expr  */
 #line 860 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4835 "tools/widl/parser.tab.c"
+#line 5161 "tools/widl/parser.tab.c"
     break;
 
   case 268: /* expr: expr SHR expr  */
 #line 861 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4841 "tools/widl/parser.tab.c"
+#line 5167 "tools/widl/parser.tab.c"
     break;
 
   case 269: /* expr: expr '+' expr  */
 #line 862 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4847 "tools/widl/parser.tab.c"
+#line 5173 "tools/widl/parser.tab.c"
     break;
 
   case 270: /* expr: expr '-' expr  */
 #line 863 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4853 "tools/widl/parser.tab.c"
+#line 5179 "tools/widl/parser.tab.c"
     break;
 
   case 271: /* expr: expr '%' expr  */
 #line 864 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4859 "tools/widl/parser.tab.c"
+#line 5185 "tools/widl/parser.tab.c"
     break;
 
   case 272: /* expr: expr '*' expr  */
 #line 865 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4865 "tools/widl/parser.tab.c"
+#line 5191 "tools/widl/parser.tab.c"
     break;
 
   case 273: /* expr: expr '/' expr  */
 #line 866 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[-2].expr), (yyvsp[0].expr)); }
-#line 4871 "tools/widl/parser.tab.c"
+#line 5197 "tools/widl/parser.tab.c"
     break;
 
   case 274: /* expr: '!' expr  */
 #line 867 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[0].expr)); }
-#line 4877 "tools/widl/parser.tab.c"
+#line 5203 "tools/widl/parser.tab.c"
     break;
 
   case 275: /* expr: '~' expr  */
 #line 868 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[0].expr)); }
-#line 4883 "tools/widl/parser.tab.c"
+#line 5209 "tools/widl/parser.tab.c"
     break;
 
   case 276: /* expr: '+' expr  */
 #line 869 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[0].expr)); }
-#line 4889 "tools/widl/parser.tab.c"
+#line 5215 "tools/widl/parser.tab.c"
     break;
 
   case 277: /* expr: '-' expr  */
 #line 870 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[0].expr)); }
-#line 4895 "tools/widl/parser.tab.c"
+#line 5221 "tools/widl/parser.tab.c"
     break;
 
   case 278: /* expr: '&' expr  */
 #line 871 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[0].expr)); }
-#line 4901 "tools/widl/parser.tab.c"
+#line 5227 "tools/widl/parser.tab.c"
     break;
 
   case 279: /* expr: '*' expr  */
 #line 872 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[0].expr)); }
-#line 4907 "tools/widl/parser.tab.c"
+#line 5233 "tools/widl/parser.tab.c"
     break;
 
   case 280: /* expr: expr MEMBERPTR aIDENTIFIER  */
 #line 873 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[-2].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
-#line 4913 "tools/widl/parser.tab.c"
+#line 5239 "tools/widl/parser.tab.c"
     break;
 
   case 281: /* expr: expr '.' aIDENTIFIER  */
 #line 874 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[-2].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[0].str))); }
-#line 4919 "tools/widl/parser.tab.c"
+#line 5245 "tools/widl/parser.tab.c"
     break;
 
   case 282: /* expr: '(' unqualified_decl_spec m_abstract_declarator ')' expr  */
 #line 876 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[-3].declspec), (yyvsp[-2].declarator), 0), (yyvsp[0].expr)); free((yyvsp[-3].declspec)); free((yyvsp[-2].declarator)); }
-#line 4925 "tools/widl/parser.tab.c"
+#line 5251 "tools/widl/parser.tab.c"
     break;
 
   case 283: /* expr: tSIZEOF '(' unqualified_decl_spec m_abstract_declarator ')'  */
 #line 878 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[-2].declspec), (yyvsp[-1].declarator), 0), NULL); free((yyvsp[-2].declspec)); free((yyvsp[-1].declarator)); }
-#line 4931 "tools/widl/parser.tab.c"
+#line 5257 "tools/widl/parser.tab.c"
     break;
 
   case 284: /* expr: expr '[' expr ']'  */
 #line 879 "tools/widl/parser.y"
                                                 { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[-3].expr), (yyvsp[-1].expr)); }
-#line 4937 "tools/widl/parser.tab.c"
+#line 5263 "tools/widl/parser.tab.c"
     break;
 
   case 285: /* expr: '(' expr ')'  */
 #line 880 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[-1].expr); }
-#line 4943 "tools/widl/parser.tab.c"
+#line 5269 "tools/widl/parser.tab.c"
     break;
 
   case 286: /* expr_list_int_const: expr_int_const  */
 #line 883 "tools/widl/parser.y"
                                                 { (yyval.expr_list) = append_expr( NULL, (yyvsp[0].expr) ); }
-#line 4949 "tools/widl/parser.tab.c"
+#line 5275 "tools/widl/parser.tab.c"
     break;
 
   case 287: /* expr_list_int_const: expr_list_int_const ',' expr_int_const  */
 #line 884 "tools/widl/parser.y"
                                                         { (yyval.expr_list) = append_expr( (yyvsp[-2].expr_list), (yyvsp[0].expr) ); }
-#line 4955 "tools/widl/parser.tab.c"
+#line 5281 "tools/widl/parser.tab.c"
     break;
 
   case 288: /* expr_int_const: expr  */
@@ -4960,7 +5286,7 @@
 						  if (!(yyval.expr)->is_const)
 						      error_loc("expression is not an integer constant\n");
 						}
-#line 4964 "tools/widl/parser.tab.c"
+#line 5290 "tools/widl/parser.tab.c"
     break;
 
   case 289: /* expr_const: expr  */
@@ -4969,19 +5295,19 @@
 						  if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT)
 						      error_loc("expression is not constant\n");
 						}
-#line 4973 "tools/widl/parser.tab.c"
+#line 5299 "tools/widl/parser.tab.c"
     break;
 
   case 290: /* fields: %empty  */
 #line 900 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 4979 "tools/widl/parser.tab.c"
+#line 5305 "tools/widl/parser.tab.c"
     break;
 
   case 291: /* fields: fields field  */
 #line 901 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var_list((yyvsp[-1].var_list), (yyvsp[0].var_list)); }
-#line 4985 "tools/widl/parser.tab.c"
+#line 5311 "tools/widl/parser.tab.c"
     break;
 
   case 292: /* field: m_attributes decl_spec struct_declarator_list ';'  */
@@ -4990,7 +5316,7 @@
 						  check_field_attrs(first, (yyvsp[-3].attr_list));
 						  (yyval.var_list) = set_var_types((yyvsp[-3].attr_list), (yyvsp[-2].declspec), (yyvsp[-1].declarator_list));
 						}
-#line 4994 "tools/widl/parser.tab.c"
+#line 5320 "tools/widl/parser.tab.c"
     break;
 
   case 293: /* field: m_attributes uniondef ';'  */
@@ -4999,43 +5325,43 @@
 						  v->declspec.type = (yyvsp[-1].type); v->attrs = (yyvsp[-2].attr_list);
 						  (yyval.var_list) = append_var(NULL, v);
 						}
-#line 5003 "tools/widl/parser.tab.c"
+#line 5329 "tools/widl/parser.tab.c"
     break;
 
   case 294: /* ne_union_field: s_field ';'  */
 #line 916 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[-1].var); }
-#line 5009 "tools/widl/parser.tab.c"
+#line 5335 "tools/widl/parser.tab.c"
     break;
 
   case 295: /* ne_union_field: attributes ';'  */
 #line 917 "tools/widl/parser.y"
                                                 { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[-1].attr_list); }
-#line 5015 "tools/widl/parser.tab.c"
+#line 5341 "tools/widl/parser.tab.c"
     break;
 
   case 296: /* ne_union_fields: %empty  */
 #line 921 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 5021 "tools/widl/parser.tab.c"
+#line 5347 "tools/widl/parser.tab.c"
     break;
 
   case 297: /* ne_union_fields: ne_union_fields ne_union_field  */
 #line 922 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-1].var_list), (yyvsp[0].var) ); }
-#line 5027 "tools/widl/parser.tab.c"
+#line 5353 "tools/widl/parser.tab.c"
     break;
 
   case 298: /* union_field: s_field ';'  */
 #line 926 "tools/widl/parser.y"
                                                 { (yyval.var) = (yyvsp[-1].var); }
-#line 5033 "tools/widl/parser.tab.c"
+#line 5359 "tools/widl/parser.tab.c"
     break;
 
   case 299: /* union_field: ';'  */
 #line 927 "tools/widl/parser.y"
                                                 { (yyval.var) = NULL; }
-#line 5039 "tools/widl/parser.tab.c"
+#line 5365 "tools/widl/parser.tab.c"
     break;
 
   case 300: /* s_field: m_attributes decl_spec declarator  */
@@ -5044,7 +5370,7 @@
 						                (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 5048 "tools/widl/parser.tab.c"
+#line 5374 "tools/widl/parser.tab.c"
     break;
 
   case 301: /* s_field: m_attributes structdef  */
@@ -5053,7 +5379,7 @@
 						  v->declspec.type = (yyvsp[0].type); v->attrs = (yyvsp[-1].attr_list);
 						  (yyval.var) = v;
 						}
-#line 5057 "tools/widl/parser.tab.c"
+#line 5383 "tools/widl/parser.tab.c"
     break;
 
   case 302: /* funcdef: declaration  */
@@ -5063,7 +5389,7 @@
 						    error_loc("only methods may be declared inside the methods section of a dispinterface\n");
 						  check_function_attrs((yyval.var)->name, (yyval.var)->attrs);
 						}
-#line 5067 "tools/widl/parser.tab.c"
+#line 5393 "tools/widl/parser.tab.c"
     break;
 
   case 303: /* declaration: attributes decl_spec init_declarator  */
@@ -5071,7 +5397,7 @@
                                                 { (yyval.var) = declare_var((yyvsp[-2].attr_list), (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 5075 "tools/widl/parser.tab.c"
+#line 5401 "tools/widl/parser.tab.c"
     break;
 
   case 304: /* declaration: decl_spec init_declarator  */
@@ -5079,392 +5405,392 @@
                                                 { (yyval.var) = declare_var(NULL, (yyvsp[-1].declspec), (yyvsp[0].declarator), FALSE);
 						  free((yyvsp[0].declarator));
 						}
-#line 5083 "tools/widl/parser.tab.c"
+#line 5409 "tools/widl/parser.tab.c"
     break;
 
   case 305: /* m_ident: %empty  */
 #line 958 "tools/widl/parser.y"
                                                 { (yyval.var) = NULL; }
-#line 5089 "tools/widl/parser.tab.c"
+#line 5415 "tools/widl/parser.tab.c"
     break;
 
   case 307: /* m_typename: %empty  */
 #line 963 "tools/widl/parser.y"
                                                 { (yyval.str) = NULL; }
-#line 5095 "tools/widl/parser.tab.c"
+#line 5421 "tools/widl/parser.tab.c"
     break;
 
   case 311: /* ident: typename  */
 #line 971 "tools/widl/parser.y"
                                                 { (yyval.var) = make_var((yyvsp[0].str)); }
-#line 5101 "tools/widl/parser.tab.c"
+#line 5427 "tools/widl/parser.tab.c"
     break;
 
   case 312: /* base_type: tBYTE  */
 #line 974 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "byte" ); }
-#line 5107 "tools/widl/parser.tab.c"
+#line 5433 "tools/widl/parser.tab.c"
     break;
 
   case 313: /* base_type: tWCHAR  */
 #line 975 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "wchar_t" ); }
-#line 5113 "tools/widl/parser.tab.c"
+#line 5439 "tools/widl/parser.tab.c"
     break;
 
   case 315: /* base_type: tSIGNED int_std  */
 #line 977 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), -1); }
-#line 5119 "tools/widl/parser.tab.c"
+#line 5445 "tools/widl/parser.tab.c"
     break;
 
   case 316: /* base_type: tUNSIGNED int_std  */
 #line 978 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[0].type)), 1); }
-#line 5125 "tools/widl/parser.tab.c"
+#line 5451 "tools/widl/parser.tab.c"
     break;
 
   case 317: /* base_type: tUNSIGNED  */
 #line 979 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); }
-#line 5131 "tools/widl/parser.tab.c"
+#line 5457 "tools/widl/parser.tab.c"
     break;
 
   case 318: /* base_type: tFLOAT  */
 #line 980 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "float" ); }
-#line 5137 "tools/widl/parser.tab.c"
+#line 5463 "tools/widl/parser.tab.c"
     break;
 
   case 319: /* base_type: tDOUBLE  */
 #line 981 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "double" ); }
-#line 5143 "tools/widl/parser.tab.c"
+#line 5469 "tools/widl/parser.tab.c"
     break;
 
   case 320: /* base_type: tBOOLEAN  */
 #line 982 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "boolean" ); }
-#line 5149 "tools/widl/parser.tab.c"
+#line 5475 "tools/widl/parser.tab.c"
     break;
 
   case 321: /* base_type: tERRORSTATUST  */
 #line 983 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "error_status_t" ); }
-#line 5155 "tools/widl/parser.tab.c"
+#line 5481 "tools/widl/parser.tab.c"
     break;
 
   case 322: /* base_type: tHANDLET  */
 #line 984 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error( NULL, "handle_t" ); }
-#line 5161 "tools/widl/parser.tab.c"
+#line 5487 "tools/widl/parser.tab.c"
     break;
 
   case 325: /* int_std: tINT  */
 #line 992 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); }
-#line 5167 "tools/widl/parser.tab.c"
+#line 5493 "tools/widl/parser.tab.c"
     break;
 
   case 326: /* int_std: tSHORT m_int  */
 #line 993 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); }
-#line 5173 "tools/widl/parser.tab.c"
+#line 5499 "tools/widl/parser.tab.c"
     break;
 
   case 327: /* int_std: tSMALL  */
 #line 994 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); }
-#line 5179 "tools/widl/parser.tab.c"
+#line 5505 "tools/widl/parser.tab.c"
     break;
 
   case 328: /* int_std: tLONG m_int  */
 #line 995 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_LONG, 0); }
-#line 5185 "tools/widl/parser.tab.c"
+#line 5511 "tools/widl/parser.tab.c"
     break;
 
   case 329: /* int_std: tHYPER m_int  */
 #line 996 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); }
-#line 5191 "tools/widl/parser.tab.c"
+#line 5517 "tools/widl/parser.tab.c"
     break;
 
   case 330: /* int_std: tINT64  */
 #line 997 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); }
-#line 5197 "tools/widl/parser.tab.c"
+#line 5523 "tools/widl/parser.tab.c"
     break;
 
   case 331: /* int_std: tCHAR  */
 #line 998 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); }
-#line 5203 "tools/widl/parser.tab.c"
+#line 5529 "tools/widl/parser.tab.c"
     break;
 
   case 332: /* int_std: tINT32  */
 #line 999 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); }
-#line 5209 "tools/widl/parser.tab.c"
+#line 5535 "tools/widl/parser.tab.c"
     break;
 
   case 333: /* int_std: tINT3264  */
 #line 1000 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); }
-#line 5215 "tools/widl/parser.tab.c"
+#line 5541 "tools/widl/parser.tab.c"
     break;
 
   case 334: /* namespace_pfx: aIDENTIFIER '.'  */
 #line 1004 "tools/widl/parser.y"
                                                 { (yyval.namespace) = find_namespace_or_error(&global_namespace, (yyvsp[-1].str)); }
-#line 5221 "tools/widl/parser.tab.c"
+#line 5547 "tools/widl/parser.tab.c"
     break;
 
   case 335: /* namespace_pfx: namespace_pfx aIDENTIFIER '.'  */
 #line 1005 "tools/widl/parser.y"
                                                 { (yyval.namespace) = find_namespace_or_error((yyvsp[-2].namespace), (yyvsp[-1].str)); }
-#line 5227 "tools/widl/parser.tab.c"
+#line 5553 "tools/widl/parser.tab.c"
     break;
 
   case 336: /* qualified_type: typename  */
 #line 1009 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error(current_namespace, (yyvsp[0].str)); }
-#line 5233 "tools/widl/parser.tab.c"
+#line 5559 "tools/widl/parser.tab.c"
     break;
 
   case 337: /* qualified_type: namespace_pfx typename  */
 #line 1010 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error((yyvsp[-1].namespace), (yyvsp[0].str)); }
-#line 5239 "tools/widl/parser.tab.c"
+#line 5565 "tools/widl/parser.tab.c"
     break;
 
   case 338: /* parameterized_type: qualified_type '<' parameterized_type_args '>'  */
 #line 1014 "tools/widl/parser.y"
                                                 { (yyval.type) = find_parameterized_type((yyvsp[-3].type), (yyvsp[-1].typeref_list)); }
-#line 5245 "tools/widl/parser.tab.c"
+#line 5571 "tools/widl/parser.tab.c"
     break;
 
   case 339: /* parameterized_type_arg: base_type  */
 #line 1018 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5251 "tools/widl/parser.tab.c"
+#line 5577 "tools/widl/parser.tab.c"
     break;
 
   case 340: /* parameterized_type_arg: qualified_type  */
 #line 1019 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5257 "tools/widl/parser.tab.c"
+#line 5583 "tools/widl/parser.tab.c"
     break;
 
   case 341: /* parameterized_type_arg: qualified_type '*'  */
 #line 1020 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_pointer((yyvsp[-1].type)); }
-#line 5263 "tools/widl/parser.tab.c"
+#line 5589 "tools/widl/parser.tab.c"
     break;
 
   case 342: /* parameterized_type_arg: parameterized_type  */
 #line 1021 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5269 "tools/widl/parser.tab.c"
+#line 5595 "tools/widl/parser.tab.c"
     break;
 
   case 343: /* parameterized_type_arg: parameterized_type '*'  */
 #line 1022 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_pointer((yyvsp[-1].type)); }
-#line 5275 "tools/widl/parser.tab.c"
+#line 5601 "tools/widl/parser.tab.c"
     break;
 
   case 344: /* parameterized_type_args: parameterized_type_arg  */
 #line 1026 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref(NULL, make_typeref((yyvsp[0].type))); }
-#line 5281 "tools/widl/parser.tab.c"
+#line 5607 "tools/widl/parser.tab.c"
     break;
 
   case 345: /* parameterized_type_args: parameterized_type_args ',' parameterized_type_arg  */
 #line 1028 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref((yyvsp[-2].typeref_list), make_typeref((yyvsp[0].type))); }
-#line 5287 "tools/widl/parser.tab.c"
+#line 5613 "tools/widl/parser.tab.c"
     break;
 
   case 346: /* coclass: tCOCLASS typename  */
 #line 1031 "tools/widl/parser.y"
                                                 { (yyval.type) = type_coclass_declare((yyvsp[0].str)); }
-#line 5293 "tools/widl/parser.tab.c"
+#line 5619 "tools/widl/parser.tab.c"
     break;
 
   case 347: /* coclassdef: attributes coclass '{' class_interfaces '}' semicolon_opt  */
 #line 1035 "tools/widl/parser.y"
                                                 { (yyval.type) = type_coclass_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].typeref_list)); }
-#line 5299 "tools/widl/parser.tab.c"
+#line 5625 "tools/widl/parser.tab.c"
     break;
 
   case 348: /* runtimeclass: tRUNTIMECLASS typename  */
 #line 1038 "tools/widl/parser.y"
                                                 { (yyval.type) = type_runtimeclass_declare((yyvsp[0].str), current_namespace); }
-#line 5305 "tools/widl/parser.tab.c"
+#line 5631 "tools/widl/parser.tab.c"
     break;
 
   case 349: /* runtimeclass_def: attributes runtimeclass inherit '{' class_interfaces '}' semicolon_opt  */
 #line 1042 "tools/widl/parser.y"
                                                 { if ((yyvsp[-4].type) && type_get_type((yyvsp[-4].type)) != TYPE_RUNTIMECLASS) error_loc("%s is not a runtimeclass\n", (yyvsp[-4].type)->name);
 						  (yyval.type) = type_runtimeclass_define((yyvsp[-5].type), (yyvsp[-6].attr_list), (yyvsp[-2].typeref_list)); }
-#line 5312 "tools/widl/parser.tab.c"
+#line 5638 "tools/widl/parser.tab.c"
     break;
 
   case 350: /* apicontract: tAPICONTRACT typename  */
 #line 1046 "tools/widl/parser.y"
                                                 { (yyval.type) = type_apicontract_declare((yyvsp[0].str), current_namespace); }
-#line 5318 "tools/widl/parser.tab.c"
+#line 5644 "tools/widl/parser.tab.c"
     break;
 
   case 351: /* apicontract_def: attributes apicontract '{' '}' semicolon_opt  */
 #line 1050 "tools/widl/parser.y"
                                                 { (yyval.type) = type_apicontract_define((yyvsp[-3].type), (yyvsp[-4].attr_list)); }
-#line 5324 "tools/widl/parser.tab.c"
+#line 5650 "tools/widl/parser.tab.c"
     break;
 
   case 352: /* namespacedef: tNAMESPACE aIDENTIFIER  */
 #line 1053 "tools/widl/parser.y"
                                                 { (yyval.str_list) = append_str( NULL, (yyvsp[0].str) ); }
-#line 5330 "tools/widl/parser.tab.c"
+#line 5656 "tools/widl/parser.tab.c"
     break;
 
   case 353: /* namespacedef: namespacedef '.' aIDENTIFIER  */
 #line 1054 "tools/widl/parser.y"
                                                 { (yyval.str_list) = append_str( (yyvsp[-2].str_list), (yyvsp[0].str) ); }
-#line 5336 "tools/widl/parser.tab.c"
+#line 5662 "tools/widl/parser.tab.c"
     break;
 
   case 354: /* class_interfaces: %empty  */
 #line 1058 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = NULL; }
-#line 5342 "tools/widl/parser.tab.c"
+#line 5668 "tools/widl/parser.tab.c"
     break;
 
   case 355: /* class_interfaces: class_interfaces class_interface  */
 #line 1059 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref( (yyvsp[-1].typeref_list), (yyvsp[0].typeref) ); }
-#line 5348 "tools/widl/parser.tab.c"
+#line 5674 "tools/widl/parser.tab.c"
     break;
 
   case 356: /* class_interface: m_attributes interfaceref ';'  */
 #line 1063 "tools/widl/parser.y"
                                                 { (yyval.typeref) = make_typeref((yyvsp[-1].type)); (yyval.typeref)->attrs = (yyvsp[-2].attr_list); }
-#line 5354 "tools/widl/parser.tab.c"
+#line 5680 "tools/widl/parser.tab.c"
     break;
 
   case 357: /* class_interface: m_attributes dispinterfaceref ';'  */
 #line 1064 "tools/widl/parser.y"
                                                 { (yyval.typeref) = make_typeref((yyvsp[-1].type)); (yyval.typeref)->attrs = (yyvsp[-2].attr_list); }
-#line 5360 "tools/widl/parser.tab.c"
+#line 5686 "tools/widl/parser.tab.c"
     break;
 
   case 358: /* dispinterface: tDISPINTERFACE typename  */
 #line 1067 "tools/widl/parser.y"
                                                 { (yyval.type) = type_dispinterface_declare((yyvsp[0].str)); }
-#line 5366 "tools/widl/parser.tab.c"
+#line 5692 "tools/widl/parser.tab.c"
     break;
 
   case 359: /* dispattributes: attributes  */
 #line 1070 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr( (yyvsp[0].attr_list), attr_int( (yyloc), ATTR_DISPINTERFACE, 0 ) ); }
-#line 5372 "tools/widl/parser.tab.c"
+#line 5698 "tools/widl/parser.tab.c"
     break;
 
   case 360: /* dispint_props: tPROPERTIES ':'  */
 #line 1073 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 5378 "tools/widl/parser.tab.c"
+#line 5704 "tools/widl/parser.tab.c"
     break;
 
   case 361: /* dispint_props: dispint_props s_field ';'  */
 #line 1074 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
-#line 5384 "tools/widl/parser.tab.c"
+#line 5710 "tools/widl/parser.tab.c"
     break;
 
   case 362: /* dispint_meths: tMETHODS ':'  */
 #line 1077 "tools/widl/parser.y"
                                                 { (yyval.var_list) = NULL; }
-#line 5390 "tools/widl/parser.tab.c"
+#line 5716 "tools/widl/parser.tab.c"
     break;
 
   case 363: /* dispint_meths: dispint_meths funcdef ';'  */
 #line 1078 "tools/widl/parser.y"
                                                 { (yyval.var_list) = append_var( (yyvsp[-2].var_list), (yyvsp[-1].var) ); }
-#line 5396 "tools/widl/parser.tab.c"
+#line 5722 "tools/widl/parser.tab.c"
     break;
 
   case 364: /* dispinterfacedef: dispattributes dispinterface '{' dispint_props dispint_meths '}'  */
 #line 1083 "tools/widl/parser.y"
                                                 { (yyval.type) = type_dispinterface_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].var_list), (yyvsp[-1].var_list)); }
-#line 5402 "tools/widl/parser.tab.c"
+#line 5728 "tools/widl/parser.tab.c"
     break;
 
   case 365: /* dispinterfacedef: dispattributes dispinterface '{' interface ';' '}'  */
 #line 1085 "tools/widl/parser.y"
                                                 { (yyval.type) = type_dispinterface_define_from_iface((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].type)); }
-#line 5408 "tools/widl/parser.tab.c"
+#line 5734 "tools/widl/parser.tab.c"
     break;
 
   case 366: /* inherit: %empty  */
 #line 1089 "tools/widl/parser.y"
                                                 { (yyval.type) = NULL; }
-#line 5414 "tools/widl/parser.tab.c"
+#line 5740 "tools/widl/parser.tab.c"
     break;
 
   case 367: /* inherit: ':' qualified_type  */
 #line 1090 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5420 "tools/widl/parser.tab.c"
+#line 5746 "tools/widl/parser.tab.c"
     break;
 
   case 368: /* inherit: ':' parameterized_type  */
 #line 1091 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5426 "tools/widl/parser.tab.c"
+#line 5752 "tools/widl/parser.tab.c"
     break;
 
   case 369: /* type_parameter: typename  */
 #line 1094 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_PARAMETER, (yyvsp[0].str), parameters_namespace, 0); }
-#line 5432 "tools/widl/parser.tab.c"
+#line 5758 "tools/widl/parser.tab.c"
     break;
 
   case 370: /* type_parameters: type_parameter  */
 #line 1098 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref(NULL, make_typeref((yyvsp[0].type))); }
-#line 5438 "tools/widl/parser.tab.c"
+#line 5764 "tools/widl/parser.tab.c"
     break;
 
   case 371: /* type_parameters: type_parameters ',' type_parameter  */
 #line 1099 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref((yyvsp[-2].typeref_list), make_typeref((yyvsp[0].type))); }
-#line 5444 "tools/widl/parser.tab.c"
+#line 5770 "tools/widl/parser.tab.c"
     break;
 
   case 372: /* interface: tINTERFACE typename  */
 #line 1103 "tools/widl/parser.y"
                                                 { (yyval.type) = type_interface_declare((yyvsp[0].str), current_namespace); }
-#line 5450 "tools/widl/parser.tab.c"
+#line 5776 "tools/widl/parser.tab.c"
     break;
 
   case 373: /* $@3: %empty  */
 #line 1104 "tools/widl/parser.y"
                                   { push_parameters_namespace((yyvsp[-1].str)); }
-#line 5456 "tools/widl/parser.tab.c"
+#line 5782 "tools/widl/parser.tab.c"
     break;
 
   case 374: /* $@4: %empty  */
 #line 1104 "tools/widl/parser.y"
                                                                                      { pop_parameters_namespace((yyvsp[-3].str)); }
-#line 5462 "tools/widl/parser.tab.c"
+#line 5788 "tools/widl/parser.tab.c"
     break;
 
   case 375: /* interface: tINTERFACE typename '<' $@3 type_parameters $@4 '>'  */
 #line 1105 "tools/widl/parser.y"
                                                 { (yyval.type) = type_parameterized_interface_declare((yyvsp[-5].str), current_namespace, (yyvsp[-2].typeref_list)); }
-#line 5468 "tools/widl/parser.tab.c"
+#line 5794 "tools/widl/parser.tab.c"
     break;
 
   case 376: /* delegatedef: m_attributes tDELEGATE type ident '(' m_args ')' semicolon_opt  */
@@ -5472,19 +5798,19 @@
                                                 { (yyval.type) = type_delegate_declare((yyvsp[-4].var)->name, current_namespace);
 						  (yyval.type) = type_delegate_define((yyval.type), (yyvsp[-7].attr_list), append_statement(NULL, make_statement_delegate((yyvsp[-5].type), (yyvsp[-2].var_list))));
 						}
-#line 5476 "tools/widl/parser.tab.c"
+#line 5802 "tools/widl/parser.tab.c"
     break;
 
   case 377: /* $@5: %empty  */
 #line 1113 "tools/widl/parser.y"
               { push_parameters_namespace((yyvsp[-1].var)->name); }
-#line 5482 "tools/widl/parser.tab.c"
+#line 5808 "tools/widl/parser.tab.c"
     break;
 
   case 378: /* $@6: %empty  */
 #line 1114 "tools/widl/parser.y"
                          { pop_parameters_namespace((yyvsp[-7].var)->name); }
-#line 5488 "tools/widl/parser.tab.c"
+#line 5814 "tools/widl/parser.tab.c"
     break;
 
   case 379: /* delegatedef: m_attributes tDELEGATE type ident '<' $@5 type_parameters '>' '(' m_args ')' $@6 semicolon_opt  */
@@ -5492,49 +5818,49 @@
                                                 { (yyval.type) = type_parameterized_delegate_declare((yyvsp[-9].var)->name, current_namespace, (yyvsp[-6].typeref_list));
 						  (yyval.type) = type_parameterized_delegate_define((yyval.type), (yyvsp[-12].attr_list), append_statement(NULL, make_statement_delegate((yyvsp[-10].type), (yyvsp[-3].var_list))));
 						}
-#line 5496 "tools/widl/parser.tab.c"
+#line 5822 "tools/widl/parser.tab.c"
     break;
 
   case 380: /* required_types: qualified_type  */
 #line 1121 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref(NULL, make_typeref((yyvsp[0].type))); }
-#line 5502 "tools/widl/parser.tab.c"
+#line 5828 "tools/widl/parser.tab.c"
     break;
 
   case 381: /* required_types: parameterized_type  */
 #line 1122 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref(NULL, make_typeref((yyvsp[0].type))); }
-#line 5508 "tools/widl/parser.tab.c"
+#line 5834 "tools/widl/parser.tab.c"
     break;
 
   case 382: /* required_types: required_types ',' qualified_type  */
 #line 1123 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref((yyvsp[-2].typeref_list), make_typeref((yyvsp[0].type))); }
-#line 5514 "tools/widl/parser.tab.c"
+#line 5840 "tools/widl/parser.tab.c"
     break;
 
   case 383: /* required_types: required_types ',' parameterized_type  */
 #line 1124 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = append_typeref((yyvsp[-2].typeref_list), make_typeref((yyvsp[0].type))); }
-#line 5520 "tools/widl/parser.tab.c"
+#line 5846 "tools/widl/parser.tab.c"
     break;
 
   case 384: /* requires: %empty  */
 #line 1128 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = NULL; }
-#line 5526 "tools/widl/parser.tab.c"
+#line 5852 "tools/widl/parser.tab.c"
     break;
 
   case 385: /* requires: tREQUIRES required_types  */
 #line 1129 "tools/widl/parser.y"
                                                 { (yyval.typeref_list) = (yyvsp[0].typeref_list); }
-#line 5532 "tools/widl/parser.tab.c"
+#line 5858 "tools/widl/parser.tab.c"
     break;
 
   case 386: /* $@7: %empty  */
 #line 1132 "tools/widl/parser.y"
                                                 { if ((yyvsp[0].type)->type_type == TYPE_PARAMETERIZED_TYPE) push_parameters_namespace((yyvsp[0].type)->name); }
-#line 5538 "tools/widl/parser.tab.c"
+#line 5864 "tools/widl/parser.tab.c"
     break;
 
   case 387: /* interfacedef: attributes interface $@7 inherit requires '{' int_statements '}' semicolon_opt  */
@@ -5550,223 +5876,223 @@
 						      check_async_uuid((yyval.type));
 						  }
 						}
-#line 5554 "tools/widl/parser.tab.c"
+#line 5880 "tools/widl/parser.tab.c"
     break;
 
   case 388: /* interfacedef: dispinterfacedef semicolon_opt  */
 #line 1145 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[-1].type); }
-#line 5560 "tools/widl/parser.tab.c"
+#line 5886 "tools/widl/parser.tab.c"
     break;
 
   case 389: /* interfaceref: tINTERFACE typename  */
 #line 1149 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5566 "tools/widl/parser.tab.c"
+#line 5892 "tools/widl/parser.tab.c"
     break;
 
   case 390: /* interfaceref: tINTERFACE namespace_pfx typename  */
 #line 1150 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), (yyvsp[-1].namespace), 0); }
-#line 5572 "tools/widl/parser.tab.c"
+#line 5898 "tools/widl/parser.tab.c"
     break;
 
   case 391: /* interfaceref: tINTERFACE parameterized_type  */
 #line 1151 "tools/widl/parser.y"
                                                 { if (type_get_type(((yyval.type) = (yyvsp[0].type))) != TYPE_INTERFACE) error_loc("%s is not an interface\n", (yyval.type)->name); }
-#line 5578 "tools/widl/parser.tab.c"
+#line 5904 "tools/widl/parser.tab.c"
     break;
 
   case 392: /* dispinterfaceref: tDISPINTERFACE typename  */
 #line 1155 "tools/widl/parser.y"
                                                 { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[0].str), current_namespace, 0); }
-#line 5584 "tools/widl/parser.tab.c"
+#line 5910 "tools/widl/parser.tab.c"
     break;
 
   case 393: /* module: tMODULE typename  */
 #line 1158 "tools/widl/parser.y"
                                                 { (yyval.type) = type_module_declare((yyvsp[0].str)); }
-#line 5590 "tools/widl/parser.tab.c"
+#line 5916 "tools/widl/parser.tab.c"
     break;
 
   case 394: /* moduledef: m_attributes module '{' int_statements '}' semicolon_opt  */
 #line 1162 "tools/widl/parser.y"
                                                 { (yyval.type) = type_module_define((yyvsp[-4].type), (yyvsp[-5].attr_list), (yyvsp[-2].stmt_list)); }
-#line 5596 "tools/widl/parser.tab.c"
+#line 5922 "tools/widl/parser.tab.c"
     break;
 
   case 395: /* storage_cls_spec: tEXTERN  */
 #line 1166 "tools/widl/parser.y"
                                                 { (yyval.stgclass) = STG_EXTERN; }
-#line 5602 "tools/widl/parser.tab.c"
+#line 5928 "tools/widl/parser.tab.c"
     break;
 
   case 396: /* storage_cls_spec: tSTATIC  */
 #line 1167 "tools/widl/parser.y"
                                                 { (yyval.stgclass) = STG_STATIC; }
-#line 5608 "tools/widl/parser.tab.c"
+#line 5934 "tools/widl/parser.tab.c"
     break;
 
   case 397: /* storage_cls_spec: tREGISTER  */
 #line 1168 "tools/widl/parser.y"
                                                 { (yyval.stgclass) = STG_REGISTER; }
-#line 5614 "tools/widl/parser.tab.c"
+#line 5940 "tools/widl/parser.tab.c"
     break;
 
   case 398: /* function_specifier: tINLINE  */
 #line 1172 "tools/widl/parser.y"
                                                 { (yyval.function_specifier) = FUNCTION_SPECIFIER_INLINE; }
-#line 5620 "tools/widl/parser.tab.c"
+#line 5946 "tools/widl/parser.tab.c"
     break;
 
   case 399: /* type_qualifier: tCONST  */
 #line 1176 "tools/widl/parser.y"
                                                 { (yyval.type_qualifier) = TYPE_QUALIFIER_CONST; }
-#line 5626 "tools/widl/parser.tab.c"
+#line 5952 "tools/widl/parser.tab.c"
     break;
 
   case 400: /* m_type_qual_list: %empty  */
 #line 1180 "tools/widl/parser.y"
                                                 { (yyval.type_qualifier) = 0; }
-#line 5632 "tools/widl/parser.tab.c"
+#line 5958 "tools/widl/parser.tab.c"
     break;
 
   case 401: /* m_type_qual_list: m_type_qual_list type_qualifier  */
 #line 1181 "tools/widl/parser.y"
                                                 { (yyval.type_qualifier) = (yyvsp[-1].type_qualifier) | (yyvsp[0].type_qualifier); }
-#line 5638 "tools/widl/parser.tab.c"
+#line 5964 "tools/widl/parser.tab.c"
     break;
 
   case 402: /* decl_spec: type m_decl_spec_no_type  */
 #line 1184 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, 0, 0); }
-#line 5644 "tools/widl/parser.tab.c"
+#line 5970 "tools/widl/parser.tab.c"
     break;
 
   case 403: /* decl_spec: decl_spec_no_type type m_decl_spec_no_type  */
 #line 1186 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, 0, 0); }
-#line 5650 "tools/widl/parser.tab.c"
+#line 5976 "tools/widl/parser.tab.c"
     break;
 
   case 404: /* unqualified_decl_spec: unqualified_type m_decl_spec_no_type  */
 #line 1190 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[0].declspec), NULL, STG_NONE, 0, 0); }
-#line 5656 "tools/widl/parser.tab.c"
+#line 5982 "tools/widl/parser.tab.c"
     break;
 
   case 405: /* unqualified_decl_spec: decl_spec_no_type unqualified_type m_decl_spec_no_type  */
 #line 1192 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec((yyvsp[-1].type), (yyvsp[-2].declspec), (yyvsp[0].declspec), STG_NONE, 0, 0); }
-#line 5662 "tools/widl/parser.tab.c"
+#line 5988 "tools/widl/parser.tab.c"
     break;
 
   case 406: /* m_decl_spec_no_type: %empty  */
 #line 1196 "tools/widl/parser.y"
                                                 { (yyval.declspec) = NULL; }
-#line 5668 "tools/widl/parser.tab.c"
+#line 5994 "tools/widl/parser.tab.c"
     break;
 
   case 408: /* decl_spec_no_type: type_qualifier m_decl_spec_no_type  */
 #line 1201 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, (yyvsp[-1].type_qualifier), 0); }
-#line 5674 "tools/widl/parser.tab.c"
+#line 6000 "tools/widl/parser.tab.c"
     break;
 
   case 409: /* decl_spec_no_type: function_specifier m_decl_spec_no_type  */
 #line 1202 "tools/widl/parser.y"
                                                   { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, STG_NONE, 0, (yyvsp[-1].function_specifier)); }
-#line 5680 "tools/widl/parser.tab.c"
+#line 6006 "tools/widl/parser.tab.c"
     break;
 
   case 410: /* decl_spec_no_type: storage_cls_spec m_decl_spec_no_type  */
 #line 1203 "tools/widl/parser.y"
                                                 { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[0].declspec), NULL, (yyvsp[-1].stgclass), 0, 0); }
-#line 5686 "tools/widl/parser.tab.c"
+#line 6012 "tools/widl/parser.tab.c"
     break;
 
   case 411: /* declarator: '*' m_type_qual_list declarator  */
 #line 1208 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5692 "tools/widl/parser.tab.c"
+#line 6018 "tools/widl/parser.tab.c"
     break;
 
   case 412: /* declarator: callconv declarator  */
 #line 1209 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv( (yyloc), (yyval.declarator)->type, (yyvsp[-1].str) ); }
-#line 5698 "tools/widl/parser.tab.c"
+#line 6024 "tools/widl/parser.tab.c"
     break;
 
   case 414: /* direct_declarator: ident  */
 #line 1214 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
-#line 5704 "tools/widl/parser.tab.c"
+#line 6030 "tools/widl/parser.tab.c"
     break;
 
   case 415: /* direct_declarator: '(' declarator ')'  */
 #line 1215 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5710 "tools/widl/parser.tab.c"
+#line 6036 "tools/widl/parser.tab.c"
     break;
 
   case 416: /* direct_declarator: direct_declarator array  */
 #line 1216 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5716 "tools/widl/parser.tab.c"
+#line 6042 "tools/widl/parser.tab.c"
     break;
 
   case 417: /* direct_declarator: direct_declarator '(' m_args ')'  */
 #line 1217 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-3].declarator); append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0); }
-#line 5722 "tools/widl/parser.tab.c"
+#line 6048 "tools/widl/parser.tab.c"
     break;
 
   case 418: /* abstract_declarator: '*' m_type_qual_list m_abstract_declarator  */
 #line 1223 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5728 "tools/widl/parser.tab.c"
+#line 6054 "tools/widl/parser.tab.c"
     break;
 
   case 419: /* abstract_declarator: callconv m_abstract_declarator  */
 #line 1224 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv( (yyloc), (yyval.declarator)->type, (yyvsp[-1].str) ); }
-#line 5734 "tools/widl/parser.tab.c"
+#line 6060 "tools/widl/parser.tab.c"
     break;
 
   case 421: /* abstract_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
 #line 1231 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5740 "tools/widl/parser.tab.c"
+#line 6066 "tools/widl/parser.tab.c"
     break;
 
   case 422: /* abstract_declarator_no_direct: callconv m_any_declarator  */
 #line 1232 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv( (yyloc), (yyval.declarator)->type, (yyvsp[-1].str) ); }
-#line 5746 "tools/widl/parser.tab.c"
+#line 6072 "tools/widl/parser.tab.c"
     break;
 
   case 423: /* m_abstract_declarator: %empty  */
 #line 1237 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); }
-#line 5752 "tools/widl/parser.tab.c"
+#line 6078 "tools/widl/parser.tab.c"
     break;
 
   case 425: /* abstract_direct_declarator: '(' abstract_declarator_no_direct ')'  */
 #line 1243 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5758 "tools/widl/parser.tab.c"
+#line 6084 "tools/widl/parser.tab.c"
     break;
 
   case 426: /* abstract_direct_declarator: abstract_direct_declarator array  */
 #line 1244 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5764 "tools/widl/parser.tab.c"
+#line 6090 "tools/widl/parser.tab.c"
     break;
 
   case 427: /* abstract_direct_declarator: array  */
 #line 1245 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5770 "tools/widl/parser.tab.c"
+#line 6096 "tools/widl/parser.tab.c"
     break;
 
   case 428: /* abstract_direct_declarator: '(' m_args ')'  */
@@ -5774,7 +6100,7 @@
                                                 { (yyval.declarator) = make_declarator(NULL);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5778 "tools/widl/parser.tab.c"
+#line 6104 "tools/widl/parser.tab.c"
     break;
 
   case 429: /* abstract_direct_declarator: abstract_direct_declarator '(' m_args ')'  */
@@ -5782,61 +6108,61 @@
                                                 { (yyval.declarator) = (yyvsp[-3].declarator);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5786 "tools/widl/parser.tab.c"
+#line 6112 "tools/widl/parser.tab.c"
     break;
 
   case 430: /* any_declarator: '*' m_type_qual_list m_any_declarator  */
 #line 1259 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5792 "tools/widl/parser.tab.c"
+#line 6118 "tools/widl/parser.tab.c"
     break;
 
   case 431: /* any_declarator: callconv m_any_declarator  */
 #line 1260 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv( (yyloc), (yyval.declarator)->type, (yyvsp[-1].str) ); }
-#line 5798 "tools/widl/parser.tab.c"
+#line 6124 "tools/widl/parser.tab.c"
     break;
 
   case 433: /* any_declarator_no_direct: '*' m_type_qual_list m_any_declarator  */
 #line 1267 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_type((yyval.declarator), type_new_pointer(NULL), (yyvsp[-1].type_qualifier)); }
-#line 5804 "tools/widl/parser.tab.c"
+#line 6130 "tools/widl/parser.tab.c"
     break;
 
   case 434: /* any_declarator_no_direct: callconv m_any_declarator  */
 #line 1268 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); append_chain_callconv( (yyloc), (yyval.declarator)->type, (yyvsp[-1].str) ); }
-#line 5810 "tools/widl/parser.tab.c"
+#line 6136 "tools/widl/parser.tab.c"
     break;
 
   case 435: /* m_any_declarator: %empty  */
 #line 1273 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); }
-#line 5816 "tools/widl/parser.tab.c"
+#line 6142 "tools/widl/parser.tab.c"
     break;
 
   case 437: /* any_direct_declarator: ident  */
 #line 1281 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator((yyvsp[0].var)); }
-#line 5822 "tools/widl/parser.tab.c"
+#line 6148 "tools/widl/parser.tab.c"
     break;
 
   case 438: /* any_direct_declarator: '(' any_declarator_no_direct ')'  */
 #line 1282 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); }
-#line 5828 "tools/widl/parser.tab.c"
+#line 6154 "tools/widl/parser.tab.c"
     break;
 
   case 439: /* any_direct_declarator: any_direct_declarator array  */
 #line 1283 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-1].declarator); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5834 "tools/widl/parser.tab.c"
+#line 6160 "tools/widl/parser.tab.c"
     break;
 
   case 440: /* any_direct_declarator: array  */
 #line 1284 "tools/widl/parser.y"
                                                 { (yyval.declarator) = make_declarator(NULL); append_array((yyval.declarator), (yyvsp[0].expr)); }
-#line 5840 "tools/widl/parser.tab.c"
+#line 6166 "tools/widl/parser.tab.c"
     break;
 
   case 441: /* any_direct_declarator: '(' m_args ')'  */
@@ -5844,7 +6170,7 @@
                                                 { (yyval.declarator) = make_declarator(NULL);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5848 "tools/widl/parser.tab.c"
+#line 6174 "tools/widl/parser.tab.c"
     break;
 
   case 442: /* any_direct_declarator: any_direct_declarator '(' m_args ')'  */
@@ -5852,31 +6178,31 @@
                                                 { (yyval.declarator) = (yyvsp[-3].declarator);
 						  append_chain_type((yyval.declarator), type_new_function((yyvsp[-1].var_list)), 0);
 						}
-#line 5856 "tools/widl/parser.tab.c"
+#line 6182 "tools/widl/parser.tab.c"
     break;
 
   case 443: /* declarator_list: declarator  */
 #line 1296 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
-#line 5862 "tools/widl/parser.tab.c"
+#line 6188 "tools/widl/parser.tab.c"
     break;
 
   case 444: /* declarator_list: declarator_list ',' declarator  */
 #line 1297 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
-#line 5868 "tools/widl/parser.tab.c"
+#line 6194 "tools/widl/parser.tab.c"
     break;
 
   case 445: /* m_bitfield: %empty  */
 #line 1301 "tools/widl/parser.y"
                                                 { (yyval.expr) = NULL; }
-#line 5874 "tools/widl/parser.tab.c"
+#line 6200 "tools/widl/parser.tab.c"
     break;
 
   case 446: /* m_bitfield: ':' expr_const  */
 #line 1302 "tools/widl/parser.y"
                                                 { (yyval.expr) = (yyvsp[0].expr); }
-#line 5880 "tools/widl/parser.tab.c"
+#line 6206 "tools/widl/parser.tab.c"
     break;
 
   case 447: /* struct_declarator: any_declarator m_bitfield  */
@@ -5885,163 +6211,163 @@
 						  if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name)
 						    error_loc("unnamed fields are not allowed\n");
 						}
-#line 5889 "tools/widl/parser.tab.c"
+#line 6215 "tools/widl/parser.tab.c"
     break;
 
   case 448: /* struct_declarator_list: struct_declarator  */
 #line 1312 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[0].declarator) ); }
-#line 5895 "tools/widl/parser.tab.c"
+#line 6221 "tools/widl/parser.tab.c"
     break;
 
   case 449: /* struct_declarator_list: struct_declarator_list ',' struct_declarator  */
 #line 1314 "tools/widl/parser.y"
                                                 { (yyval.declarator_list) = append_declarator( (yyvsp[-2].declarator_list), (yyvsp[0].declarator) ); }
-#line 5901 "tools/widl/parser.tab.c"
+#line 6227 "tools/widl/parser.tab.c"
     break;
 
   case 450: /* init_declarator: declarator  */
 #line 1318 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[0].declarator); }
-#line 5907 "tools/widl/parser.tab.c"
+#line 6233 "tools/widl/parser.tab.c"
     break;
 
   case 451: /* init_declarator: declarator '=' expr_const  */
 #line 1319 "tools/widl/parser.y"
                                                 { (yyval.declarator) = (yyvsp[-2].declarator); (yyvsp[-2].declarator)->var->eval = (yyvsp[0].expr); }
-#line 5913 "tools/widl/parser.tab.c"
+#line 6239 "tools/widl/parser.tab.c"
     break;
 
   case 452: /* threading_type: tAPARTMENT  */
 #line 1323 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_APARTMENT; }
-#line 5919 "tools/widl/parser.tab.c"
+#line 6245 "tools/widl/parser.tab.c"
     break;
 
   case 453: /* threading_type: tNEUTRAL  */
 #line 1324 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_NEUTRAL; }
-#line 5925 "tools/widl/parser.tab.c"
+#line 6251 "tools/widl/parser.tab.c"
     break;
 
   case 454: /* threading_type: tSINGLE  */
 #line 1325 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_SINGLE; }
-#line 5931 "tools/widl/parser.tab.c"
+#line 6257 "tools/widl/parser.tab.c"
     break;
 
   case 455: /* threading_type: tFREE  */
 #line 1326 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_FREE; }
-#line 5937 "tools/widl/parser.tab.c"
+#line 6263 "tools/widl/parser.tab.c"
     break;
 
   case 456: /* threading_type: tBOTH  */
 #line 1327 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_BOTH; }
-#line 5943 "tools/widl/parser.tab.c"
+#line 6269 "tools/widl/parser.tab.c"
     break;
 
   case 457: /* threading_type: tMTA  */
 #line 1328 "tools/widl/parser.y"
                                                 { (yyval.num) = THREADING_FREE; }
-#line 5949 "tools/widl/parser.tab.c"
+#line 6275 "tools/widl/parser.tab.c"
     break;
 
   case 458: /* pointer_type: tREF  */
 #line 1332 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_RP; }
-#line 5955 "tools/widl/parser.tab.c"
+#line 6281 "tools/widl/parser.tab.c"
     break;
 
   case 459: /* pointer_type: tUNIQUE  */
 #line 1333 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_UP; }
-#line 5961 "tools/widl/parser.tab.c"
+#line 6287 "tools/widl/parser.tab.c"
     break;
 
   case 460: /* pointer_type: tPTR  */
 #line 1334 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_FP; }
-#line 5967 "tools/widl/parser.tab.c"
+#line 6293 "tools/widl/parser.tab.c"
     break;
 
   case 461: /* structdef: tSTRUCT m_typename '{' fields '}'  */
 #line 1337 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 5973 "tools/widl/parser.tab.c"
+#line 6299 "tools/widl/parser.tab.c"
     break;
 
   case 462: /* unqualified_type: tVOID  */
 #line 1341 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_void(); }
-#line 5979 "tools/widl/parser.tab.c"
+#line 6305 "tools/widl/parser.tab.c"
     break;
 
   case 463: /* unqualified_type: base_type  */
 #line 1342 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5985 "tools/widl/parser.tab.c"
+#line 6311 "tools/widl/parser.tab.c"
     break;
 
   case 464: /* unqualified_type: enumdef  */
 #line 1343 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 5991 "tools/widl/parser.tab.c"
+#line 6317 "tools/widl/parser.tab.c"
     break;
 
   case 465: /* unqualified_type: tENUM aIDENTIFIER  */
 #line 1344 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_enum((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 5997 "tools/widl/parser.tab.c"
+#line 6323 "tools/widl/parser.tab.c"
     break;
 
   case 466: /* unqualified_type: structdef  */
 #line 1345 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 6003 "tools/widl/parser.tab.c"
+#line 6329 "tools/widl/parser.tab.c"
     break;
 
   case 467: /* unqualified_type: tSTRUCT aIDENTIFIER  */
 #line 1346 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_struct((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 6009 "tools/widl/parser.tab.c"
+#line 6335 "tools/widl/parser.tab.c"
     break;
 
   case 468: /* unqualified_type: uniondef  */
 #line 1347 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 6015 "tools/widl/parser.tab.c"
+#line 6341 "tools/widl/parser.tab.c"
     break;
 
   case 469: /* unqualified_type: tUNION aIDENTIFIER  */
 #line 1348 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[0].str), current_namespace, FALSE, NULL); }
-#line 6021 "tools/widl/parser.tab.c"
+#line 6347 "tools/widl/parser.tab.c"
     break;
 
   case 470: /* unqualified_type: tSAFEARRAY '(' type ')'  */
 #line 1349 "tools/widl/parser.y"
                                                 { (yyval.type) = make_safearray((yyvsp[-1].type)); }
-#line 6027 "tools/widl/parser.tab.c"
+#line 6353 "tools/widl/parser.tab.c"
     break;
 
   case 471: /* unqualified_type: aKNOWNTYPE  */
 #line 1350 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error(current_namespace, (yyvsp[0].str)); }
-#line 6033 "tools/widl/parser.tab.c"
+#line 6359 "tools/widl/parser.tab.c"
     break;
 
   case 473: /* type: namespace_pfx typename  */
 #line 1355 "tools/widl/parser.y"
                                                 { (yyval.type) = find_type_or_error((yyvsp[-1].namespace), (yyvsp[0].str)); }
-#line 6039 "tools/widl/parser.tab.c"
+#line 6365 "tools/widl/parser.tab.c"
     break;
 
   case 474: /* type: parameterized_type  */
 #line 1356 "tools/widl/parser.y"
                                                 { (yyval.type) = (yyvsp[0].type); }
-#line 6045 "tools/widl/parser.tab.c"
+#line 6371 "tools/widl/parser.tab.c"
     break;
 
   case 475: /* typedef: m_attributes tTYPEDEF m_attributes decl_spec declarator_list  */
@@ -6050,37 +6376,37 @@
 						  reg_typedefs( (yyloc), (yyvsp[-1].declspec), (yyvsp[0].declarator_list), check_typedef_attrs( (yyvsp[-4].attr_list) ) );
 						  (yyval.statement) = make_statement_typedef((yyvsp[0].declarator_list), !(yyvsp[-1].declspec)->type->defined);
 						}
-#line 6054 "tools/widl/parser.tab.c"
+#line 6380 "tools/widl/parser.tab.c"
     break;
 
   case 476: /* uniondef: tUNION m_typename '{' ne_union_fields '}'  */
 #line 1367 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_nonencapsulated_union((yyvsp[-3].str), current_namespace, TRUE, (yyvsp[-1].var_list)); }
-#line 6060 "tools/widl/parser.tab.c"
+#line 6386 "tools/widl/parser.tab.c"
     break;
 
   case 477: /* uniondef: tUNION m_typename tSWITCH '(' s_field ')' m_ident '{' cases '}'  */
 #line 1370 "tools/widl/parser.y"
                                                 { (yyval.type) = type_new_encapsulated_union((yyvsp[-8].str), (yyvsp[-5].var), (yyvsp[-3].var), (yyvsp[-1].var_list)); }
-#line 6066 "tools/widl/parser.tab.c"
+#line 6392 "tools/widl/parser.tab.c"
     break;
 
   case 478: /* version: aNUM  */
 #line 1374 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[0].num), 0); }
-#line 6072 "tools/widl/parser.tab.c"
+#line 6398 "tools/widl/parser.tab.c"
     break;
 
   case 479: /* version: aNUM '.' aNUM  */
 #line 1375 "tools/widl/parser.y"
                                                 { (yyval.num) = MAKEVERSION((yyvsp[-2].num), (yyvsp[0].num)); }
-#line 6078 "tools/widl/parser.tab.c"
+#line 6404 "tools/widl/parser.tab.c"
     break;
 
   case 480: /* version: aHEXNUM  */
 #line 1376 "tools/widl/parser.y"
                                                 { (yyval.num) = (yyvsp[0].num); }
-#line 6084 "tools/widl/parser.tab.c"
+#line 6410 "tools/widl/parser.tab.c"
     break;
 
   case 485: /* acf_int_statement: tTYPEDEF acf_attributes aKNOWNTYPE ';'  */
@@ -6088,7 +6414,7 @@
                                                 { type_t *type = find_type_or_error(current_namespace, (yyvsp[-1].str));
                                                   type->attrs = append_attr_list(type->attrs, (yyvsp[-2].attr_list));
                                                 }
-#line 6092 "tools/widl/parser.tab.c"
+#line 6418 "tools/widl/parser.tab.c"
     break;
 
   case 486: /* acf_interface: acf_attributes tINTERFACE aKNOWNTYPE '{' acf_int_statements '}'  */
@@ -6098,95 +6424,95 @@
                                                        error_loc("%s is not an interface\n", iface->name);
                                                    iface->attrs = append_attr_list(iface->attrs, (yyvsp[-5].attr_list));
                                                 }
-#line 6102 "tools/widl/parser.tab.c"
+#line 6428 "tools/widl/parser.tab.c"
     break;
 
   case 487: /* acf_attributes: %empty  */
 #line 1406 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = NULL; }
-#line 6108 "tools/widl/parser.tab.c"
+#line 6434 "tools/widl/parser.tab.c"
     break;
 
   case 488: /* acf_attributes: '[' acf_attribute_list ']'  */
 #line 1407 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = (yyvsp[-1].attr_list); }
-#line 6114 "tools/widl/parser.tab.c"
+#line 6440 "tools/widl/parser.tab.c"
     break;
 
   case 489: /* acf_attribute_list: acf_attribute  */
 #line 1411 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr(NULL, (yyvsp[0].attr)); }
-#line 6120 "tools/widl/parser.tab.c"
+#line 6446 "tools/widl/parser.tab.c"
     break;
 
   case 490: /* acf_attribute_list: acf_attribute_list ',' acf_attribute  */
 #line 1412 "tools/widl/parser.y"
                                                 { (yyval.attr_list) = append_attr((yyvsp[-2].attr_list), (yyvsp[0].attr)); }
-#line 6126 "tools/widl/parser.tab.c"
+#line 6452 "tools/widl/parser.tab.c"
     break;
 
   case 491: /* acf_attribute: tALLOCATE '(' allocate_option_list ')'  */
 #line 1417 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_ALLOCATE, (yyvsp[-1].num) ); }
-#line 6132 "tools/widl/parser.tab.c"
+#line 6458 "tools/widl/parser.tab.c"
     break;
 
   case 492: /* acf_attribute: tENCODE  */
 #line 1418 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_ENCODE, 0 ); }
-#line 6138 "tools/widl/parser.tab.c"
+#line 6464 "tools/widl/parser.tab.c"
     break;
 
   case 493: /* acf_attribute: tDECODE  */
 #line 1419 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_DECODE, 0 ); }
-#line 6144 "tools/widl/parser.tab.c"
+#line 6470 "tools/widl/parser.tab.c"
     break;
 
   case 494: /* acf_attribute: tEXPLICITHANDLE  */
 #line 1420 "tools/widl/parser.y"
                                                 { (yyval.attr) = attr_int( (yyloc), ATTR_EXPLICIT_HANDLE, 0 ); }
-#line 6150 "tools/widl/parser.tab.c"
+#line 6476 "tools/widl/parser.tab.c"
     break;
 
   case 495: /* allocate_option_list: allocate_option  */
 #line 1424 "tools/widl/parser.y"
                                                 { (yyval.num) = (yyvsp[0].num); }
-#line 6156 "tools/widl/parser.tab.c"
+#line 6482 "tools/widl/parser.tab.c"
     break;
 
   case 496: /* allocate_option_list: allocate_option_list ',' allocate_option  */
 #line 1426 "tools/widl/parser.y"
                                                 { (yyval.num) = (yyvsp[-2].num) | (yyvsp[0].num); }
-#line 6162 "tools/widl/parser.tab.c"
+#line 6488 "tools/widl/parser.tab.c"
     break;
 
   case 497: /* allocate_option: tDONTFREE  */
 #line 1430 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_DONT_FREE; }
-#line 6168 "tools/widl/parser.tab.c"
+#line 6494 "tools/widl/parser.tab.c"
     break;
 
   case 498: /* allocate_option: tFREE  */
 #line 1431 "tools/widl/parser.y"
                                                 { (yyval.num) = 0; }
-#line 6174 "tools/widl/parser.tab.c"
+#line 6500 "tools/widl/parser.tab.c"
     break;
 
   case 499: /* allocate_option: tALLNODES  */
 #line 1432 "tools/widl/parser.y"
                                                 { (yyval.num) = FC_ALLOCATE_ALL_NODES; }
-#line 6180 "tools/widl/parser.tab.c"
+#line 6506 "tools/widl/parser.tab.c"
     break;
 
   case 500: /* allocate_option: tSINGLENODE  */
 #line 1433 "tools/widl/parser.y"
                                                 { (yyval.num) = 0; }
-#line 6186 "tools/widl/parser.tab.c"
+#line 6512 "tools/widl/parser.tab.c"
     break;
 
 
-#line 6190 "tools/widl/parser.tab.c"
+#line 6516 "tools/widl/parser.tab.c"
 
       default: break;
     }
diff --git a/mingw-w64-tools/widl/src/ppy.tab.c b/mingw-w64-tools/widl/src/ppy.tab.c
index c79a7b0..57b4bae 100644
--- a/mingw-w64-tools/widl/src/ppy.tab.c
+++ b/mingw-w64-tools/widl/src/ppy.tab.c
@@ -195,7 +195,113 @@
 #  endif
 # endif
 
-#include "ppy.tab.h"
+
+/* Debug traces.  */
+#ifndef PPY_DEBUG
+# if defined YYDEBUG
+#if YYDEBUG
+#   define PPY_DEBUG 1
+#  else
+#   define PPY_DEBUG 0
+#  endif
+# else /* ! defined YYDEBUG */
+#  define PPY_DEBUG 0
+# endif /* ! defined YYDEBUG */
+#endif  /* ! defined PPY_DEBUG */
+#if PPY_DEBUG
+extern int ppy_debug;
+#endif
+
+/* Token kinds.  */
+#ifndef PPY_TOKENTYPE
+# define PPY_TOKENTYPE
+  enum ppy_tokentype
+  {
+    PPY_EMPTY = -2,
+    PPY_EOF = 0,                   /* "end of file"  */
+    PPY_error = 256,               /* error  */
+    PPY_UNDEF = 257,               /* "invalid token"  */
+    tRCINCLUDE = 258,              /* tRCINCLUDE  */
+    tIF = 259,                     /* tIF  */
+    tIFDEF = 260,                  /* tIFDEF  */
+    tIFNDEF = 261,                 /* tIFNDEF  */
+    tELSE = 262,                   /* tELSE  */
+    tELIF = 263,                   /* tELIF  */
+    tENDIF = 264,                  /* tENDIF  */
+    tDEFINED = 265,                /* tDEFINED  */
+    tNL = 266,                     /* tNL  */
+    tINCLUDE = 267,                /* tINCLUDE  */
+    tLINE = 268,                   /* tLINE  */
+    tGCCLINE = 269,                /* tGCCLINE  */
+    tERROR = 270,                  /* tERROR  */
+    tWARNING = 271,                /* tWARNING  */
+    tPRAGMA = 272,                 /* tPRAGMA  */
+    tPPIDENT = 273,                /* tPPIDENT  */
+    tUNDEF = 274,                  /* tUNDEF  */
+    tMACROEND = 275,               /* tMACROEND  */
+    tCONCAT = 276,                 /* tCONCAT  */
+    tELLIPSIS = 277,               /* tELLIPSIS  */
+    tSTRINGIZE = 278,              /* tSTRINGIZE  */
+    tIDENT = 279,                  /* tIDENT  */
+    tLITERAL = 280,                /* tLITERAL  */
+    tMACRO = 281,                  /* tMACRO  */
+    tDEFINE = 282,                 /* tDEFINE  */
+    tDQSTRING = 283,               /* tDQSTRING  */
+    tSQSTRING = 284,               /* tSQSTRING  */
+    tIQSTRING = 285,               /* tIQSTRING  */
+    tUINT = 286,                   /* tUINT  */
+    tSINT = 287,                   /* tSINT  */
+    tULONG = 288,                  /* tULONG  */
+    tSLONG = 289,                  /* tSLONG  */
+    tULONGLONG = 290,              /* tULONGLONG  */
+    tSLONGLONG = 291,              /* tSLONGLONG  */
+    tRCINCLUDEPATH = 292,          /* tRCINCLUDEPATH  */
+    tLOGOR = 293,                  /* tLOGOR  */
+    tLOGAND = 294,                 /* tLOGAND  */
+    tEQ = 295,                     /* tEQ  */
+    tNE = 296,                     /* tNE  */
+    tLTE = 297,                    /* tLTE  */
+    tGTE = 298,                    /* tGTE  */
+    tLSHIFT = 299,                 /* tLSHIFT  */
+    tRSHIFT = 300                  /* tRSHIFT  */
+  };
+  typedef enum ppy_tokentype ppy_token_kind_t;
+#endif
+
+/* Value type.  */
+#if ! defined PPY_STYPE && ! defined PPY_STYPE_IS_DECLARED
+union PPY_STYPE
+{
+#line 121 "tools/wrc/ppy.y"
+
+	int		sint;
+	unsigned int	uint;
+	long		slong;
+	unsigned long	ulong;
+	__int64		sll;
+	unsigned __int64 ull;
+	int		*iptr;
+	char		*cptr;
+	cval_t		cval;
+	char		*marg;
+	mtext_t		*mtext;
+
+#line 290 "tools/wrc/ppy.tab.c"
+
+};
+typedef union PPY_STYPE PPY_STYPE;
+# define PPY_STYPE_IS_TRIVIAL 1
+# define PPY_STYPE_IS_DECLARED 1
+#endif
+
+
+extern PPY_STYPE ppy_lval;
+
+
+int ppy_parse (void);
+
+
+
 /* Symbol kind.  */
 enum yysymbol_kind_t
 {
@@ -1365,25 +1471,25 @@
   case 4: /* preprocessor: tINCLUDE tDQSTRING tNL  */
 #line 181 "tools/wrc/ppy.y"
                                         { pp_do_include((yyvsp[-1].cptr), 1); }
-#line 1369 "tools/wrc/ppy.tab.c"
+#line 1475 "tools/wrc/ppy.tab.c"
     break;
 
   case 5: /* preprocessor: tINCLUDE tIQSTRING tNL  */
 #line 182 "tools/wrc/ppy.y"
                                         { pp_do_include((yyvsp[-1].cptr), 0); }
-#line 1375 "tools/wrc/ppy.tab.c"
+#line 1481 "tools/wrc/ppy.tab.c"
     break;
 
   case 6: /* preprocessor: tIF pp_expr tNL  */
 #line 183 "tools/wrc/ppy.y"
                                 { pp_next_if_state(boolean(&(yyvsp[-1].cval))); }
-#line 1381 "tools/wrc/ppy.tab.c"
+#line 1487 "tools/wrc/ppy.tab.c"
     break;
 
   case 7: /* preprocessor: tIFDEF tIDENT tNL  */
 #line 184 "tools/wrc/ppy.y"
                                 { pp_next_if_state(pplookup((yyvsp[-1].cptr)) != NULL); free((yyvsp[-1].cptr)); }
-#line 1387 "tools/wrc/ppy.tab.c"
+#line 1493 "tools/wrc/ppy.tab.c"
     break;
 
   case 8: /* preprocessor: tIFNDEF tIDENT tNL  */
@@ -1408,7 +1514,7 @@
 			fprintf(stderr, "tIFNDEF: %s:%d: include_state=%d, include_ppp='%s', include_ifdepth=%d\n",
                                 pp_status.input, pp_status.line_number, pp_incl_state.state, pp_incl_state.ppp, pp_incl_state.ifdepth);
 		}
-#line 1412 "tools/wrc/ppy.tab.c"
+#line 1518 "tools/wrc/ppy.tab.c"
     break;
 
   case 9: /* preprocessor: tELIF pp_expr tNL  */
@@ -1435,7 +1541,7 @@
 			break;
 		}
 		}
-#line 1439 "tools/wrc/ppy.tab.c"
+#line 1545 "tools/wrc/ppy.tab.c"
     break;
 
   case 10: /* preprocessor: tELSE tNL  */
@@ -1464,7 +1570,7 @@
 			break;
 		}
 		}
-#line 1468 "tools/wrc/ppy.tab.c"
+#line 1574 "tools/wrc/ppy.tab.c"
     break;
 
   case 11: /* preprocessor: tENDIF tNL  */
@@ -1486,19 +1592,19 @@
 					pp_status.input, pp_status.line_number, pp_incl_state.state, pp_incl_state.ppp, pp_incl_state.ifdepth);
 		}
 		}
-#line 1490 "tools/wrc/ppy.tab.c"
+#line 1596 "tools/wrc/ppy.tab.c"
     break;
 
   case 12: /* preprocessor: tUNDEF tIDENT tNL  */
 #line 268 "tools/wrc/ppy.y"
                                 { pp_del_define((yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1496 "tools/wrc/ppy.tab.c"
+#line 1602 "tools/wrc/ppy.tab.c"
     break;
 
   case 13: /* preprocessor: tDEFINE opt_text tNL  */
 #line 269 "tools/wrc/ppy.y"
                                 { pp_add_define((yyvsp[-2].cptr), (yyvsp[-1].cptr)); free((yyvsp[-2].cptr)); free((yyvsp[-1].cptr)); }
-#line 1502 "tools/wrc/ppy.tab.c"
+#line 1608 "tools/wrc/ppy.tab.c"
     break;
 
   case 14: /* preprocessor: tMACRO res_arg allmargs tMACROEND opt_mtexts tNL  */
@@ -1506,67 +1612,67 @@
                                                                 {
 		pp_add_macro((yyvsp[-5].cptr), macro_args, nmacro_args, macro_variadic, (yyvsp[-1].mtext));
 		}
-#line 1510 "tools/wrc/ppy.tab.c"
+#line 1616 "tools/wrc/ppy.tab.c"
     break;
 
   case 15: /* preprocessor: tLINE tSINT tDQSTRING tNL  */
 #line 273 "tools/wrc/ppy.y"
                                         { if((yyvsp[-1].cptr)) fprintf(ppy_out, "# %d %s\n", (yyvsp[-2].sint) , (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1516 "tools/wrc/ppy.tab.c"
+#line 1622 "tools/wrc/ppy.tab.c"
     break;
 
   case 16: /* preprocessor: tGCCLINE tSINT tDQSTRING tNL  */
 #line 274 "tools/wrc/ppy.y"
                                         { if((yyvsp[-1].cptr)) fprintf(ppy_out, "# %d %s\n", (yyvsp[-2].sint) , (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1522 "tools/wrc/ppy.tab.c"
+#line 1628 "tools/wrc/ppy.tab.c"
     break;
 
   case 17: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tNL  */
 #line 276 "tools/wrc/ppy.y"
                 { if((yyvsp[-2].cptr)) fprintf(ppy_out, "# %d %s %d\n", (yyvsp[-3].sint), (yyvsp[-2].cptr), (yyvsp[-1].sint)); free((yyvsp[-2].cptr)); }
-#line 1528 "tools/wrc/ppy.tab.c"
+#line 1634 "tools/wrc/ppy.tab.c"
     break;
 
   case 18: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tSINT tNL  */
 #line 278 "tools/wrc/ppy.y"
                 { if((yyvsp[-3].cptr)) fprintf(ppy_out, "# %d %s %d %d\n", (yyvsp[-4].sint) ,(yyvsp[-3].cptr), (yyvsp[-2].sint), (yyvsp[-1].sint)); free((yyvsp[-3].cptr)); }
-#line 1534 "tools/wrc/ppy.tab.c"
+#line 1640 "tools/wrc/ppy.tab.c"
     break;
 
   case 19: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tSINT tSINT tNL  */
 #line 280 "tools/wrc/ppy.y"
                 { if((yyvsp[-4].cptr)) fprintf(ppy_out, "# %d %s %d %d %d\n", (yyvsp[-5].sint) ,(yyvsp[-4].cptr) ,(yyvsp[-3].sint) ,(yyvsp[-2].sint), (yyvsp[-1].sint)); free((yyvsp[-4].cptr)); }
-#line 1540 "tools/wrc/ppy.tab.c"
+#line 1646 "tools/wrc/ppy.tab.c"
     break;
 
   case 20: /* preprocessor: tGCCLINE tSINT tDQSTRING tSINT tSINT tSINT tSINT tNL  */
 #line 282 "tools/wrc/ppy.y"
                 { if((yyvsp[-5].cptr)) fprintf(ppy_out, "# %d %s %d %d %d %d\n", (yyvsp[-6].sint) ,(yyvsp[-5].cptr) ,(yyvsp[-4].sint) ,(yyvsp[-3].sint), (yyvsp[-2].sint), (yyvsp[-1].sint)); free((yyvsp[-5].cptr)); }
-#line 1546 "tools/wrc/ppy.tab.c"
+#line 1652 "tools/wrc/ppy.tab.c"
     break;
 
   case 22: /* preprocessor: tERROR opt_text tNL  */
 #line 284 "tools/wrc/ppy.y"
                                 { ppy_error("#error directive: '%s'", (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1552 "tools/wrc/ppy.tab.c"
+#line 1658 "tools/wrc/ppy.tab.c"
     break;
 
   case 23: /* preprocessor: tWARNING opt_text tNL  */
 #line 285 "tools/wrc/ppy.y"
                                 { ppy_warning("#warning directive: '%s'", (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1558 "tools/wrc/ppy.tab.c"
+#line 1664 "tools/wrc/ppy.tab.c"
     break;
 
   case 24: /* preprocessor: tPRAGMA opt_text tNL  */
 #line 286 "tools/wrc/ppy.y"
                                 { fprintf(ppy_out, "#pragma %s\n", (yyvsp[-1].cptr) ? (yyvsp[-1].cptr) : ""); free((yyvsp[-1].cptr)); }
-#line 1564 "tools/wrc/ppy.tab.c"
+#line 1670 "tools/wrc/ppy.tab.c"
     break;
 
   case 25: /* preprocessor: tPPIDENT opt_text tNL  */
 #line 287 "tools/wrc/ppy.y"
                                 { if(pedantic) ppy_warning("#ident ignored (arg: '%s')", (yyvsp[-1].cptr)); free((yyvsp[-1].cptr)); }
-#line 1570 "tools/wrc/ppy.tab.c"
+#line 1676 "tools/wrc/ppy.tab.c"
     break;
 
   case 26: /* preprocessor: tRCINCLUDE tRCINCLUDEPATH  */
@@ -1574,7 +1680,7 @@
                                     {
                 pp_do_include(strmake( "\"%s\"", (yyvsp[0].cptr) ),1);
 	}
-#line 1578 "tools/wrc/ppy.tab.c"
+#line 1684 "tools/wrc/ppy.tab.c"
     break;
 
   case 27: /* preprocessor: tRCINCLUDE tDQSTRING  */
@@ -1582,109 +1688,109 @@
                                {
 		pp_do_include((yyvsp[0].cptr),1);
 	}
-#line 1586 "tools/wrc/ppy.tab.c"
+#line 1692 "tools/wrc/ppy.tab.c"
     break;
 
   case 28: /* opt_text: %empty  */
 #line 297 "tools/wrc/ppy.y"
                         { (yyval.cptr) = NULL; }
-#line 1592 "tools/wrc/ppy.tab.c"
+#line 1698 "tools/wrc/ppy.tab.c"
     break;
 
   case 29: /* opt_text: text  */
 #line 298 "tools/wrc/ppy.y"
                         { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1598 "tools/wrc/ppy.tab.c"
+#line 1704 "tools/wrc/ppy.tab.c"
     break;
 
   case 30: /* text: tLITERAL  */
 #line 301 "tools/wrc/ppy.y"
                                 { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1604 "tools/wrc/ppy.tab.c"
+#line 1710 "tools/wrc/ppy.tab.c"
     break;
 
   case 31: /* text: tDQSTRING  */
 #line 302 "tools/wrc/ppy.y"
                                 { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1610 "tools/wrc/ppy.tab.c"
+#line 1716 "tools/wrc/ppy.tab.c"
     break;
 
   case 32: /* text: tSQSTRING  */
 #line 303 "tools/wrc/ppy.y"
                                 { (yyval.cptr) = (yyvsp[0].cptr); }
-#line 1616 "tools/wrc/ppy.tab.c"
+#line 1722 "tools/wrc/ppy.tab.c"
     break;
 
   case 33: /* text: text tLITERAL  */
 #line 304 "tools/wrc/ppy.y"
                                 { (yyval.cptr) = merge_text((yyvsp[-1].cptr), (yyvsp[0].cptr)); }
-#line 1622 "tools/wrc/ppy.tab.c"
+#line 1728 "tools/wrc/ppy.tab.c"
     break;
 
   case 34: /* text: text tDQSTRING  */
 #line 305 "tools/wrc/ppy.y"
                                 { (yyval.cptr) = merge_text((yyvsp[-1].cptr), (yyvsp[0].cptr)); }
-#line 1628 "tools/wrc/ppy.tab.c"
+#line 1734 "tools/wrc/ppy.tab.c"
     break;
 
   case 35: /* text: text tSQSTRING  */
 #line 306 "tools/wrc/ppy.y"
                                 { (yyval.cptr) = merge_text((yyvsp[-1].cptr), (yyvsp[0].cptr)); }
-#line 1634 "tools/wrc/ppy.tab.c"
+#line 1740 "tools/wrc/ppy.tab.c"
     break;
 
   case 36: /* res_arg: %empty  */
 #line 309 "tools/wrc/ppy.y"
                         { macro_args = NULL; nmacro_args = 0; macro_variadic = 0; }
-#line 1640 "tools/wrc/ppy.tab.c"
+#line 1746 "tools/wrc/ppy.tab.c"
     break;
 
   case 37: /* allmargs: %empty  */
 #line 312 "tools/wrc/ppy.y"
                                 { (yyval.sint) = 0; macro_args = NULL; nmacro_args = 0; macro_variadic = 0; }
-#line 1646 "tools/wrc/ppy.tab.c"
+#line 1752 "tools/wrc/ppy.tab.c"
     break;
 
   case 38: /* allmargs: emargs  */
 #line 313 "tools/wrc/ppy.y"
                                 { (yyval.sint) = nmacro_args; }
-#line 1652 "tools/wrc/ppy.tab.c"
+#line 1758 "tools/wrc/ppy.tab.c"
     break;
 
   case 39: /* emargs: margs  */
 #line 316 "tools/wrc/ppy.y"
                                 { (yyval.marg) = (yyvsp[0].marg); }
-#line 1658 "tools/wrc/ppy.tab.c"
+#line 1764 "tools/wrc/ppy.tab.c"
     break;
 
   case 40: /* emargs: margs ',' tELLIPSIS  */
 #line 317 "tools/wrc/ppy.y"
                                 { macro_variadic = 1; }
-#line 1664 "tools/wrc/ppy.tab.c"
+#line 1770 "tools/wrc/ppy.tab.c"
     break;
 
   case 41: /* emargs: tELLIPSIS  */
 #line 318 "tools/wrc/ppy.y"
                         { macro_args = NULL; nmacro_args = 0; macro_variadic = 1; }
-#line 1670 "tools/wrc/ppy.tab.c"
+#line 1776 "tools/wrc/ppy.tab.c"
     break;
 
   case 42: /* margs: margs ',' tIDENT  */
 #line 321 "tools/wrc/ppy.y"
                                 { (yyval.marg) = add_new_marg((yyvsp[0].cptr)); }
-#line 1676 "tools/wrc/ppy.tab.c"
+#line 1782 "tools/wrc/ppy.tab.c"
     break;
 
   case 43: /* margs: tIDENT  */
 #line 322 "tools/wrc/ppy.y"
                                 { (yyval.marg) = add_new_marg((yyvsp[0].cptr)); }
-#line 1682 "tools/wrc/ppy.tab.c"
+#line 1788 "tools/wrc/ppy.tab.c"
     break;
 
   case 44: /* opt_mtexts: %empty  */
 #line 326 "tools/wrc/ppy.y"
                         { (yyval.mtext) = NULL; }
-#line 1688 "tools/wrc/ppy.tab.c"
+#line 1794 "tools/wrc/ppy.tab.c"
     break;
 
   case 45: /* opt_mtexts: mtexts  */
@@ -1693,43 +1799,43 @@
 		for((yyval.mtext) = (yyvsp[0].mtext); (yyval.mtext) && (yyval.mtext)->prev; (yyval.mtext) = (yyval.mtext)->prev)
 			;
 		}
-#line 1697 "tools/wrc/ppy.tab.c"
+#line 1803 "tools/wrc/ppy.tab.c"
     break;
 
   case 46: /* mtexts: mtext  */
 #line 333 "tools/wrc/ppy.y"
                         { (yyval.mtext) = (yyvsp[0].mtext); }
-#line 1703 "tools/wrc/ppy.tab.c"
+#line 1809 "tools/wrc/ppy.tab.c"
     break;
 
   case 47: /* mtexts: mtexts mtext  */
 #line 334 "tools/wrc/ppy.y"
                         { (yyval.mtext) = combine_mtext((yyvsp[-1].mtext), (yyvsp[0].mtext)); }
-#line 1709 "tools/wrc/ppy.tab.c"
+#line 1815 "tools/wrc/ppy.tab.c"
     break;
 
   case 48: /* mtext: tLITERAL  */
 #line 337 "tools/wrc/ppy.y"
                         { (yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text); }
-#line 1715 "tools/wrc/ppy.tab.c"
+#line 1821 "tools/wrc/ppy.tab.c"
     break;
 
   case 49: /* mtext: tDQSTRING  */
 #line 338 "tools/wrc/ppy.y"
                         { (yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text); }
-#line 1721 "tools/wrc/ppy.tab.c"
+#line 1827 "tools/wrc/ppy.tab.c"
     break;
 
   case 50: /* mtext: tSQSTRING  */
 #line 339 "tools/wrc/ppy.y"
                         { (yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text); }
-#line 1727 "tools/wrc/ppy.tab.c"
+#line 1833 "tools/wrc/ppy.tab.c"
     break;
 
   case 51: /* mtext: tCONCAT  */
 #line 340 "tools/wrc/ppy.y"
                         { (yyval.mtext) = new_mtext(NULL, 0, exp_concat); }
-#line 1733 "tools/wrc/ppy.tab.c"
+#line 1839 "tools/wrc/ppy.tab.c"
     break;
 
   case 52: /* mtext: tSTRINGIZE tIDENT  */
@@ -1741,7 +1847,7 @@
 		else
 			(yyval.mtext) = new_mtext(NULL, mat, exp_stringize);
 		}
-#line 1745 "tools/wrc/ppy.tab.c"
+#line 1851 "tools/wrc/ppy.tab.c"
     break;
 
   case 53: /* mtext: tIDENT  */
@@ -1753,203 +1859,203 @@
 		else if((yyvsp[0].cptr))
 			(yyval.mtext) = new_mtext((yyvsp[0].cptr), 0, exp_text);
 		}
-#line 1757 "tools/wrc/ppy.tab.c"
+#line 1863 "tools/wrc/ppy.tab.c"
     break;
 
   case 54: /* pp_expr: tSINT  */
 #line 357 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = (yyvsp[0].sint); }
-#line 1763 "tools/wrc/ppy.tab.c"
+#line 1869 "tools/wrc/ppy.tab.c"
     break;
 
   case 55: /* pp_expr: tUINT  */
 #line 358 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_uint;  (yyval.cval).val.ui = (yyvsp[0].uint); }
-#line 1769 "tools/wrc/ppy.tab.c"
+#line 1875 "tools/wrc/ppy.tab.c"
     break;
 
   case 56: /* pp_expr: tSLONG  */
 #line 359 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_slong; (yyval.cval).val.sl = (yyvsp[0].slong); }
-#line 1775 "tools/wrc/ppy.tab.c"
+#line 1881 "tools/wrc/ppy.tab.c"
     break;
 
   case 57: /* pp_expr: tULONG  */
 #line 360 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_ulong; (yyval.cval).val.ul = (yyvsp[0].ulong); }
-#line 1781 "tools/wrc/ppy.tab.c"
+#line 1887 "tools/wrc/ppy.tab.c"
     break;
 
   case 58: /* pp_expr: tSLONGLONG  */
 #line 361 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sll;   (yyval.cval).val.sll = (yyvsp[0].sll); }
-#line 1787 "tools/wrc/ppy.tab.c"
+#line 1893 "tools/wrc/ppy.tab.c"
     break;
 
   case 59: /* pp_expr: tULONGLONG  */
 #line 362 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_ull;   (yyval.cval).val.ull = (yyvsp[0].ull); }
-#line 1793 "tools/wrc/ppy.tab.c"
+#line 1899 "tools/wrc/ppy.tab.c"
     break;
 
   case 60: /* pp_expr: tDEFINED tIDENT  */
 #line 363 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = pplookup((yyvsp[0].cptr)) != NULL; }
-#line 1799 "tools/wrc/ppy.tab.c"
+#line 1905 "tools/wrc/ppy.tab.c"
     break;
 
   case 61: /* pp_expr: tDEFINED '(' tIDENT ')'  */
 #line 364 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = pplookup((yyvsp[-1].cptr)) != NULL; }
-#line 1805 "tools/wrc/ppy.tab.c"
+#line 1911 "tools/wrc/ppy.tab.c"
     break;
 
   case 62: /* pp_expr: tIDENT  */
 #line 365 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint;  (yyval.cval).val.si = 0; }
-#line 1811 "tools/wrc/ppy.tab.c"
+#line 1917 "tools/wrc/ppy.tab.c"
     break;
 
   case 63: /* pp_expr: pp_expr tLOGOR pp_expr  */
 #line 366 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint; (yyval.cval).val.si = boolean(&(yyvsp[-2].cval)) || boolean(&(yyvsp[0].cval)); }
-#line 1817 "tools/wrc/ppy.tab.c"
+#line 1923 "tools/wrc/ppy.tab.c"
     break;
 
   case 64: /* pp_expr: pp_expr tLOGAND pp_expr  */
 #line 367 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint; (yyval.cval).val.si = boolean(&(yyvsp[-2].cval)) && boolean(&(yyvsp[0].cval)); }
-#line 1823 "tools/wrc/ppy.tab.c"
+#line 1929 "tools/wrc/ppy.tab.c"
     break;
 
   case 65: /* pp_expr: pp_expr tEQ pp_expr  */
 #line 368 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), ==); }
-#line 1829 "tools/wrc/ppy.tab.c"
+#line 1935 "tools/wrc/ppy.tab.c"
     break;
 
   case 66: /* pp_expr: pp_expr tNE pp_expr  */
 #line 369 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), !=); }
-#line 1835 "tools/wrc/ppy.tab.c"
+#line 1941 "tools/wrc/ppy.tab.c"
     break;
 
   case 67: /* pp_expr: pp_expr '<' pp_expr  */
 #line 370 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  <); }
-#line 1841 "tools/wrc/ppy.tab.c"
+#line 1947 "tools/wrc/ppy.tab.c"
     break;
 
   case 68: /* pp_expr: pp_expr '>' pp_expr  */
 #line 371 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  >); }
-#line 1847 "tools/wrc/ppy.tab.c"
+#line 1953 "tools/wrc/ppy.tab.c"
     break;
 
   case 69: /* pp_expr: pp_expr tLTE pp_expr  */
 #line 372 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), <=); }
-#line 1853 "tools/wrc/ppy.tab.c"
+#line 1959 "tools/wrc/ppy.tab.c"
     break;
 
   case 70: /* pp_expr: pp_expr tGTE pp_expr  */
 #line 373 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), >=); }
-#line 1859 "tools/wrc/ppy.tab.c"
+#line 1965 "tools/wrc/ppy.tab.c"
     break;
 
   case 71: /* pp_expr: pp_expr '+' pp_expr  */
 #line 374 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  +); }
-#line 1865 "tools/wrc/ppy.tab.c"
+#line 1971 "tools/wrc/ppy.tab.c"
     break;
 
   case 72: /* pp_expr: pp_expr '-' pp_expr  */
 #line 375 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  -); }
-#line 1871 "tools/wrc/ppy.tab.c"
+#line 1977 "tools/wrc/ppy.tab.c"
     break;
 
   case 73: /* pp_expr: pp_expr '^' pp_expr  */
 #line 376 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  ^); }
-#line 1877 "tools/wrc/ppy.tab.c"
+#line 1983 "tools/wrc/ppy.tab.c"
     break;
 
   case 74: /* pp_expr: pp_expr '&' pp_expr  */
 #line 377 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  &); }
-#line 1883 "tools/wrc/ppy.tab.c"
+#line 1989 "tools/wrc/ppy.tab.c"
     break;
 
   case 75: /* pp_expr: pp_expr '|' pp_expr  */
 #line 378 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  |); }
-#line 1889 "tools/wrc/ppy.tab.c"
+#line 1995 "tools/wrc/ppy.tab.c"
     break;
 
   case 76: /* pp_expr: pp_expr '*' pp_expr  */
 #line 379 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  *); }
-#line 1895 "tools/wrc/ppy.tab.c"
+#line 2001 "tools/wrc/ppy.tab.c"
     break;
 
   case 77: /* pp_expr: pp_expr '/' pp_expr  */
 #line 380 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval),  /); }
-#line 1901 "tools/wrc/ppy.tab.c"
+#line 2007 "tools/wrc/ppy.tab.c"
     break;
 
   case 78: /* pp_expr: pp_expr tLSHIFT pp_expr  */
 #line 381 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), <<); }
-#line 1907 "tools/wrc/ppy.tab.c"
+#line 2013 "tools/wrc/ppy.tab.c"
     break;
 
   case 79: /* pp_expr: pp_expr tRSHIFT pp_expr  */
 #line 382 "tools/wrc/ppy.y"
                                         { promote_equal_size(&(yyvsp[-2].cval), &(yyvsp[0].cval)); BIN_OP((yyval.cval), (yyvsp[-2].cval), (yyvsp[0].cval), >>); }
-#line 1913 "tools/wrc/ppy.tab.c"
+#line 2019 "tools/wrc/ppy.tab.c"
     break;
 
   case 80: /* pp_expr: '+' pp_expr  */
 #line 383 "tools/wrc/ppy.y"
                                         { (yyval.cval) =  (yyvsp[0].cval); }
-#line 1919 "tools/wrc/ppy.tab.c"
+#line 2025 "tools/wrc/ppy.tab.c"
     break;
 
   case 81: /* pp_expr: '-' pp_expr  */
 #line 384 "tools/wrc/ppy.y"
                                         { UNARY_OP((yyval.cval), (yyvsp[0].cval), -); }
-#line 1925 "tools/wrc/ppy.tab.c"
+#line 2031 "tools/wrc/ppy.tab.c"
     break;
 
   case 82: /* pp_expr: '~' pp_expr  */
 #line 385 "tools/wrc/ppy.y"
                                         { UNARY_OP((yyval.cval), (yyvsp[0].cval), ~); }
-#line 1931 "tools/wrc/ppy.tab.c"
+#line 2037 "tools/wrc/ppy.tab.c"
     break;
 
   case 83: /* pp_expr: '!' pp_expr  */
 #line 386 "tools/wrc/ppy.y"
                                         { (yyval.cval).type = cv_sint; (yyval.cval).val.si = !boolean(&(yyvsp[0].cval)); }
-#line 1937 "tools/wrc/ppy.tab.c"
+#line 2043 "tools/wrc/ppy.tab.c"
     break;
 
   case 84: /* pp_expr: '(' pp_expr ')'  */
 #line 387 "tools/wrc/ppy.y"
                                         { (yyval.cval) =  (yyvsp[-1].cval); }
-#line 1943 "tools/wrc/ppy.tab.c"
+#line 2049 "tools/wrc/ppy.tab.c"
     break;
 
   case 85: /* pp_expr: pp_expr '?' pp_expr ':' pp_expr  */
 #line 388 "tools/wrc/ppy.y"
                                           { (yyval.cval) = boolean(&(yyvsp[-4].cval)) ? (yyvsp[-2].cval) : (yyvsp[0].cval); }
-#line 1949 "tools/wrc/ppy.tab.c"
+#line 2055 "tools/wrc/ppy.tab.c"
     break;
 
 
-#line 1953 "tools/wrc/ppy.tab.c"
+#line 2059 "tools/wrc/ppy.tab.c"
 
       default: break;
     }
diff --git a/mingw-w64-tools/widl/src/typegen.c b/mingw-w64-tools/widl/src/typegen.c
index b3373de..23db655 100644
--- a/mingw-w64-tools/widl/src/typegen.c
+++ b/mingw-w64-tools/widl/src/typegen.c
@@ -234,7 +234,6 @@
 
 static inline unsigned int clamp_align(unsigned int align)
 {
-    unsigned int packing = (pointer_size == 4) ? win32_packing : win64_packing;
     if(align > packing) align = packing;
     return align;
 }
diff --git a/mingw-w64-tools/widl/src/widl.c b/mingw-w64-tools/widl/src/widl.c
index b663d40..6f531a5 100644
--- a/mingw-w64-tools/widl/src/widl.c
+++ b/mingw-w64-tools/widl/src/widl.c
@@ -42,6 +42,7 @@
 "Usage: widl [options...] infile.idl\n"
 "   or: widl [options...] --dlldata-only name1 [name2...]\n"
 "   --acf=file         Use ACF file\n"
+"   --align=n          Set structure packing to 'n'\n"
 "   -app_config        Ignored, present for midl compatibility\n"
 "   -b arch            Set the target architecture\n"
 "   -c                 Generate client stub\n"
@@ -62,6 +63,7 @@
 "   -o, --output=NAME  Set the output file name\n"
 "   -Otype             Type of stubs to generate (-Os, -Oi, -Oif)\n"
 "   -p                 Generate proxy\n"
+"   --packing=n        Set structure packing to 'n'\n"
 "   --prefix-all=p     Prefix names of client stubs / server functions with 'p'\n"
 "   --prefix-client=p  Prefix names of client stubs with 'p'\n"
 "   --prefix-server=p  Prefix names of server functions with 'p'\n"
@@ -74,8 +76,6 @@
 "   -V                 Print version and exit\n"
 "   -W                 Enable pedantic warnings\n"
 "   --win32, --win64   Set the target architecture (Win32 or Win64)\n"
-"   --win32-align n    Set win32 structure alignment to 'n'\n"
-"   --win64-align n    Set win64 structure alignment to 'n'\n"
 "   --winrt            Enable Windows Runtime mode\n"
 "Debug level 'n' is a bitmask with following meaning:\n"
 "    * 0x01 Tell which resource is parsed (verbose mode)\n"
@@ -107,8 +107,6 @@
 int do_dlldata = 0;
 static int no_preprocess = 0;
 int old_names = 0;
-int win32_packing = 8;
-int win64_packing = 8;
 int winrt_mode = 0;
 int use_abi_namespace = 0;
 static int stdinc = 1;
@@ -143,6 +141,7 @@
 
 static FILE *idfile;
 
+unsigned int packing = 8;
 unsigned int pointer_size = 0;
 
 time_t now;
@@ -155,6 +154,7 @@
     DLLDATA_ONLY_OPTION,
     LOCAL_STUBS_OPTION,
     NOSTDINC_OPTION,
+    PACKING_OPTION,
     PREFIX_ALL_OPTION,
     PREFIX_CLIENT_OPTION,
     PREFIX_SERVER_OPTION,
@@ -165,14 +165,13 @@
     SYSROOT_OPTION,
     WIN32_OPTION,
     WIN64_OPTION,
-    WIN32_ALIGN_OPTION,
-    WIN64_ALIGN_OPTION
 };
 
 static const char short_options[] =
     "b:cC:d:D:EhH:I:L:m:No:O:pP:rsS:tT:uU:VW";
 static const struct long_option long_options[] = {
     { "acf", 1, ACF_OPTION },
+    { "align", 1, PACKING_OPTION },
     { "app_config", 0, APP_CONFIG_OPTION },
     { "dlldata", 1, DLLDATA_OPTION },
     { "dlldata-only", 0, DLLDATA_ONLY_OPTION },
@@ -182,6 +181,7 @@
     { "ns_prefix", 0, RT_NS_PREFIX },
     { "oldnames", 0, OLDNAMES_OPTION },
     { "output", 0, 'o' },
+    { "packing", 1, PACKING_OPTION },
     { "prefix-all", 1, PREFIX_ALL_OPTION },
     { "prefix-client", 1, PREFIX_CLIENT_OPTION },
     { "prefix-server", 1, PREFIX_SERVER_OPTION },
@@ -191,8 +191,6 @@
     { "winrt", 0, RT_OPTION },
     { "win32", 0, WIN32_OPTION },
     { "win64", 0, WIN64_OPTION },
-    { "win32-align", 1, WIN32_ALIGN_OPTION },
-    { "win64-align", 1, WIN64_ALIGN_OPTION },
     { NULL }
 };
 
@@ -533,15 +531,10 @@
     case WIN64_OPTION:
       pointer_size = 8;
       break;
-    case WIN32_ALIGN_OPTION:
-      win32_packing = strtol(optarg, NULL, 0);
-      if(win32_packing != 2 && win32_packing != 4 && win32_packing != 8)
-          error("Packing must be one of 2, 4 or 8\n");
-      break;
-    case WIN64_ALIGN_OPTION:
-      win64_packing = strtol(optarg, NULL, 0);
-      if(win64_packing != 2 && win64_packing != 4 && win64_packing != 8)
-          error("Packing must be one of 2, 4 or 8\n");
+    case PACKING_OPTION:
+      packing = strtol(optarg, NULL, 0);
+      if(packing != 2 && packing != 4 && packing != 8)
+          error("Structure packing must be one of 2, 4 or 8\n");
       break;
     case ACF_OPTION:
       acf_name = xstrdup(optarg);
diff --git a/mingw-w64-tools/widl/src/widl.h b/mingw-w64-tools/widl/src/widl.h
index 7595cfe..15ac74b 100644
--- a/mingw-w64-tools/widl/src/widl.h
+++ b/mingw-w64-tools/widl/src/widl.h
@@ -46,8 +46,6 @@
 extern int do_idfile;
 extern int do_dlldata;
 extern int old_names;
-extern int win32_packing;
-extern int win64_packing;
 extern int winrt_mode;
 extern int use_abi_namespace;
 
@@ -69,6 +67,7 @@
 extern char *regscript_token;
 extern const char *prefix_client;
 extern const char *prefix_server;
+extern unsigned int packing;
 extern unsigned int pointer_size;
 extern time_t now;
 
diff --git a/mingw-w64-tools/widl/tools.h b/mingw-w64-tools/widl/tools.h
index 7f99205..5372b5b 100644
--- a/mingw-w64-tools/widl/tools.h
+++ b/mingw-w64-tools/widl/tools.h
@@ -90,7 +90,7 @@
 
 struct target
 {
-    enum { CPU_i386, CPU_x86_64, CPU_ARM, CPU_ARM64 } cpu;
+    enum { CPU_i386, CPU_x86_64, CPU_ARM, CPU_ARM64, CPU_ARM64EC } cpu;
 
     enum
     {
@@ -481,6 +481,7 @@
         [CPU_x86_64]    = 8,
         [CPU_ARM]       = 4,
         [CPU_ARM64]     = 8,
+        [CPU_ARM64EC]   = 8,
     };
     return sizes[target.cpu];
 }
@@ -500,6 +501,7 @@
         if (size == 8) target->cpu = CPU_ARM64;
         break;
     case CPU_ARM64:
+    case CPU_ARM64EC:
         if (size == 4) target->cpu = CPU_ARM;
         break;
     }
@@ -522,6 +524,7 @@
         { "x86_64",    CPU_x86_64 },
         { "amd64",     CPU_x86_64 },
         { "aarch64",   CPU_ARM64 },
+        { "arm64ec",   CPU_ARM64EC },
         { "arm64",     CPU_ARM64 },
         { "arm",       CPU_ARM },
     };
@@ -566,10 +569,11 @@
 {
     static const char *cpu_names[] =
     {
-        [CPU_i386]   = "i386",
-        [CPU_x86_64] = "x86_64",
-        [CPU_ARM]    = "arm",
-        [CPU_ARM64]  = "aarch64"
+        [CPU_i386]    = "i386",
+        [CPU_x86_64]  = "x86_64",
+        [CPU_ARM]     = "arm",
+        [CPU_ARM64]   = "aarch64",
+        [CPU_ARM64EC] = "arm64ec",
     };
 
     if (!cpu_names[target.cpu]) return "";
@@ -769,7 +773,7 @@
     char *start, *end;
     int i;
 
-#define OPT_ERR(fmt) { callback( '?', strmake( fmt, argv[1] )); continue; }
+#define OPT_ERR(fmt) { callback( '?', strmake( fmt, argv[i] )); continue; }
 
     for (i = 1; i < argc; i++)
     {