Changes in / [906e24d:aa8f9df]


Ignore:
Location:
src
Files:
3 added
3 deleted
43 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r906e24d raa8f9df  
    655655        }
    656656
     657        void CodeGenerator::visit( StmtExpr * stmtExpr ) {
     658                output << "(";
     659                stmtExpr->get_statements()->accept( *this );
     660                output << ")";
     661        }
     662
    657663        //*** Statements
    658664        void CodeGenerator::visit( CompoundStmt * compoundStmt ) {
  • src/CodeGen/CodeGenerator.h

    r906e24d raa8f9df  
    7373                virtual void visit( TypeExpr *typeExpr );
    7474                virtual void visit( AsmExpr * );
     75                virtual void visit( StmtExpr * );
    7576
    7677                //*** Statements
  • src/InitTweak/InitTweak.cc

    r906e24d raa8f9df  
    387387                                return memberExpr->get_member()->get_name();
    388388                        } else if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * > ( func ) ) {
    389                                 return memberExpr->get_member();
     389                                return funcName( memberExpr->get_member() );
    390390                        } else {
    391391                                assertf( false, "Unexpected expression type being called as a function in call expression" );
     
    450450                // virtual void visit( LogicalExpr *logicalExpr );
    451451                // virtual void visit( ConditionalExpr *conditionalExpr );
    452                 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
    453                 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }
    454452                virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; }
    455453                virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; }
    456454                virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; }
    457455                virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; }
     456                virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
     457                virtual void visit( TupleAssignExpr *tupleExpr ) { isConstExpr = false; }
    458458
    459459                bool isConstExpr;
  • src/Makefile.in

    r906e24d raa8f9df  
    188188        SynTree/driver_cfa_cpp-Attribute.$(OBJEXT) \
    189189        Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \
    190         Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT)
     190        Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)
    191191am_driver_cfa_cpp_OBJECTS = $(am__objects_1)
    192192driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS)
     
    400400        SynTree/AddStmtVisitor.cc SynTree/TypeSubstitution.cc \
    401401        SynTree/Attribute.cc Tuples/TupleAssignment.cc \
    402         Tuples/NameMatcher.cc
     402        Tuples/TupleExpansion.cc
    403403MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
    404404        ${cfa_cpplib_PROGRAMS}}
     
    764764Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT):  \
    765765        Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp)
    766 Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT): Tuples/$(am__dirstamp) \
    767         Tuples/$(DEPDIR)/$(am__dirstamp)
     766Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT): \
     767        Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp)
    768768driver/$(am__dirstamp):
    769769        @$(MKDIR_P) driver
     
    871871        -rm -f SynTree/driver_cfa_cpp-Visitor.$(OBJEXT)
    872872        -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT)
    873         -rm -f Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT)
    874873        -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT)
     874        -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)
    875875
    876876distclean-compile:
     
    975975@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-Visitor.Po@am__quote@
    976976@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@
    977 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po@am__quote@
    978977@AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@
     978@AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@
    979979
    980980.cc.o:
     
    23802380@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-TupleAssignment.obj `if test -f 'Tuples/TupleAssignment.cc'; then $(CYGPATH_W) 'Tuples/TupleAssignment.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/TupleAssignment.cc'; fi`
    23812381
    2382 Tuples/driver_cfa_cpp-NameMatcher.o: Tuples/NameMatcher.cc
    2383 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-NameMatcher.o -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo -c -o Tuples/driver_cfa_cpp-NameMatcher.o `test -f 'Tuples/NameMatcher.cc' || echo '$(srcdir)/'`Tuples/NameMatcher.cc
    2384 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po
    2385 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.o' libtool=no @AMDEPBACKSLASH@
    2386 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    2387 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-NameMatcher.o `test -f 'Tuples/NameMatcher.cc' || echo '$(srcdir)/'`Tuples/NameMatcher.cc
    2388 
    2389 Tuples/driver_cfa_cpp-NameMatcher.obj: Tuples/NameMatcher.cc
    2390 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-NameMatcher.obj -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo -c -o Tuples/driver_cfa_cpp-NameMatcher.obj `if test -f 'Tuples/NameMatcher.cc'; then $(CYGPATH_W) 'Tuples/NameMatcher.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/NameMatcher.cc'; fi`
    2391 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po
    2392 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.obj' libtool=no @AMDEPBACKSLASH@
    2393 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    2394 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-NameMatcher.obj `if test -f 'Tuples/NameMatcher.cc'; then $(CYGPATH_W) 'Tuples/NameMatcher.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/NameMatcher.cc'; fi`
     2382Tuples/driver_cfa_cpp-TupleExpansion.o: Tuples/TupleExpansion.cc
     2383@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-TupleExpansion.o -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo -c -o Tuples/driver_cfa_cpp-TupleExpansion.o `test -f 'Tuples/TupleExpansion.cc' || echo '$(srcdir)/'`Tuples/TupleExpansion.cc
     2384@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po
     2385@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.o' libtool=no @AMDEPBACKSLASH@
     2386@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2387@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-TupleExpansion.o `test -f 'Tuples/TupleExpansion.cc' || echo '$(srcdir)/'`Tuples/TupleExpansion.cc
     2388
     2389Tuples/driver_cfa_cpp-TupleExpansion.obj: Tuples/TupleExpansion.cc
     2390@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-TupleExpansion.obj -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo -c -o Tuples/driver_cfa_cpp-TupleExpansion.obj `if test -f 'Tuples/TupleExpansion.cc'; then $(CYGPATH_W) 'Tuples/TupleExpansion.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/TupleExpansion.cc'; fi`
     2391@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po
     2392@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.obj' libtool=no @AMDEPBACKSLASH@
     2393@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2394@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-TupleExpansion.obj `if test -f 'Tuples/TupleExpansion.cc'; then $(CYGPATH_W) 'Tuples/TupleExpansion.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/TupleExpansion.cc'; fi`
    23952395
    23962396.ll.cc:
  • src/Parser/ExpressionNode.cc

    r906e24d raa8f9df  
    200200}
    201201
    202 Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member ) {
    203         UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeMoveBuild< Expression >(expr_node) );
    204         delete member;
    205         return ret;
    206 }
    207 
    208 Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member ) {
     202Expression *build_fieldSel( ExpressionNode *expr_node, Expression *member ) {
     203        UntypedMemberExpr *ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
     204        return ret;
     205}
     206
     207Expression *build_pfieldSel( ExpressionNode *expr_node, Expression *member ) {
    209208        UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
    210209        deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) );
    211         UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref );
    212         delete member;
     210        UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref );
    213211        return ret;
    214212}
  • src/Parser/ParseNode.h

    r906e24d raa8f9df  
    165165
    166166Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
    167 Expression * build_fieldSel( ExpressionNode * expr_node, NameExpr * member );
    168 Expression * build_pfieldSel( ExpressionNode * expr_node, NameExpr * member );
     167Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member );
     168Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member );
    169169Expression * build_addressOf( ExpressionNode * expr_node );
    170170Expression * build_sizeOfexpr( ExpressionNode * expr_node );
  • src/Parser/parser.cc

    r906e24d raa8f9df  
    10231023       0,   300,   300,   304,   311,   312,   313,   317,   318,   319,
    10241024     323,   324,   328,   329,   333,   334,   338,   342,   343,   354,
    1025      356,   358,   360,   365,   366,   372,   376,   378,   379,   381,
    1026      382,   384,   386,   388,   397,   398,   404,   405,   409,   410,
    1027      414,   418,   420,   422,   424,   429,   432,   434,   436,   441,
    1028      454,   456,   458,   460,   462,   464,   466,   468,   470,   472,
    1029      474,   481,   482,   488,   489,   490,   491,   495,   496,   498,
    1030      503,   504,   506,   508,   513,   514,   516,   521,   522,   524,
    1031      529,   530,   532,   534,   536,   541,   542,   544,   549,   550,
    1032      555,   556,   561,   562,   567,   568,   573,   574,   579,   580,
    1033      583,   585,   590,   595,   596,   598,   604,   605,   609,   610,
    1034      611,   612,   613,   614,   615,   616,   617,   618,   619,   620,
    1035      626,   628,   630,   632,   637,   638,   643,   644,   650,   651,
    1036      657,   658,   659,   660,   661,   662,   663,   664,   665,   675,
    1037      682,   684,   694,   695,   700,   702,   708,   710,   714,   715,
    1038      720,   725,   728,   730,   732,   742,   744,   755,   756,   758,
    1039      762,   764,   768,   769,   774,   775,   779,   784,   785,   789,
    1040      791,   797,   798,   802,   804,   806,   808,   814,   815,   819,
    1041      821,   826,   828,   830,   835,   837,   842,   844,   848,   851,
    1042      855,   858,   862,   864,   866,   868,   873,   875,   877,   882,
    1043      884,   886,   888,   890,   895,   897,   899,   901,   906,   918,
    1044      919,   924,   926,   931,   935,   937,   939,   941,   943,   949,
    1045      950,   956,   957,   961,   962,   967,   969,   975,   976,   978,
    1046      983,   988,   998,  1000,  1004,  1005,  1010,  1012,  1016,  1017,
    1047     1021,  1023,  1027,  1028,  1032,  1033,  1037,  1038,  1053,  1054,
    1048     1055,  1056,  1057,  1061,  1066,  1073,  1083,  1088,  1093,  1101,
    1049     1106,  1111,  1116,  1121,  1129,  1151,  1156,  1163,  1165,  1172,
    1050     1177,  1182,  1193,  1198,  1203,  1208,  1213,  1222,  1227,  1235,
    1051     1236,  1237,  1238,  1244,  1249,  1257,  1258,  1259,  1260,  1264,
    1052     1265,  1266,  1267,  1272,  1273,  1282,  1283,  1288,  1289,  1294,
    1053     1296,  1298,  1300,  1302,  1305,  1304,  1316,  1317,  1319,  1329,
    1054     1330,  1335,  1337,  1339,  1341,  1343,  1346,  1348,  1351,  1356,
    1055     1358,  1360,  1362,  1364,  1366,  1368,  1370,  1372,  1374,  1376,
    1056     1378,  1380,  1386,  1387,  1389,  1391,  1393,  1398,  1399,  1405,
    1057     1406,  1408,  1410,  1415,  1417,  1419,  1421,  1426,  1427,  1429,
    1058     1431,  1436,  1437,  1439,  1444,  1445,  1447,  1449,  1454,  1456,
    1059     1458,  1463,  1464,  1468,  1470,  1476,  1475,  1479,  1481,  1486,
    1060     1488,  1494,  1495,  1500,  1501,  1503,  1504,  1513,  1514,  1516,
    1061     1518,  1523,  1525,  1531,  1532,  1534,  1537,  1540,  1545,  1546,
    1062     1551,  1556,  1560,  1562,  1568,  1567,  1574,  1576,  1582,  1583,
    1063     1591,  1592,  1596,  1597,  1598,  1600,  1602,  1609,  1610,  1612,
    1064     1614,  1619,  1620,  1626,  1627,  1631,  1632,  1637,  1638,  1639,
    1065     1641,  1649,  1650,  1652,  1655,  1657,  1661,  1662,  1663,  1665,
    1066     1667,  1671,  1676,  1684,  1685,  1694,  1696,  1701,  1702,  1703,
    1067     1707,  1708,  1709,  1713,  1714,  1715,  1719,  1720,  1721,  1726,
    1068     1727,  1728,  1729,  1735,  1736,  1738,  1743,  1744,  1749,  1750,
    1069     1751,  1752,  1753,  1768,  1769,  1774,  1775,  1781,  1783,  1786,
    1070     1788,  1790,  1813,  1814,  1816,  1818,  1823,  1824,  1826,  1831,
    1071     1836,  1837,  1843,  1842,  1846,  1850,  1852,  1854,  1860,  1861,
    1072     1866,  1871,  1873,  1878,  1880,  1881,  1883,  1888,  1890,  1892,
    1073     1897,  1899,  1904,  1909,  1917,  1923,  1922,  1936,  1937,  1942,
    1074     1943,  1947,  1952,  1957,  1965,  1970,  1981,  1982,  1987,  1988,
    1075     1994,  1995,  1999,  2000,  2001,  2004,  2003,  2014,  2023,  2029,
    1076     2035,  2044,  2050,  2056,  2062,  2068,  2076,  2082,  2090,  2096,
    1077     2105,  2106,  2107,  2111,  2115,  2117,  2122,  2123,  2127,  2128,
    1078     2133,  2139,  2140,  2143,  2145,  2146,  2150,  2151,  2152,  2153,
    1079     2187,  2189,  2190,  2192,  2197,  2202,  2207,  2209,  2211,  2216,
    1080     2218,  2220,  2222,  2227,  2229,  2238,  2240,  2241,  2246,  2248,
    1081     2250,  2255,  2257,  2259,  2264,  2266,  2268,  2277,  2278,  2279,
    1082     2283,  2285,  2287,  2292,  2294,  2296,  2301,  2303,  2305,  2320,
    1083     2322,  2323,  2325,  2330,  2331,  2336,  2338,  2340,  2345,  2347,
    1084     2349,  2351,  2356,  2358,  2360,  2370,  2372,  2373,  2375,  2380,
    1085     2382,  2384,  2389,  2391,  2393,  2395,  2400,  2402,  2404,  2435,
    1086     2437,  2438,  2440,  2445,  2450,  2458,  2460,  2462,  2467,  2469,
    1087     2474,  2476,  2490,  2491,  2493,  2498,  2500,  2502,  2504,  2506,
    1088     2511,  2512,  2514,  2516,  2521,  2523,  2525,  2531,  2533,  2535,
    1089     2539,  2541,  2543,  2545,  2559,  2560,  2562,  2567,  2569,  2571,
    1090     2573,  2575,  2580,  2581,  2583,  2585,  2590,  2592,  2594,  2600,
    1091     2601,  2603,  2612,  2615,  2617,  2620,  2622,  2624,  2637,  2638,
    1092     2640,  2645,  2647,  2649,  2651,  2653,  2658,  2659,  2661,  2663,
    1093     2668,  2670,  2678,  2679,  2680,  2685,  2686,  2690,  2692,  2694,
    1094     2696,  2698,  2700,  2707,  2709,  2711,  2713,  2715,  2717,  2719,
    1095     2721,  2723,  2725,  2730,  2732,  2734,  2739,  2765,  2766,  2768,
    1096     2772,  2773,  2777,  2779,  2781,  2783,  2785,  2787,  2794,  2796,
    1097     2798,  2800,  2802,  2804,  2809,  2814,  2816,  2818,  2836,  2838,
    1098     2843,  2844
     1025     356,   358,   360,   365,   366,   372,   376,   378,   380,   382,
     1026     384,   386,   388,   390,   399,   400,   406,   407,   411,   412,
     1027     416,   420,   422,   424,   426,   431,   434,   436,   438,   443,
     1028     456,   458,   460,   462,   464,   466,   468,   470,   472,   474,
     1029     476,   483,   484,   490,   491,   492,   493,   497,   498,   500,
     1030     505,   506,   508,   510,   515,   516,   518,   523,   524,   526,
     1031     531,   532,   534,   536,   538,   543,   544,   546,   551,   552,
     1032     557,   558,   563,   564,   569,   570,   575,   576,   581,   582,
     1033     585,   587,   592,   597,   598,   600,   606,   607,   611,   612,
     1034     613,   614,   615,   616,   617,   618,   619,   620,   621,   622,
     1035     628,   630,   632,   634,   639,   640,   645,   646,   652,   653,
     1036     659,   660,   661,   662,   663,   664,   665,   666,   667,   677,
     1037     684,   686,   696,   697,   702,   704,   710,   712,   716,   717,
     1038     722,   727,   730,   732,   734,   744,   746,   757,   758,   760,
     1039     764,   766,   770,   771,   776,   777,   781,   786,   787,   791,
     1040     793,   799,   800,   804,   806,   808,   810,   816,   817,   821,
     1041     823,   828,   830,   832,   837,   839,   844,   846,   850,   853,
     1042     857,   860,   864,   866,   868,   870,   875,   877,   879,   884,
     1043     886,   888,   890,   892,   897,   899,   901,   903,   908,   920,
     1044     921,   926,   928,   933,   937,   939,   941,   943,   945,   951,
     1045     952,   958,   959,   963,   964,   969,   971,   977,   978,   980,
     1046     985,   990,  1000,  1002,  1006,  1007,  1012,  1014,  1018,  1019,
     1047    1023,  1025,  1029,  1030,  1034,  1035,  1039,  1040,  1055,  1056,
     1048    1057,  1058,  1059,  1063,  1068,  1075,  1085,  1090,  1095,  1103,
     1049    1108,  1113,  1118,  1123,  1131,  1153,  1158,  1165,  1167,  1174,
     1050    1179,  1184,  1195,  1200,  1205,  1210,  1215,  1224,  1229,  1237,
     1051    1238,  1239,  1240,  1246,  1251,  1259,  1260,  1261,  1262,  1266,
     1052    1267,  1268,  1269,  1274,  1275,  1284,  1285,  1290,  1291,  1296,
     1053    1298,  1300,  1302,  1304,  1307,  1306,  1318,  1319,  1321,  1331,
     1054    1332,  1337,  1339,  1341,  1343,  1345,  1348,  1350,  1353,  1358,
     1055    1360,  1362,  1364,  1366,  1368,  1370,  1372,  1374,  1376,  1378,
     1056    1380,  1382,  1388,  1389,  1391,  1393,  1395,  1400,  1401,  1407,
     1057    1408,  1410,  1412,  1417,  1419,  1421,  1423,  1428,  1429,  1431,
     1058    1433,  1438,  1439,  1441,  1446,  1447,  1449,  1451,  1456,  1458,
     1059    1460,  1465,  1466,  1470,  1472,  1478,  1477,  1481,  1483,  1488,
     1060    1490,  1496,  1497,  1502,  1503,  1505,  1506,  1515,  1516,  1518,
     1061    1520,  1525,  1527,  1533,  1534,  1536,  1539,  1542,  1547,  1548,
     1062    1553,  1558,  1562,  1564,  1570,  1569,  1576,  1578,  1584,  1585,
     1063    1593,  1594,  1598,  1599,  1600,  1602,  1604,  1611,  1612,  1614,
     1064    1616,  1621,  1622,  1628,  1629,  1633,  1634,  1639,  1640,  1641,
     1065    1643,  1651,  1652,  1654,  1657,  1659,  1663,  1664,  1665,  1667,
     1066    1669,  1673,  1678,  1686,  1687,  1696,  1698,  1703,  1704,  1705,
     1067    1709,  1710,  1711,  1715,  1716,  1717,  1721,  1722,  1723,  1728,
     1068    1729,  1730,  1731,  1737,  1738,  1740,  1745,  1746,  1751,  1752,
     1069    1753,  1754,  1755,  1770,  1771,  1776,  1777,  1783,  1785,  1788,
     1070    1790,  1792,  1815,  1816,  1818,  1820,  1825,  1826,  1828,  1833,
     1071    1838,  1839,  1845,  1844,  1848,  1852,  1854,  1856,  1862,  1863,
     1072    1868,  1873,  1875,  1880,  1882,  1883,  1885,  1890,  1892,  1894,
     1073    1899,  1901,  1906,  1911,  1919,  1925,  1924,  1938,  1939,  1944,
     1074    1945,  1949,  1954,  1959,  1967,  1972,  1983,  1984,  1989,  1990,
     1075    1996,  1997,  2001,  2002,  2003,  2006,  2005,  2016,  2025,  2031,
     1076    2037,  2046,  2052,  2058,  2064,  2070,  2078,  2084,  2092,  2098,
     1077    2107,  2108,  2109,  2113,  2117,  2119,  2124,  2125,  2129,  2130,
     1078    2135,  2141,  2142,  2145,  2147,  2148,  2152,  2153,  2154,  2155,
     1079    2189,  2191,  2192,  2194,  2199,  2204,  2209,  2211,  2213,  2218,
     1080    2220,  2222,  2224,  2229,  2231,  2240,  2242,  2243,  2248,  2250,
     1081    2252,  2257,  2259,  2261,  2266,  2268,  2270,  2279,  2280,  2281,
     1082    2285,  2287,  2289,  2294,  2296,  2298,  2303,  2305,  2307,  2322,
     1083    2324,  2325,  2327,  2332,  2333,  2338,  2340,  2342,  2347,  2349,
     1084    2351,  2353,  2358,  2360,  2362,  2372,  2374,  2375,  2377,  2382,
     1085    2384,  2386,  2391,  2393,  2395,  2397,  2402,  2404,  2406,  2437,
     1086    2439,  2440,  2442,  2447,  2452,  2460,  2462,  2464,  2469,  2471,
     1087    2476,  2478,  2492,  2493,  2495,  2500,  2502,  2504,  2506,  2508,
     1088    2513,  2514,  2516,  2518,  2523,  2525,  2527,  2533,  2535,  2537,
     1089    2541,  2543,  2545,  2547,  2561,  2562,  2564,  2569,  2571,  2573,
     1090    2575,  2577,  2582,  2583,  2585,  2587,  2592,  2594,  2596,  2602,
     1091    2603,  2605,  2614,  2617,  2619,  2622,  2624,  2626,  2639,  2640,
     1092    2642,  2647,  2649,  2651,  2653,  2655,  2660,  2661,  2663,  2665,
     1093    2670,  2672,  2680,  2681,  2682,  2687,  2688,  2692,  2694,  2696,
     1094    2698,  2700,  2702,  2709,  2711,  2713,  2715,  2717,  2719,  2721,
     1095    2723,  2725,  2727,  2732,  2734,  2736,  2741,  2767,  2768,  2770,
     1096    2774,  2775,  2779,  2781,  2783,  2785,  2787,  2789,  2796,  2798,
     1097    2800,  2802,  2804,  2806,  2811,  2816,  2818,  2820,  2838,  2840,
     1098    2845,  2846
    10991099};
    11001100#endif
     
    50775077    break;
    50785078
     5079  case 27:
     5080
     5081/* Line 1806 of yacc.c  */
     5082#line 379 "parser.yy"
     5083    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }
     5084    break;
     5085
    50795086  case 28:
    50805087
    50815088/* Line 1806 of yacc.c  */
    5082 #line 380 "parser.yy"
     5089#line 381 "parser.yy"
    50835090    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); }
    50845091    break;
    50855092
     5093  case 29:
     5094
     5095/* Line 1806 of yacc.c  */
     5096#line 383 "parser.yy"
     5097    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }
     5098    break;
     5099
    50865100  case 30:
    50875101
    50885102/* Line 1806 of yacc.c  */
    5089 #line 383 "parser.yy"
     5103#line 385 "parser.yy"
    50905104    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); }
    50915105    break;
     
    50945108
    50955109/* Line 1806 of yacc.c  */
    5096 #line 385 "parser.yy"
     5110#line 387 "parser.yy"
    50975111    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); }
    50985112    break;
     
    51015115
    51025116/* Line 1806 of yacc.c  */
    5103 #line 387 "parser.yy"
     5117#line 389 "parser.yy"
    51045118    { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); }
    51055119    break;
     
    51085122
    51095123/* Line 1806 of yacc.c  */
    5110 #line 389 "parser.yy"
     5124#line 391 "parser.yy"
    51115125    {
    51125126                        Token fn;
     
    51195133
    51205134/* Line 1806 of yacc.c  */
    5121 #line 399 "parser.yy"
     5135#line 401 "parser.yy"
    51225136    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); }
    51235137    break;
     
    51265140
    51275141/* Line 1806 of yacc.c  */
    5128 #line 404 "parser.yy"
     5142#line 406 "parser.yy"
    51295143    { (yyval.en) = 0; }
    51305144    break;
     
    51335147
    51345148/* Line 1806 of yacc.c  */
    5135 #line 410 "parser.yy"
     5149#line 412 "parser.yy"
    51365150    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
    51375151    break;
     
    51405154
    51415155/* Line 1806 of yacc.c  */
    5142 #line 415 "parser.yy"
     5156#line 417 "parser.yy"
    51435157    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
    51445158    break;
     
    51475161
    51485162/* Line 1806 of yacc.c  */
    5149 #line 419 "parser.yy"
     5163#line 421 "parser.yy"
    51505164    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); }
    51515165    break;
     
    51545168
    51555169/* Line 1806 of yacc.c  */
    5156 #line 421 "parser.yy"
     5170#line 423 "parser.yy"
    51575171    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); }
    51585172    break;
     
    51615175
    51625176/* Line 1806 of yacc.c  */
    5163 #line 423 "parser.yy"
     5177#line 425 "parser.yy"
    51645178    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); }
    51655179    break;
     
    51685182
    51695183/* Line 1806 of yacc.c  */
    5170 #line 425 "parser.yy"
     5184#line 427 "parser.yy"
    51715185    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); }
    51725186    break;
     
    51755189
    51765190/* Line 1806 of yacc.c  */
    5177 #line 433 "parser.yy"
     5191#line 435 "parser.yy"
    51785192    { (yyval.en) = (yyvsp[(1) - (1)].en); }
    51795193    break;
     
    51825196
    51835197/* Line 1806 of yacc.c  */
    5184 #line 435 "parser.yy"
     5198#line 437 "parser.yy"
    51855199    { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); }
    51865200    break;
     
    51895203
    51905204/* Line 1806 of yacc.c  */
    5191 #line 437 "parser.yy"
     5205#line 439 "parser.yy"
    51925206    { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); }
    51935207    break;
     
    51965210
    51975211/* Line 1806 of yacc.c  */
    5198 #line 442 "parser.yy"
     5212#line 444 "parser.yy"
    51995213    {
    52005214                        switch ( (yyvsp[(1) - (2)].op) ) {
     
    52145228
    52155229/* Line 1806 of yacc.c  */
    5216 #line 455 "parser.yy"
     5230#line 457 "parser.yy"
    52175231    { (yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) ); }
    52185232    break;
     
    52215235
    52225236/* Line 1806 of yacc.c  */
    5223 #line 457 "parser.yy"
     5237#line 459 "parser.yy"
    52245238    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Incr, (yyvsp[(2) - (2)].en) ) ); }
    52255239    break;
     
    52285242
    52295243/* Line 1806 of yacc.c  */
    5230 #line 459 "parser.yy"
     5244#line 461 "parser.yy"
    52315245    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Decr, (yyvsp[(2) - (2)].en) ) ); }
    52325246    break;
     
    52355249
    52365250/* Line 1806 of yacc.c  */
    5237 #line 461 "parser.yy"
     5251#line 463 "parser.yy"
    52385252    { (yyval.en) = new ExpressionNode( build_sizeOfexpr( (yyvsp[(2) - (2)].en) ) ); }
    52395253    break;
     
    52425256
    52435257/* Line 1806 of yacc.c  */
    5244 #line 463 "parser.yy"
     5258#line 465 "parser.yy"
    52455259    { (yyval.en) = new ExpressionNode( build_sizeOftype( (yyvsp[(3) - (4)].decl) ) ); }
    52465260    break;
     
    52495263
    52505264/* Line 1806 of yacc.c  */
    5251 #line 465 "parser.yy"
     5265#line 467 "parser.yy"
    52525266    { (yyval.en) = new ExpressionNode( build_alignOfexpr( (yyvsp[(2) - (2)].en) ) ); }
    52535267    break;
     
    52565270
    52575271/* Line 1806 of yacc.c  */
    5258 #line 467 "parser.yy"
     5272#line 469 "parser.yy"
    52595273    { (yyval.en) = new ExpressionNode( build_alignOftype( (yyvsp[(3) - (4)].decl) ) ); }
    52605274    break;
     
    52635277
    52645278/* Line 1806 of yacc.c  */
    5265 #line 469 "parser.yy"
     5279#line 471 "parser.yy"
    52665280    { (yyval.en) = new ExpressionNode( build_offsetOf( (yyvsp[(3) - (6)].decl), build_varref( (yyvsp[(5) - (6)].tok) ) ) ); }
    52675281    break;
     
    52705284
    52715285/* Line 1806 of yacc.c  */
    5272 #line 471 "parser.yy"
     5286#line 473 "parser.yy"
    52735287    { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (1)].tok) ), nullptr ) ); }
    52745288    break;
     
    52775291
    52785292/* Line 1806 of yacc.c  */
    5279 #line 473 "parser.yy"
     5293#line 475 "parser.yy"
    52805294    { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ) ); }
    52815295    break;
     
    52845298
    52855299/* Line 1806 of yacc.c  */
    5286 #line 475 "parser.yy"
     5300#line 477 "parser.yy"
    52875301    { (yyval.en) = new ExpressionNode( build_attrtype( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].decl) ) ); }
    52885302    break;
     
    52915305
    52925306/* Line 1806 of yacc.c  */
    5293 #line 481 "parser.yy"
     5307#line 483 "parser.yy"
    52945308    { (yyval.op) = OperKinds::PointTo; }
    52955309    break;
     
    52985312
    52995313/* Line 1806 of yacc.c  */
    5300 #line 482 "parser.yy"
     5314#line 484 "parser.yy"
    53015315    { (yyval.op) = OperKinds::AddressOf; }
    53025316    break;
     
    53055319
    53065320/* Line 1806 of yacc.c  */
    5307 #line 488 "parser.yy"
     5321#line 490 "parser.yy"
    53085322    { (yyval.op) = OperKinds::UnPlus; }
    53095323    break;
     
    53125326
    53135327/* Line 1806 of yacc.c  */
    5314 #line 489 "parser.yy"
     5328#line 491 "parser.yy"
    53155329    { (yyval.op) = OperKinds::UnMinus; }
    53165330    break;
     
    53195333
    53205334/* Line 1806 of yacc.c  */
    5321 #line 490 "parser.yy"
     5335#line 492 "parser.yy"
    53225336    { (yyval.op) = OperKinds::Neg; }
    53235337    break;
     
    53265340
    53275341/* Line 1806 of yacc.c  */
    5328 #line 491 "parser.yy"
     5342#line 493 "parser.yy"
    53295343    { (yyval.op) = OperKinds::BitNeg; }
    53305344    break;
    53315345
    53325346  case 68:
    5333 
    5334 /* Line 1806 of yacc.c  */
    5335 #line 497 "parser.yy"
    5336     { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); }
    5337     break;
    5338 
    5339   case 69:
    53405347
    53415348/* Line 1806 of yacc.c  */
     
    53445351    break;
    53455352
     5353  case 69:
     5354
     5355/* Line 1806 of yacc.c  */
     5356#line 501 "parser.yy"
     5357    { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); }
     5358    break;
     5359
    53465360  case 71:
    53475361
    53485362/* Line 1806 of yacc.c  */
    5349 #line 505 "parser.yy"
     5363#line 507 "parser.yy"
    53505364    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53515365    break;
     
    53545368
    53555369/* Line 1806 of yacc.c  */
    5356 #line 507 "parser.yy"
     5370#line 509 "parser.yy"
    53575371    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53585372    break;
     
    53615375
    53625376/* Line 1806 of yacc.c  */
    5363 #line 509 "parser.yy"
     5377#line 511 "parser.yy"
    53645378    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53655379    break;
     
    53685382
    53695383/* Line 1806 of yacc.c  */
    5370 #line 515 "parser.yy"
     5384#line 517 "parser.yy"
    53715385    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53725386    break;
     
    53755389
    53765390/* Line 1806 of yacc.c  */
    5377 #line 517 "parser.yy"
     5391#line 519 "parser.yy"
    53785392    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53795393    break;
     
    53825396
    53835397/* Line 1806 of yacc.c  */
    5384 #line 523 "parser.yy"
     5398#line 525 "parser.yy"
    53855399    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53865400    break;
     
    53895403
    53905404/* Line 1806 of yacc.c  */
    5391 #line 525 "parser.yy"
     5405#line 527 "parser.yy"
    53925406    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    53935407    break;
     
    53965410
    53975411/* Line 1806 of yacc.c  */
    5398 #line 531 "parser.yy"
     5412#line 533 "parser.yy"
    53995413    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54005414    break;
     
    54035417
    54045418/* Line 1806 of yacc.c  */
    5405 #line 533 "parser.yy"
     5419#line 535 "parser.yy"
    54065420    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54075421    break;
     
    54105424
    54115425/* Line 1806 of yacc.c  */
    5412 #line 535 "parser.yy"
     5426#line 537 "parser.yy"
    54135427    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54145428    break;
     
    54175431
    54185432/* Line 1806 of yacc.c  */
    5419 #line 537 "parser.yy"
     5433#line 539 "parser.yy"
    54205434    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54215435    break;
     
    54245438
    54255439/* Line 1806 of yacc.c  */
    5426 #line 543 "parser.yy"
     5440#line 545 "parser.yy"
    54275441    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54285442    break;
     
    54315445
    54325446/* Line 1806 of yacc.c  */
    5433 #line 545 "parser.yy"
     5447#line 547 "parser.yy"
    54345448    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54355449    break;
     
    54385452
    54395453/* Line 1806 of yacc.c  */
    5440 #line 551 "parser.yy"
     5454#line 553 "parser.yy"
    54415455    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54425456    break;
     
    54455459
    54465460/* Line 1806 of yacc.c  */
    5447 #line 557 "parser.yy"
     5461#line 559 "parser.yy"
    54485462    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54495463    break;
     
    54525466
    54535467/* Line 1806 of yacc.c  */
    5454 #line 563 "parser.yy"
     5468#line 565 "parser.yy"
    54555469    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54565470    break;
     
    54595473
    54605474/* Line 1806 of yacc.c  */
    5461 #line 569 "parser.yy"
     5475#line 571 "parser.yy"
    54625476    { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); }
    54635477    break;
     
    54665480
    54675481/* Line 1806 of yacc.c  */
    5468 #line 575 "parser.yy"
     5482#line 577 "parser.yy"
    54695483    { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); }
    54705484    break;
     
    54735487
    54745488/* Line 1806 of yacc.c  */
    5475 #line 581 "parser.yy"
     5489#line 583 "parser.yy"
    54765490    { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }
    54775491    break;
     
    54805494
    54815495/* Line 1806 of yacc.c  */
    5482 #line 584 "parser.yy"
     5496#line 586 "parser.yy"
    54835497    { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); }
    54845498    break;
     
    54875501
    54885502/* Line 1806 of yacc.c  */
    5489 #line 586 "parser.yy"
     5503#line 588 "parser.yy"
    54905504    { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }
    54915505    break;
     
    54945508
    54955509/* Line 1806 of yacc.c  */
    5496 #line 597 "parser.yy"
     5510#line 599 "parser.yy"
    54975511    { (yyval.en) = new ExpressionNode( build_binary_ptr( (yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    54985512    break;
     
    55015515
    55025516/* Line 1806 of yacc.c  */
    5503 #line 599 "parser.yy"
     5517#line 601 "parser.yy"
    55045518    { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new ExpressionNode( build_binary_ptr( OperKinds::Assign, (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ) ); }
    55055519    break;
     
    55085522
    55095523/* Line 1806 of yacc.c  */
    5510 #line 604 "parser.yy"
     5524#line 606 "parser.yy"
    55115525    { (yyval.en) = nullptr; }
    55125526    break;
     
    55155529
    55165530/* Line 1806 of yacc.c  */
    5517 #line 609 "parser.yy"
     5531#line 611 "parser.yy"
    55185532    { (yyval.op) = OperKinds::Assign; }
    55195533    break;
     
    55225536
    55235537/* Line 1806 of yacc.c  */
    5524 #line 610 "parser.yy"
     5538#line 612 "parser.yy"
    55255539    { (yyval.op) = OperKinds::AtAssn; }
    55265540    break;
     
    55295543
    55305544/* Line 1806 of yacc.c  */
    5531 #line 611 "parser.yy"
     5545#line 613 "parser.yy"
    55325546    { (yyval.op) = OperKinds::MulAssn; }
    55335547    break;
     
    55365550
    55375551/* Line 1806 of yacc.c  */
    5538 #line 612 "parser.yy"
     5552#line 614 "parser.yy"
    55395553    { (yyval.op) = OperKinds::DivAssn; }
    55405554    break;
     
    55435557
    55445558/* Line 1806 of yacc.c  */
    5545 #line 613 "parser.yy"
     5559#line 615 "parser.yy"
    55465560    { (yyval.op) = OperKinds::ModAssn; }
    55475561    break;
     
    55505564
    55515565/* Line 1806 of yacc.c  */
    5552 #line 614 "parser.yy"
     5566#line 616 "parser.yy"
    55535567    { (yyval.op) = OperKinds::PlusAssn; }
    55545568    break;
     
    55575571
    55585572/* Line 1806 of yacc.c  */
    5559 #line 615 "parser.yy"
     5573#line 617 "parser.yy"
    55605574    { (yyval.op) = OperKinds::MinusAssn; }
    55615575    break;
     
    55645578
    55655579/* Line 1806 of yacc.c  */
    5566 #line 616 "parser.yy"
     5580#line 618 "parser.yy"
    55675581    { (yyval.op) = OperKinds::LSAssn; }
    55685582    break;
     
    55715585
    55725586/* Line 1806 of yacc.c  */
    5573 #line 617 "parser.yy"
     5587#line 619 "parser.yy"
    55745588    { (yyval.op) = OperKinds::RSAssn; }
    55755589    break;
     
    55785592
    55795593/* Line 1806 of yacc.c  */
    5580 #line 618 "parser.yy"
     5594#line 620 "parser.yy"
    55815595    { (yyval.op) = OperKinds::AndAssn; }
    55825596    break;
     
    55855599
    55865600/* Line 1806 of yacc.c  */
    5587 #line 619 "parser.yy"
     5601#line 621 "parser.yy"
    55885602    { (yyval.op) = OperKinds::ERAssn; }
    55895603    break;
     
    55925606
    55935607/* Line 1806 of yacc.c  */
    5594 #line 620 "parser.yy"
     5608#line 622 "parser.yy"
    55955609    { (yyval.op) = OperKinds::OrAssn; }
    55965610    break;
     
    55995613
    56005614/* Line 1806 of yacc.c  */
    5601 #line 627 "parser.yy"
     5615#line 629 "parser.yy"
    56025616    { (yyval.en) = new ExpressionNode( build_tuple() ); }
    56035617    break;
     
    56065620
    56075621/* Line 1806 of yacc.c  */
    5608 #line 629 "parser.yy"
     5622#line 631 "parser.yy"
    56095623    { (yyval.en) = new ExpressionNode( build_tuple( (yyvsp[(3) - (5)].en) ) ); }
    56105624    break;
     
    56135627
    56145628/* Line 1806 of yacc.c  */
    5615 #line 631 "parser.yy"
     5629#line 633 "parser.yy"
    56165630    { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( (yyvsp[(4) - (6)].en) ) ) ); }
    56175631    break;
     
    56205634
    56215635/* Line 1806 of yacc.c  */
    5622 #line 633 "parser.yy"
     5636#line 635 "parser.yy"
    56235637    { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_last( (yyvsp[(5) - (7)].en) ) ) ); }
    56245638    break;
     
    56275641
    56285642/* Line 1806 of yacc.c  */
    5629 #line 639 "parser.yy"
     5643#line 641 "parser.yy"
    56305644    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
    56315645    break;
     
    56345648
    56355649/* Line 1806 of yacc.c  */
    5636 #line 645 "parser.yy"
     5650#line 647 "parser.yy"
    56375651    { (yyval.en) = new ExpressionNode( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    56385652    break;
     
    56415655
    56425656/* Line 1806 of yacc.c  */
    5643 #line 650 "parser.yy"
     5657#line 652 "parser.yy"
    56445658    { (yyval.en) = 0; }
    56455659    break;
     
    56485662
    56495663/* Line 1806 of yacc.c  */
    5650 #line 659 "parser.yy"
     5664#line 661 "parser.yy"
    56515665    { (yyval.sn) = (yyvsp[(1) - (1)].sn); }
    56525666    break;
     
    56555669
    56565670/* Line 1806 of yacc.c  */
    5657 #line 666 "parser.yy"
     5671#line 668 "parser.yy"
    56585672    {
    56595673                        Token fn;
     
    56665680
    56675681/* Line 1806 of yacc.c  */
    5668 #line 676 "parser.yy"
     5682#line 678 "parser.yy"
    56695683    {
    56705684                        (yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) );
     
    56755689
    56765690/* Line 1806 of yacc.c  */
    5677 #line 683 "parser.yy"
     5691#line 685 "parser.yy"
    56785692    { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); }
    56795693    break;
     
    56825696
    56835697/* Line 1806 of yacc.c  */
    5684 #line 690 "parser.yy"
     5698#line 692 "parser.yy"
    56855699    { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); }
    56865700    break;
     
    56895703
    56905704/* Line 1806 of yacc.c  */
    5691 #line 696 "parser.yy"
     5705#line 698 "parser.yy"
    56925706    { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
    56935707    break;
     
    56965710
    56975711/* Line 1806 of yacc.c  */
    5698 #line 701 "parser.yy"
     5712#line 703 "parser.yy"
    56995713    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
    57005714    break;
     
    57035717
    57045718/* Line 1806 of yacc.c  */
    5705 #line 703 "parser.yy"
     5719#line 705 "parser.yy"
    57065720    {   // mark all fields in list
    57075721                        for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() )
     
    57145728
    57155729/* Line 1806 of yacc.c  */
    5716 #line 709 "parser.yy"
     5730#line 711 "parser.yy"
    57175731    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
    57185732    break;
     
    57215735
    57225736/* Line 1806 of yacc.c  */
    5723 #line 716 "parser.yy"
     5737#line 718 "parser.yy"
    57245738    { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
    57255739    break;
     
    57285742
    57295743/* Line 1806 of yacc.c  */
    5730 #line 721 "parser.yy"
     5744#line 723 "parser.yy"
    57315745    { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); }
    57325746    break;
     
    57355749
    57365750/* Line 1806 of yacc.c  */
    5737 #line 727 "parser.yy"
     5751#line 729 "parser.yy"
    57385752    { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); }
    57395753    break;
     
    57425756
    57435757/* Line 1806 of yacc.c  */
    5744 #line 729 "parser.yy"
     5758#line 731 "parser.yy"
    57455759    { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); }
    57465760    break;
     
    57495763
    57505764/* Line 1806 of yacc.c  */
    5751 #line 731 "parser.yy"
     5765#line 733 "parser.yy"
    57525766    { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
    57535767    break;
     
    57565770
    57575771/* Line 1806 of yacc.c  */
    5758 #line 733 "parser.yy"
     5772#line 735 "parser.yy"
    57595773    {
    57605774                        StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
     
    57715785
    57725786/* Line 1806 of yacc.c  */
    5773 #line 743 "parser.yy"
     5787#line 745 "parser.yy"
    57745788    { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
    57755789    break;
     
    57785792
    57795793/* Line 1806 of yacc.c  */
    5780 #line 745 "parser.yy"
     5794#line 747 "parser.yy"
    57815795    {
    57825796                        StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
     
    57885802
    57895803/* Line 1806 of yacc.c  */
    5790 #line 755 "parser.yy"
     5804#line 757 "parser.yy"
    57915805    { (yyval.en) = (yyvsp[(1) - (1)].en); }
    57925806    break;
     
    57955809
    57965810/* Line 1806 of yacc.c  */
    5797 #line 757 "parser.yy"
     5811#line 759 "parser.yy"
    57985812    { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    57995813    break;
     
    58025816
    58035817/* Line 1806 of yacc.c  */
    5804 #line 762 "parser.yy"
     5818#line 764 "parser.yy"
    58055819    { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); }
    58065820    break;
     
    58095823
    58105824/* Line 1806 of yacc.c  */
    5811 #line 764 "parser.yy"
     5825#line 766 "parser.yy"
    58125826    { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); }
    58135827    break;
     
    58165830
    58175831/* Line 1806 of yacc.c  */
    5818 #line 768 "parser.yy"
     5832#line 770 "parser.yy"
    58195833    { (yyval.sn) = (yyvsp[(2) - (3)].sn); }
    58205834    break;
     
    58235837
    58245838/* Line 1806 of yacc.c  */
    5825 #line 769 "parser.yy"
     5839#line 771 "parser.yy"
    58265840    { (yyval.sn) = new StatementNode( build_default() ); }
    58275841    break;
     
    58305844
    58315845/* Line 1806 of yacc.c  */
    5832 #line 775 "parser.yy"
     5846#line 777 "parser.yy"
    58335847    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) )); }
    58345848    break;
     
    58375851
    58385852/* Line 1806 of yacc.c  */
    5839 #line 779 "parser.yy"
     5853#line 781 "parser.yy"
    58405854    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); }
    58415855    break;
     
    58445858
    58455859/* Line 1806 of yacc.c  */
    5846 #line 784 "parser.yy"
     5860#line 786 "parser.yy"
    58475861    { (yyval.sn) = 0; }
    58485862    break;
     
    58515865
    58525866/* Line 1806 of yacc.c  */
    5853 #line 790 "parser.yy"
     5867#line 792 "parser.yy"
    58545868    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); }
    58555869    break;
     
    58585872
    58595873/* Line 1806 of yacc.c  */
    5860 #line 792 "parser.yy"
     5874#line 794 "parser.yy"
    58615875    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); }
    58625876    break;
     
    58655879
    58665880/* Line 1806 of yacc.c  */
    5867 #line 797 "parser.yy"
     5881#line 799 "parser.yy"
    58685882    { (yyval.sn) = 0; }
    58695883    break;
     
    58725886
    58735887/* Line 1806 of yacc.c  */
    5874 #line 803 "parser.yy"
     5888#line 805 "parser.yy"
    58755889    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
    58765890    break;
     
    58795893
    58805894/* Line 1806 of yacc.c  */
    5881 #line 805 "parser.yy"
     5895#line 807 "parser.yy"
    58825896    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); }
    58835897    break;
     
    58865900
    58875901/* Line 1806 of yacc.c  */
    5888 #line 807 "parser.yy"
     5902#line 809 "parser.yy"
    58895903    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
    58905904    break;
     
    58935907
    58945908/* Line 1806 of yacc.c  */
    5895 #line 809 "parser.yy"
     5909#line 811 "parser.yy"
    58965910    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_last( (yyvsp[(2) - (4)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(3) - (4)].sn)->set_last( (yyvsp[(4) - (4)].sn) ) ) ) ) ) ); }
    58975911    break;
     
    59005914
    59015915/* Line 1806 of yacc.c  */
    5902 #line 814 "parser.yy"
     5916#line 816 "parser.yy"
    59035917    { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); }
    59045918    break;
    59055919
    59065920  case 179:
    5907 
    5908 /* Line 1806 of yacc.c  */
    5909 #line 820 "parser.yy"
    5910     { (yyval.sn) = 0; }
    5911     break;
    5912 
    5913   case 180:
    59145921
    59155922/* Line 1806 of yacc.c  */
     
    59185925    break;
    59195926
     5927  case 180:
     5928
     5929/* Line 1806 of yacc.c  */
     5930#line 824 "parser.yy"
     5931    { (yyval.sn) = 0; }
     5932    break;
     5933
    59205934  case 181:
    59215935
    59225936/* Line 1806 of yacc.c  */
    5923 #line 827 "parser.yy"
     5937#line 829 "parser.yy"
    59245938    { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
    59255939    break;
     
    59285942
    59295943/* Line 1806 of yacc.c  */
    5930 #line 829 "parser.yy"
    5931     { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ) ); }
     5944#line 831 "parser.yy"
     5945    { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn), true ) ); }
    59325946    break;
    59335947
     
    59355949
    59365950/* Line 1806 of yacc.c  */
    5937 #line 831 "parser.yy"
     5951#line 833 "parser.yy"
    59385952    { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); }
    59395953    break;
     
    59425956
    59435957/* Line 1806 of yacc.c  */
    5944 #line 836 "parser.yy"
     5958#line 838 "parser.yy"
    59455959    { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
    59465960    break;
     
    59495963
    59505964/* Line 1806 of yacc.c  */
    5951 #line 838 "parser.yy"
     5965#line 840 "parser.yy"
    59525966    { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
    59535967    break;
     
    59565970
    59575971/* Line 1806 of yacc.c  */
    5958 #line 843 "parser.yy"
     5972#line 845 "parser.yy"
    59595973    { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); }
    59605974    break;
     
    59635977
    59645978/* Line 1806 of yacc.c  */
    5965 #line 847 "parser.yy"
     5979#line 849 "parser.yy"
    59665980    { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); }
    59675981    break;
     
    59705984
    59715985/* Line 1806 of yacc.c  */
    5972 #line 850 "parser.yy"
     5986#line 852 "parser.yy"
    59735987    { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Continue ) ); }
    59745988    break;
     
    59775991
    59785992/* Line 1806 of yacc.c  */
    5979 #line 854 "parser.yy"
     5993#line 856 "parser.yy"
    59805994    { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); }
    59815995    break;
     
    59845998
    59855999/* Line 1806 of yacc.c  */
    5986 #line 857 "parser.yy"
     6000#line 859 "parser.yy"
    59876001    { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); }
    59886002    break;
     
    59916005
    59926006/* Line 1806 of yacc.c  */
    5993 #line 861 "parser.yy"
     6007#line 863 "parser.yy"
    59946008    { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); }
    59956009    break;
     
    59986012
    59996013/* Line 1806 of yacc.c  */
    6000 #line 863 "parser.yy"
     6014#line 865 "parser.yy"
    60016015    { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); }
    60026016    break;
    60036017
    60046018  case 193:
    6005 
    6006 /* Line 1806 of yacc.c  */
    6007 #line 865 "parser.yy"
    6008     { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); }
    6009     break;
    6010 
    6011   case 194:
    60126019
    60136020/* Line 1806 of yacc.c  */
     
    60166023    break;
    60176024
     6025  case 194:
     6026
     6027/* Line 1806 of yacc.c  */
     6028#line 869 "parser.yy"
     6029    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); }
     6030    break;
     6031
    60186032  case 195:
    60196033
    60206034/* Line 1806 of yacc.c  */
    6021 #line 869 "parser.yy"
     6035#line 871 "parser.yy"
    60226036    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); }
    60236037    break;
     
    60266040
    60276041/* Line 1806 of yacc.c  */
    6028 #line 874 "parser.yy"
     6042#line 876 "parser.yy"
    60296043    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); }
    60306044    break;
     
    60336047
    60346048/* Line 1806 of yacc.c  */
    6035 #line 876 "parser.yy"
     6049#line 878 "parser.yy"
    60366050    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); }
    60376051    break;
     
    60406054
    60416055/* Line 1806 of yacc.c  */
    6042 #line 878 "parser.yy"
     6056#line 880 "parser.yy"
    60436057    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); }
    60446058    break;
     
    60476061
    60486062/* Line 1806 of yacc.c  */
    6049 #line 885 "parser.yy"
     6063#line 887 "parser.yy"
    60506064    { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
    60516065    break;
     
    60546068
    60556069/* Line 1806 of yacc.c  */
    6056 #line 887 "parser.yy"
     6070#line 889 "parser.yy"
    60576071    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
    60586072    break;
     
    60616075
    60626076/* Line 1806 of yacc.c  */
    6063 #line 889 "parser.yy"
     6077#line 891 "parser.yy"
    60646078    { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
    60656079    break;
     
    60686082
    60696083/* Line 1806 of yacc.c  */
    6070 #line 891 "parser.yy"
     6084#line 893 "parser.yy"
    60716085    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
    60726086    break;
     
    60756089
    60766090/* Line 1806 of yacc.c  */
    6077 #line 896 "parser.yy"
     6091#line 898 "parser.yy"
    60786092    { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
    60796093    break;
     
    60826096
    60836097/* Line 1806 of yacc.c  */
    6084 #line 898 "parser.yy"
     6098#line 900 "parser.yy"
    60856099    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
    60866100    break;
     
    60896103
    60906104/* Line 1806 of yacc.c  */
    6091 #line 900 "parser.yy"
     6105#line 902 "parser.yy"
    60926106    { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
    60936107    break;
     
    60966110
    60976111/* Line 1806 of yacc.c  */
    6098 #line 902 "parser.yy"
     6112#line 904 "parser.yy"
    60996113    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
    61006114    break;
     
    61036117
    61046118/* Line 1806 of yacc.c  */
    6105 #line 907 "parser.yy"
     6119#line 909 "parser.yy"
    61066120    {
    61076121                        (yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) );
     
    61126126
    61136127/* Line 1806 of yacc.c  */
    6114 #line 920 "parser.yy"
     6128#line 922 "parser.yy"
    61156129    {
    61166130                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    61226136
    61236137/* Line 1806 of yacc.c  */
    6124 #line 925 "parser.yy"
     6138#line 927 "parser.yy"
    61256139    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
    61266140    break;
     
    61296143
    61306144/* Line 1806 of yacc.c  */
    6131 #line 927 "parser.yy"
     6145#line 929 "parser.yy"
    61326146    {
    61336147                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    61396153
    61406154/* Line 1806 of yacc.c  */
    6141 #line 936 "parser.yy"
     6155#line 938 "parser.yy"
    61426156    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); }
    61436157    break;
     
    61466160
    61476161/* Line 1806 of yacc.c  */
    6148 #line 938 "parser.yy"
     6162#line 940 "parser.yy"
    61496163    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); }
    61506164    break;
     
    61536167
    61546168/* Line 1806 of yacc.c  */
    6155 #line 940 "parser.yy"
     6169#line 942 "parser.yy"
    61566170    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); }
    61576171    break;
     
    61606174
    61616175/* Line 1806 of yacc.c  */
    6162 #line 942 "parser.yy"
     6176#line 944 "parser.yy"
    61636177    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].en) ) ); }
    61646178    break;
     
    61676181
    61686182/* Line 1806 of yacc.c  */
    6169 #line 944 "parser.yy"
     6183#line 946 "parser.yy"
    61706184    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].en), (yyvsp[(12) - (14)].label) ) ); }
    61716185    break;
     
    61746188
    61756189/* Line 1806 of yacc.c  */
    6176 #line 949 "parser.yy"
     6190#line 951 "parser.yy"
    61776191    { (yyval.flag) = false; }
    61786192    break;
     
    61816195
    61826196/* Line 1806 of yacc.c  */
    6183 #line 951 "parser.yy"
     6197#line 953 "parser.yy"
    61846198    { (yyval.flag) = true; }
    61856199    break;
     
    61886202
    61896203/* Line 1806 of yacc.c  */
    6190 #line 956 "parser.yy"
     6204#line 958 "parser.yy"
    61916205    { (yyval.en) = 0; }
    61926206    break;
     
    61956209
    61966210/* Line 1806 of yacc.c  */
    6197 #line 963 "parser.yy"
     6211#line 965 "parser.yy"
    61986212    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
    61996213    break;
     
    62026216
    62036217/* Line 1806 of yacc.c  */
    6204 #line 968 "parser.yy"
     6218#line 970 "parser.yy"
    62056219    { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); }
    62066220    break;
     
    62096223
    62106224/* Line 1806 of yacc.c  */
    6211 #line 970 "parser.yy"
     6225#line 972 "parser.yy"
    62126226    { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); }
    62136227    break;
     
    62166230
    62176231/* Line 1806 of yacc.c  */
    6218 #line 975 "parser.yy"
     6232#line 977 "parser.yy"
    62196233    { (yyval.en) = 0; }
    62206234    break;
     
    62236237
    62246238/* Line 1806 of yacc.c  */
    6225 #line 977 "parser.yy"
     6239#line 979 "parser.yy"
    62266240    { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); }
    62276241    break;
     
    62306244
    62316245/* Line 1806 of yacc.c  */
    6232 #line 979 "parser.yy"
     6246#line 981 "parser.yy"
    62336247    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( (yyvsp[(3) - (3)].constant) ) ); }
    62346248    break;
     
    62376251
    62386252/* Line 1806 of yacc.c  */
    6239 #line 984 "parser.yy"
     6253#line 986 "parser.yy"
    62406254    {
    62416255                        (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) );
     
    62476261
    62486262/* Line 1806 of yacc.c  */
    6249 #line 989 "parser.yy"
     6263#line 991 "parser.yy"
    62506264    {
    62516265                        (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) );
     
    62576271
    62586272/* Line 1806 of yacc.c  */
    6259 #line 999 "parser.yy"
     6273#line 1001 "parser.yy"
    62606274    { (yyval.decl) = 0; }
    62616275    break;
     
    62646278
    62656279/* Line 1806 of yacc.c  */
    6266 #line 1006 "parser.yy"
     6280#line 1008 "parser.yy"
    62676281    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
    62686282    break;
     
    62716285
    62726286/* Line 1806 of yacc.c  */
    6273 #line 1011 "parser.yy"
     6287#line 1013 "parser.yy"
    62746288    { (yyval.decl) = 0; }
    62756289    break;
     
    62786292
    62796293/* Line 1806 of yacc.c  */
    6280 #line 1018 "parser.yy"
     6294#line 1020 "parser.yy"
    62816295    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
    62826296    break;
     
    62856299
    62866300/* Line 1806 of yacc.c  */
    6287 #line 1032 "parser.yy"
     6301#line 1034 "parser.yy"
    62886302    {}
    62896303    break;
     
    62926306
    62936307/* Line 1806 of yacc.c  */
    6294 #line 1033 "parser.yy"
     6308#line 1035 "parser.yy"
    62956309    {}
    62966310    break;
     
    62996313
    63006314/* Line 1806 of yacc.c  */
    6301 #line 1062 "parser.yy"
     6315#line 1064 "parser.yy"
    63026316    {
    63036317                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    63096323
    63106324/* Line 1806 of yacc.c  */
    6311 #line 1069 "parser.yy"
     6325#line 1071 "parser.yy"
    63126326    {
    63136327                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    63196333
    63206334/* Line 1806 of yacc.c  */
    6321 #line 1074 "parser.yy"
     6335#line 1076 "parser.yy"
    63226336    {
    63236337                        typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID );
     
    63296343
    63306344/* Line 1806 of yacc.c  */
    6331 #line 1084 "parser.yy"
     6345#line 1086 "parser.yy"
    63326346    {
    63336347                        typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
     
    63396353
    63406354/* Line 1806 of yacc.c  */
    6341 #line 1089 "parser.yy"
     6355#line 1091 "parser.yy"
    63426356    {
    63436357                        typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
     
    63496363
    63506364/* Line 1806 of yacc.c  */
    6351 #line 1094 "parser.yy"
     6365#line 1096 "parser.yy"
    63526366    {
    63536367                        typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) );
     
    63596373
    63606374/* Line 1806 of yacc.c  */
    6361 #line 1102 "parser.yy"
     6375#line 1104 "parser.yy"
    63626376    {
    63636377                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    63696383
    63706384/* Line 1806 of yacc.c  */
    6371 #line 1107 "parser.yy"
     6385#line 1109 "parser.yy"
    63726386    {
    63736387                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    63796393
    63806394/* Line 1806 of yacc.c  */
    6381 #line 1112 "parser.yy"
     6395#line 1114 "parser.yy"
    63826396    {
    63836397                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    63896403
    63906404/* Line 1806 of yacc.c  */
    6391 #line 1117 "parser.yy"
     6405#line 1119 "parser.yy"
    63926406    {
    63936407                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    63996413
    64006414/* Line 1806 of yacc.c  */
    6401 #line 1122 "parser.yy"
     6415#line 1124 "parser.yy"
    64026416    {
    64036417                        typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
     
    64096423
    64106424/* Line 1806 of yacc.c  */
    6411 #line 1130 "parser.yy"
     6425#line 1132 "parser.yy"
    64126426    {
    64136427                        (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true );
     
    64186432
    64196433/* Line 1806 of yacc.c  */
    6420 #line 1153 "parser.yy"
     6434#line 1155 "parser.yy"
    64216435    {
    64226436                        (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
     
    64276441
    64286442/* Line 1806 of yacc.c  */
    6429 #line 1157 "parser.yy"
     6443#line 1159 "parser.yy"
    64306444    {
    64316445                        (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
     
    64366450
    64376451/* Line 1806 of yacc.c  */
    6438 #line 1164 "parser.yy"
     6452#line 1166 "parser.yy"
    64396453    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
    64406454    break;
     
    64436457
    64446458/* Line 1806 of yacc.c  */
    6445 #line 1168 "parser.yy"
     6459#line 1170 "parser.yy"
    64466460    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); }
    64476461    break;
     
    64506464
    64516465/* Line 1806 of yacc.c  */
    6452 #line 1173 "parser.yy"
     6466#line 1175 "parser.yy"
    64536467    {
    64546468                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    64606474
    64616475/* Line 1806 of yacc.c  */
    6462 #line 1178 "parser.yy"
     6476#line 1180 "parser.yy"
    64636477    {
    64646478                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    64706484
    64716485/* Line 1806 of yacc.c  */
    6472 #line 1183 "parser.yy"
     6486#line 1185 "parser.yy"
    64736487    {
    64746488                        typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD );
     
    64806494
    64816495/* Line 1806 of yacc.c  */
    6482 #line 1194 "parser.yy"
     6496#line 1196 "parser.yy"
    64836497    {
    64846498                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    64906504
    64916505/* Line 1806 of yacc.c  */
    6492 #line 1199 "parser.yy"
     6506#line 1201 "parser.yy"
    64936507    {
    64946508                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    65006514
    65016515/* Line 1806 of yacc.c  */
    6502 #line 1204 "parser.yy"
     6516#line 1206 "parser.yy"
    65036517    {
    65046518                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    65106524
    65116525/* Line 1806 of yacc.c  */
    6512 #line 1209 "parser.yy"
     6526#line 1211 "parser.yy"
    65136527    {
    65146528                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    65206534
    65216535/* Line 1806 of yacc.c  */
    6522 #line 1214 "parser.yy"
     6536#line 1216 "parser.yy"
    65236537    {
    65246538                        typedefTable.addToEnclosingScope( TypedefTable::TD );
     
    65306544
    65316545/* Line 1806 of yacc.c  */
    6532 #line 1223 "parser.yy"
     6546#line 1225 "parser.yy"
    65336547    {
    65346548                        typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD );
     
    65406554
    65416555/* Line 1806 of yacc.c  */
    6542 #line 1228 "parser.yy"
     6556#line 1230 "parser.yy"
    65436557    {
    65446558                        typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD );
     
    65506564
    65516565/* Line 1806 of yacc.c  */
    6552 #line 1245 "parser.yy"
     6566#line 1247 "parser.yy"
    65536567    {
    65546568                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    65606574
    65616575/* Line 1806 of yacc.c  */
    6562 #line 1250 "parser.yy"
     6576#line 1252 "parser.yy"
    65636577    {
    65646578                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    65706584
    65716585/* Line 1806 of yacc.c  */
    6572 #line 1272 "parser.yy"
     6586#line 1274 "parser.yy"
    65736587    { (yyval.decl) = 0; }
    65746588    break;
     
    65776591
    65786592/* Line 1806 of yacc.c  */
    6579 #line 1284 "parser.yy"
     6593#line 1286 "parser.yy"
    65806594    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    65816595    break;
     
    65846598
    65856599/* Line 1806 of yacc.c  */
    6586 #line 1295 "parser.yy"
     6600#line 1297 "parser.yy"
    65876601    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
    65886602    break;
     
    65916605
    65926606/* Line 1806 of yacc.c  */
    6593 #line 1297 "parser.yy"
     6607#line 1299 "parser.yy"
    65946608    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
    65956609    break;
     
    65986612
    65996613/* Line 1806 of yacc.c  */
    6600 #line 1299 "parser.yy"
     6614#line 1301 "parser.yy"
    66016615    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
    66026616    break;
     
    66056619
    66066620/* Line 1806 of yacc.c  */
    6607 #line 1301 "parser.yy"
     6621#line 1303 "parser.yy"
    66086622    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
    66096623    break;
     
    66126626
    66136627/* Line 1806 of yacc.c  */
    6614 #line 1303 "parser.yy"
     6628#line 1305 "parser.yy"
    66156629    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
    66166630    break;
     
    66196633
    66206634/* Line 1806 of yacc.c  */
    6621 #line 1305 "parser.yy"
     6635#line 1307 "parser.yy"
    66226636    {
    66236637                        typedefTable.enterScope();
     
    66286642
    66296643/* Line 1806 of yacc.c  */
    6630 #line 1309 "parser.yy"
     6644#line 1311 "parser.yy"
    66316645    {
    66326646                        typedefTable.leaveScope();
     
    66386652
    66396653/* Line 1806 of yacc.c  */
    6640 #line 1318 "parser.yy"
     6654#line 1320 "parser.yy"
    66416655    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    66426656    break;
     
    66456659
    66466660/* Line 1806 of yacc.c  */
    6647 #line 1320 "parser.yy"
     6661#line 1322 "parser.yy"
    66486662    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
    66496663    break;
     
    66526666
    66536667/* Line 1806 of yacc.c  */
    6654 #line 1331 "parser.yy"
     6668#line 1333 "parser.yy"
    66556669    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    66566670    break;
     
    66596673
    66606674/* Line 1806 of yacc.c  */
    6661 #line 1336 "parser.yy"
     6675#line 1338 "parser.yy"
    66626676    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
    66636677    break;
     
    66666680
    66676681/* Line 1806 of yacc.c  */
    6668 #line 1338 "parser.yy"
     6682#line 1340 "parser.yy"
    66696683    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
    66706684    break;
     
    66736687
    66746688/* Line 1806 of yacc.c  */
    6675 #line 1340 "parser.yy"
     6689#line 1342 "parser.yy"
    66766690    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
    66776691    break;
     
    66806694
    66816695/* Line 1806 of yacc.c  */
    6682 #line 1342 "parser.yy"
     6696#line 1344 "parser.yy"
    66836697    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
    66846698    break;
     
    66876701
    66886702/* Line 1806 of yacc.c  */
    6689 #line 1345 "parser.yy"
     6703#line 1347 "parser.yy"
    66906704    { (yyval.decl) = new DeclarationNode; (yyval.decl)->isInline = true; }
    66916705    break;
     
    66946708
    66956709/* Line 1806 of yacc.c  */
    6696 #line 1347 "parser.yy"
     6710#line 1349 "parser.yy"
    66976711    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
    66986712    break;
     
    67016715
    67026716/* Line 1806 of yacc.c  */
    6703 #line 1350 "parser.yy"
     6717#line 1352 "parser.yy"
    67046718    { (yyval.decl) = new DeclarationNode; (yyval.decl)->isNoreturn = true; }
    67056719    break;
     
    67086722
    67096723/* Line 1806 of yacc.c  */
    6710 #line 1352 "parser.yy"
     6724#line 1354 "parser.yy"
    67116725    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
    67126726    break;
     
    67156729
    67166730/* Line 1806 of yacc.c  */
    6717 #line 1357 "parser.yy"
     6731#line 1359 "parser.yy"
    67186732    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
    67196733    break;
     
    67226736
    67236737/* Line 1806 of yacc.c  */
    6724 #line 1359 "parser.yy"
     6738#line 1361 "parser.yy"
    67256739    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
    67266740    break;
     
    67296743
    67306744/* Line 1806 of yacc.c  */
    6731 #line 1361 "parser.yy"
     6745#line 1363 "parser.yy"
    67326746    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
    67336747    break;
     
    67366750
    67376751/* Line 1806 of yacc.c  */
    6738 #line 1363 "parser.yy"
     6752#line 1365 "parser.yy"
    67396753    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
    67406754    break;
     
    67436757
    67446758/* Line 1806 of yacc.c  */
    6745 #line 1365 "parser.yy"
     6759#line 1367 "parser.yy"
    67466760    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
    67476761    break;
     
    67506764
    67516765/* Line 1806 of yacc.c  */
    6752 #line 1367 "parser.yy"
     6766#line 1369 "parser.yy"
    67536767    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
    67546768    break;
     
    67576771
    67586772/* Line 1806 of yacc.c  */
    6759 #line 1369 "parser.yy"
     6773#line 1371 "parser.yy"
    67606774    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
    67616775    break;
     
    67646778
    67656779/* Line 1806 of yacc.c  */
    6766 #line 1371 "parser.yy"
     6780#line 1373 "parser.yy"
    67676781    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
    67686782    break;
     
    67716785
    67726786/* Line 1806 of yacc.c  */
    6773 #line 1373 "parser.yy"
     6787#line 1375 "parser.yy"
    67746788    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
    67756789    break;
     
    67786792
    67796793/* Line 1806 of yacc.c  */
    6780 #line 1375 "parser.yy"
     6794#line 1377 "parser.yy"
    67816795    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
    67826796    break;
     
    67856799
    67866800/* Line 1806 of yacc.c  */
    6787 #line 1377 "parser.yy"
     6801#line 1379 "parser.yy"
    67886802    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
    67896803    break;
     
    67926806
    67936807/* Line 1806 of yacc.c  */
    6794 #line 1379 "parser.yy"
     6808#line 1381 "parser.yy"
    67956809    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
    67966810    break;
     
    67996813
    68006814/* Line 1806 of yacc.c  */
    6801 #line 1381 "parser.yy"
     6815#line 1383 "parser.yy"
    68026816    { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
    68036817    break;
     
    68066820
    68076821/* Line 1806 of yacc.c  */
    6808 #line 1388 "parser.yy"
     6822#line 1390 "parser.yy"
    68096823    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    68106824    break;
     
    68136827
    68146828/* Line 1806 of yacc.c  */
    6815 #line 1390 "parser.yy"
     6829#line 1392 "parser.yy"
    68166830    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    68176831    break;
     
    68206834
    68216835/* Line 1806 of yacc.c  */
    6822 #line 1392 "parser.yy"
     6836#line 1394 "parser.yy"
    68236837    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
    68246838    break;
     
    68276841
    68286842/* Line 1806 of yacc.c  */
    6829 #line 1394 "parser.yy"
     6843#line 1396 "parser.yy"
    68306844    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
    68316845    break;
     
    68346848
    68356849/* Line 1806 of yacc.c  */
    6836 #line 1400 "parser.yy"
     6850#line 1402 "parser.yy"
    68376851    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
    68386852    break;
     
    68416855
    68426856/* Line 1806 of yacc.c  */
    6843 #line 1407 "parser.yy"
     6857#line 1409 "parser.yy"
    68446858    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    68456859    break;
     
    68486862
    68496863/* Line 1806 of yacc.c  */
    6850 #line 1409 "parser.yy"
     6864#line 1411 "parser.yy"
    68516865    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    68526866    break;
     
    68556869
    68566870/* Line 1806 of yacc.c  */
    6857 #line 1411 "parser.yy"
     6871#line 1413 "parser.yy"
    68586872    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
    68596873    break;
     
    68626876
    68636877/* Line 1806 of yacc.c  */
    6864 #line 1416 "parser.yy"
     6878#line 1418 "parser.yy"
    68656879    { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
    68666880    break;
     
    68696883
    68706884/* Line 1806 of yacc.c  */
    6871 #line 1418 "parser.yy"
     6885#line 1420 "parser.yy"
    68726886    { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
    68736887    break;
     
    68766890
    68776891/* Line 1806 of yacc.c  */
    6878 #line 1420 "parser.yy"
     6892#line 1422 "parser.yy"
    68796893    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
    68806894    break;
     
    68836897
    68846898/* Line 1806 of yacc.c  */
    6885 #line 1422 "parser.yy"
     6899#line 1424 "parser.yy"
    68866900    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
    68876901    break;
     
    68906904
    68916905/* Line 1806 of yacc.c  */
    6892 #line 1428 "parser.yy"
     6906#line 1430 "parser.yy"
    68936907    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    68946908    break;
     
    68976911
    68986912/* Line 1806 of yacc.c  */
    6899 #line 1430 "parser.yy"
     6913#line 1432 "parser.yy"
    69006914    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    69016915    break;
     
    69046918
    69056919/* Line 1806 of yacc.c  */
    6906 #line 1432 "parser.yy"
     6920#line 1434 "parser.yy"
    69076921    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
    69086922    break;
     
    69116925
    69126926/* Line 1806 of yacc.c  */
    6913 #line 1438 "parser.yy"
     6927#line 1440 "parser.yy"
    69146928    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    69156929    break;
     
    69186932
    69196933/* Line 1806 of yacc.c  */
    6920 #line 1440 "parser.yy"
     6934#line 1442 "parser.yy"
    69216935    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    69226936    break;
     
    69256939
    69266940/* Line 1806 of yacc.c  */
    6927 #line 1446 "parser.yy"
     6941#line 1448 "parser.yy"
    69286942    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    69296943    break;
     
    69326946
    69336947/* Line 1806 of yacc.c  */
    6934 #line 1448 "parser.yy"
     6948#line 1450 "parser.yy"
    69356949    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    69366950    break;
     
    69396953
    69406954/* Line 1806 of yacc.c  */
    6941 #line 1450 "parser.yy"
     6955#line 1452 "parser.yy"
    69426956    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
    69436957    break;
     
    69466960
    69476961/* Line 1806 of yacc.c  */
    6948 #line 1455 "parser.yy"
     6962#line 1457 "parser.yy"
    69496963    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); }
    69506964    break;
     
    69536967
    69546968/* Line 1806 of yacc.c  */
    6955 #line 1457 "parser.yy"
     6969#line 1459 "parser.yy"
    69566970    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    69576971    break;
     
    69606974
    69616975/* Line 1806 of yacc.c  */
    6962 #line 1459 "parser.yy"
     6976#line 1461 "parser.yy"
    69636977    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    69646978    break;
     
    69676981
    69686982/* Line 1806 of yacc.c  */
    6969 #line 1469 "parser.yy"
     6983#line 1471 "parser.yy"
    69706984    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl), true ); }
    69716985    break;
     
    69746988
    69756989/* Line 1806 of yacc.c  */
    6976 #line 1471 "parser.yy"
     6990#line 1473 "parser.yy"
    69776991    {
    69786992                        typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
     
    69846998
    69856999/* Line 1806 of yacc.c  */
    6986 #line 1476 "parser.yy"
     7000#line 1478 "parser.yy"
    69877001    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
    69887002    break;
     
    69917005
    69927006/* Line 1806 of yacc.c  */
    6993 #line 1478 "parser.yy"
     7007#line 1480 "parser.yy"
    69947008    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl), true ); }
    69957009    break;
     
    69987012
    69997013/* Line 1806 of yacc.c  */
    7000 #line 1480 "parser.yy"
     7014#line 1482 "parser.yy"
    70017015    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); }
    70027016    break;
     
    70057019
    70067020/* Line 1806 of yacc.c  */
    7007 #line 1482 "parser.yy"
     7021#line 1484 "parser.yy"
    70087022    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
    70097023    break;
     
    70127026
    70137027/* Line 1806 of yacc.c  */
    7014 #line 1487 "parser.yy"
     7028#line 1489 "parser.yy"
    70157029    { (yyval.aggKey) = DeclarationNode::Struct; }
    70167030    break;
     
    70197033
    70207034/* Line 1806 of yacc.c  */
    7021 #line 1489 "parser.yy"
     7035#line 1491 "parser.yy"
    70227036    { (yyval.aggKey) = DeclarationNode::Union; }
    70237037    break;
     
    70267040
    70277041/* Line 1806 of yacc.c  */
    7028 #line 1494 "parser.yy"
     7042#line 1496 "parser.yy"
    70297043    { (yyval.decl) = 0; }
    70307044    break;
     
    70337047
    70347048/* Line 1806 of yacc.c  */
    7035 #line 1496 "parser.yy"
     7049#line 1498 "parser.yy"
    70367050    { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
    70377051    break;
     
    70407054
    70417055/* Line 1806 of yacc.c  */
    7042 #line 1502 "parser.yy"
     7056#line 1504 "parser.yy"
    70437057    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); }
    70447058    break;
     
    70477061
    70487062/* Line 1806 of yacc.c  */
    7049 #line 1505 "parser.yy"
     7063#line 1507 "parser.yy"
    70507064    {   // mark all fields in list
    70517065                        for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() )
     
    70587072
    70597073/* Line 1806 of yacc.c  */
    7060 #line 1515 "parser.yy"
     7074#line 1517 "parser.yy"
    70617075    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
    70627076    break;
     
    70657079
    70667080/* Line 1806 of yacc.c  */
    7067 #line 1517 "parser.yy"
     7081#line 1519 "parser.yy"
    70687082    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
    70697083    break;
     
    70727086
    70737087/* Line 1806 of yacc.c  */
    7074 #line 1519 "parser.yy"
     7088#line 1521 "parser.yy"
    70757089    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
    70767090    break;
     
    70797093
    70807094/* Line 1806 of yacc.c  */
    7081 #line 1524 "parser.yy"
     7095#line 1526 "parser.yy"
    70827096    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
    70837097    break;
     
    70867100
    70877101/* Line 1806 of yacc.c  */
    7088 #line 1526 "parser.yy"
     7102#line 1528 "parser.yy"
    70897103    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
    70907104    break;
     
    70937107
    70947108/* Line 1806 of yacc.c  */
    7095 #line 1531 "parser.yy"
     7109#line 1533 "parser.yy"
    70967110    { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
    70977111    break;
     
    71007114
    71017115/* Line 1806 of yacc.c  */
    7102 #line 1533 "parser.yy"
     7116#line 1535 "parser.yy"
    71037117    { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
    71047118    break;
     
    71077121
    71087122/* Line 1806 of yacc.c  */
    7109 #line 1536 "parser.yy"
     7123#line 1538 "parser.yy"
    71107124    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
    71117125    break;
     
    71147128
    71157129/* Line 1806 of yacc.c  */
    7116 #line 1539 "parser.yy"
     7130#line 1541 "parser.yy"
    71177131    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
    71187132    break;
     
    71217135
    71227136/* Line 1806 of yacc.c  */
    7123 #line 1545 "parser.yy"
     7137#line 1547 "parser.yy"
    71247138    { (yyval.en) = 0; }
    71257139    break;
     
    71287142
    71297143/* Line 1806 of yacc.c  */
    7130 #line 1547 "parser.yy"
     7144#line 1549 "parser.yy"
    71317145    { (yyval.en) = (yyvsp[(1) - (1)].en); }
    71327146    break;
     
    71357149
    71367150/* Line 1806 of yacc.c  */
    7137 #line 1552 "parser.yy"
     7151#line 1554 "parser.yy"
    71387152    { (yyval.en) = (yyvsp[(2) - (2)].en); }
    71397153    break;
     
    71427156
    71437157/* Line 1806 of yacc.c  */
    7144 #line 1561 "parser.yy"
     7158#line 1563 "parser.yy"
    71457159    { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
    71467160    break;
     
    71497163
    71507164/* Line 1806 of yacc.c  */
    7151 #line 1563 "parser.yy"
     7165#line 1565 "parser.yy"
    71527166    {
    71537167                        typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
     
    71597173
    71607174/* Line 1806 of yacc.c  */
    7161 #line 1568 "parser.yy"
     7175#line 1570 "parser.yy"
    71627176    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
    71637177    break;
     
    71667180
    71677181/* Line 1806 of yacc.c  */
    7168 #line 1570 "parser.yy"
     7182#line 1572 "parser.yy"
    71697183    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
    71707184    break;
     
    71737187
    71747188/* Line 1806 of yacc.c  */
    7175 #line 1575 "parser.yy"
     7189#line 1577 "parser.yy"
    71767190    { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
    71777191    break;
     
    71807194
    71817195/* Line 1806 of yacc.c  */
    7182 #line 1577 "parser.yy"
     7196#line 1579 "parser.yy"
    71837197    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
    71847198    break;
     
    71877201
    71887202/* Line 1806 of yacc.c  */
    7189 #line 1582 "parser.yy"
     7203#line 1584 "parser.yy"
    71907204    { (yyval.en) = 0; }
    71917205    break;
     
    71947208
    71957209/* Line 1806 of yacc.c  */
    7196 #line 1584 "parser.yy"
     7210#line 1586 "parser.yy"
    71977211    { (yyval.en) = (yyvsp[(2) - (2)].en); }
    71987212    break;
     
    72017215
    72027216/* Line 1806 of yacc.c  */
    7203 #line 1591 "parser.yy"
     7217#line 1593 "parser.yy"
    72047218    { (yyval.decl) = 0; }
    72057219    break;
     
    72087222
    72097223/* Line 1806 of yacc.c  */
    7210 #line 1599 "parser.yy"
     7224#line 1601 "parser.yy"
    72117225    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
    72127226    break;
    72137227
    72147228  case 405:
    7215 
    7216 /* Line 1806 of yacc.c  */
    7217 #line 1601 "parser.yy"
    7218     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
    7219     break;
    7220 
    7221   case 406:
    72227229
    72237230/* Line 1806 of yacc.c  */
     
    72267233    break;
    72277234
     7235  case 406:
     7236
     7237/* Line 1806 of yacc.c  */
     7238#line 1605 "parser.yy"
     7239    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     7240    break;
     7241
    72287242  case 408:
    7229 
    7230 /* Line 1806 of yacc.c  */
    7231 #line 1611 "parser.yy"
    7232     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
    7233     break;
    7234 
    7235   case 409:
    72367243
    72377244/* Line 1806 of yacc.c  */
     
    72407247    break;
    72417248
     7249  case 409:
     7250
     7251/* Line 1806 of yacc.c  */
     7252#line 1615 "parser.yy"
     7253    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     7254    break;
     7255
    72427256  case 410:
    72437257
    72447258/* Line 1806 of yacc.c  */
    7245 #line 1615 "parser.yy"
     7259#line 1617 "parser.yy"
    72467260    { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
    72477261    break;
     
    72507264
    72517265/* Line 1806 of yacc.c  */
    7252 #line 1621 "parser.yy"
     7266#line 1623 "parser.yy"
    72537267    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
    72547268    break;
     
    72577271
    72587272/* Line 1806 of yacc.c  */
    7259 #line 1626 "parser.yy"
     7273#line 1628 "parser.yy"
    72607274    { (yyval.decl) = 0; }
    72617275    break;
     
    72647278
    72657279/* Line 1806 of yacc.c  */
    7266 #line 1633 "parser.yy"
     7280#line 1635 "parser.yy"
    72677281    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
    72687282    break;
    72697283
    72707284  case 419:
    7271 
    7272 /* Line 1806 of yacc.c  */
    7273 #line 1640 "parser.yy"
    7274     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
    7275     break;
    7276 
    7277   case 420:
    72787285
    72797286/* Line 1806 of yacc.c  */
     
    72827289    break;
    72837290
     7291  case 420:
     7292
     7293/* Line 1806 of yacc.c  */
     7294#line 1644 "parser.yy"
     7295    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     7296    break;
     7297
    72847298  case 422:
    72857299
    72867300/* Line 1806 of yacc.c  */
    7287 #line 1651 "parser.yy"
     7301#line 1653 "parser.yy"
    72887302    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
    72897303    break;
     
    72927306
    72937307/* Line 1806 of yacc.c  */
    7294 #line 1654 "parser.yy"
     7308#line 1656 "parser.yy"
    72957309    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
    72967310    break;
     
    72997313
    73007314/* Line 1806 of yacc.c  */
    7301 #line 1656 "parser.yy"
     7315#line 1658 "parser.yy"
    73027316    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); }
    73037317    break;
     
    73067320
    73077321/* Line 1806 of yacc.c  */
    7308 #line 1666 "parser.yy"
     7322#line 1668 "parser.yy"
    73097323    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    73107324    break;
     
    73137327
    73147328/* Line 1806 of yacc.c  */
    7315 #line 1672 "parser.yy"
     7329#line 1674 "parser.yy"
    73167330    {
    73177331                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    73237337
    73247338/* Line 1806 of yacc.c  */
    7325 #line 1677 "parser.yy"
     7339#line 1679 "parser.yy"
    73267340    {
    73277341                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    73337347
    73347348/* Line 1806 of yacc.c  */
    7335 #line 1686 "parser.yy"
     7349#line 1688 "parser.yy"
    73367350    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
    73377351    break;
     
    73407354
    73417355/* Line 1806 of yacc.c  */
    7342 #line 1695 "parser.yy"
     7356#line 1697 "parser.yy"
    73437357    { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); }
    73447358    break;
     
    73477361
    73487362/* Line 1806 of yacc.c  */
    7349 #line 1697 "parser.yy"
     7363#line 1699 "parser.yy"
    73507364    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); }
    73517365    break;
     
    73547368
    73557369/* Line 1806 of yacc.c  */
    7356 #line 1722 "parser.yy"
     7370#line 1724 "parser.yy"
    73577371    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
    73587372    break;
     
    73617375
    73627376/* Line 1806 of yacc.c  */
    7363 #line 1730 "parser.yy"
     7377#line 1732 "parser.yy"
    73647378    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
    73657379    break;
     
    73687382
    73697383/* Line 1806 of yacc.c  */
    7370 #line 1735 "parser.yy"
     7384#line 1737 "parser.yy"
    73717385    { (yyval.in) = 0; }
    73727386    break;
     
    73757389
    73767390/* Line 1806 of yacc.c  */
    7377 #line 1737 "parser.yy"
     7391#line 1739 "parser.yy"
    73787392    { (yyval.in) = (yyvsp[(2) - (2)].in); }
    73797393    break;
     
    73827396
    73837397/* Line 1806 of yacc.c  */
    7384 #line 1739 "parser.yy"
     7398#line 1741 "parser.yy"
    73857399    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
    73867400    break;
     
    73897403
    73907404/* Line 1806 of yacc.c  */
    7391 #line 1743 "parser.yy"
     7405#line 1745 "parser.yy"
    73927406    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
    73937407    break;
     
    73967410
    73977411/* Line 1806 of yacc.c  */
    7398 #line 1744 "parser.yy"
     7412#line 1746 "parser.yy"
    73997413    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
    74007414    break;
     
    74037417
    74047418/* Line 1806 of yacc.c  */
    7405 #line 1749 "parser.yy"
     7419#line 1751 "parser.yy"
    74067420    { (yyval.in) = 0; }
    74077421    break;
     
    74107424
    74117425/* Line 1806 of yacc.c  */
    7412 #line 1751 "parser.yy"
     7426#line 1753 "parser.yy"
    74137427    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
    74147428    break;
     
    74177431
    74187432/* Line 1806 of yacc.c  */
    7419 #line 1752 "parser.yy"
     7433#line 1754 "parser.yy"
    74207434    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); }
    74217435    break;
     
    74247438
    74257439/* Line 1806 of yacc.c  */
    7426 #line 1754 "parser.yy"
     7440#line 1756 "parser.yy"
    74277441    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_last( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); }
    74287442    break;
     
    74317445
    74327446/* Line 1806 of yacc.c  */
    7433 #line 1770 "parser.yy"
     7447#line 1772 "parser.yy"
    74347448    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) ) ); }
    74357449    break;
     
    74387452
    74397453/* Line 1806 of yacc.c  */
    7440 #line 1776 "parser.yy"
     7454#line 1778 "parser.yy"
    74417455    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_last( (yyvsp[(2) - (2)].en) ) ); }
    74427456    break;
     
    74457459
    74467460/* Line 1806 of yacc.c  */
    7447 #line 1782 "parser.yy"
     7461#line 1784 "parser.yy"
    74487462    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); }
    74497463    break;
    74507464
    74517465  case 468:
    7452 
    7453 /* Line 1806 of yacc.c  */
    7454 #line 1785 "parser.yy"
    7455     { (yyval.en) = (yyvsp[(3) - (5)].en); }
    7456     break;
    7457 
    7458   case 469:
    74597466
    74607467/* Line 1806 of yacc.c  */
     
    74637470    break;
    74647471
     7472  case 469:
     7473
     7474/* Line 1806 of yacc.c  */
     7475#line 1789 "parser.yy"
     7476    { (yyval.en) = (yyvsp[(3) - (5)].en); }
     7477    break;
     7478
    74657479  case 470:
    74667480
    74677481/* Line 1806 of yacc.c  */
    7468 #line 1789 "parser.yy"
     7482#line 1791 "parser.yy"
    74697483    { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ); }
    74707484    break;
     
    74737487
    74747488/* Line 1806 of yacc.c  */
    7475 #line 1791 "parser.yy"
     7489#line 1793 "parser.yy"
    74767490    { (yyval.en) = (yyvsp[(4) - (6)].en); }
    74777491    break;
     
    74807494
    74817495/* Line 1806 of yacc.c  */
    7482 #line 1815 "parser.yy"
     7496#line 1817 "parser.yy"
    74837497    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    74847498    break;
     
    74877501
    74887502/* Line 1806 of yacc.c  */
    7489 #line 1817 "parser.yy"
     7503#line 1819 "parser.yy"
    74907504    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    74917505    break;
     
    74947508
    74957509/* Line 1806 of yacc.c  */
    7496 #line 1819 "parser.yy"
     7510#line 1821 "parser.yy"
    74977511    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
    74987512    break;
     
    75017515
    75027516/* Line 1806 of yacc.c  */
    7503 #line 1825 "parser.yy"
     7517#line 1827 "parser.yy"
    75047518    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    75057519    break;
     
    75087522
    75097523/* Line 1806 of yacc.c  */
    7510 #line 1827 "parser.yy"
     7524#line 1829 "parser.yy"
    75117525    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    75127526    break;
     
    75157529
    75167530/* Line 1806 of yacc.c  */
    7517 #line 1832 "parser.yy"
     7531#line 1834 "parser.yy"
    75187532    { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
    75197533    break;
     
    75227536
    75237537/* Line 1806 of yacc.c  */
    7524 #line 1838 "parser.yy"
     7538#line 1840 "parser.yy"
    75257539    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
    75267540    break;
     
    75297543
    75307544/* Line 1806 of yacc.c  */
    7531 #line 1843 "parser.yy"
     7545#line 1845 "parser.yy"
    75327546    { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
    75337547    break;
     
    75367550
    75377551/* Line 1806 of yacc.c  */
    7538 #line 1845 "parser.yy"
     7552#line 1847 "parser.yy"
    75397553    { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); }
    75407554    break;
     
    75437557
    75447558/* Line 1806 of yacc.c  */
    7545 #line 1851 "parser.yy"
     7559#line 1853 "parser.yy"
    75467560    { (yyval.tclass) = DeclarationNode::Type; }
    75477561    break;
     
    75507564
    75517565/* Line 1806 of yacc.c  */
    7552 #line 1853 "parser.yy"
     7566#line 1855 "parser.yy"
    75537567    { (yyval.tclass) = DeclarationNode::Ftype; }
    75547568    break;
     
    75577571
    75587572/* Line 1806 of yacc.c  */
    7559 #line 1855 "parser.yy"
     7573#line 1857 "parser.yy"
    75607574    { (yyval.tclass) = DeclarationNode::Dtype; }
    75617575    break;
     
    75647578
    75657579/* Line 1806 of yacc.c  */
    7566 #line 1860 "parser.yy"
     7580#line 1862 "parser.yy"
    75677581    { (yyval.decl) = 0; }
    75687582    break;
     
    75717585
    75727586/* Line 1806 of yacc.c  */
    7573 #line 1862 "parser.yy"
     7587#line 1864 "parser.yy"
    75747588    { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
    75757589    break;
     
    75787592
    75797593/* Line 1806 of yacc.c  */
    7580 #line 1867 "parser.yy"
     7594#line 1869 "parser.yy"
    75817595    {
    75827596                        typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) );
     
    75887602
    75897603/* Line 1806 of yacc.c  */
    7590 #line 1872 "parser.yy"
     7604#line 1874 "parser.yy"
    75917605    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
    75927606    break;
     
    75957609
    75967610/* Line 1806 of yacc.c  */
    7597 #line 1874 "parser.yy"
     7611#line 1876 "parser.yy"
    75987612    { (yyval.decl) = 0; }
    75997613    break;
     
    76027616
    76037617/* Line 1806 of yacc.c  */
    7604 #line 1879 "parser.yy"
     7618#line 1881 "parser.yy"
    76057619    { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); }
    76067620    break;
     
    76097623
    76107624/* Line 1806 of yacc.c  */
    7611 #line 1882 "parser.yy"
     7625#line 1884 "parser.yy"
    76127626    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( build_typevalue( (yyvsp[(3) - (3)].decl) ) ) ) ); }
    76137627    break;
     
    76167630
    76177631/* Line 1806 of yacc.c  */
    7618 #line 1884 "parser.yy"
     7632#line 1886 "parser.yy"
    76197633    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); }
    76207634    break;
     
    76237637
    76247638/* Line 1806 of yacc.c  */
    7625 #line 1889 "parser.yy"
     7639#line 1891 "parser.yy"
    76267640    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
    76277641    break;
     
    76307644
    76317645/* Line 1806 of yacc.c  */
    7632 #line 1891 "parser.yy"
     7646#line 1893 "parser.yy"
    76337647    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
    76347648    break;
     
    76377651
    76387652/* Line 1806 of yacc.c  */
    7639 #line 1893 "parser.yy"
     7653#line 1895 "parser.yy"
    76407654    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
    76417655    break;
     
    76447658
    76457659/* Line 1806 of yacc.c  */
    7646 #line 1898 "parser.yy"
     7660#line 1900 "parser.yy"
    76477661    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
    76487662    break;
     
    76517665
    76527666/* Line 1806 of yacc.c  */
    7653 #line 1900 "parser.yy"
     7667#line 1902 "parser.yy"
    76547668    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
    76557669    break;
     
    76587672
    76597673/* Line 1806 of yacc.c  */
    7660 #line 1905 "parser.yy"
     7674#line 1907 "parser.yy"
    76617675    {
    76627676                        typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD );
     
    76687682
    76697683/* Line 1806 of yacc.c  */
    7670 #line 1910 "parser.yy"
     7684#line 1912 "parser.yy"
    76717685    {
    76727686                        typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG );
     
    76787692
    76797693/* Line 1806 of yacc.c  */
    7680 #line 1918 "parser.yy"
     7694#line 1920 "parser.yy"
    76817695    {
    76827696                        typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID );
     
    76887702
    76897703/* Line 1806 of yacc.c  */
    7690 #line 1923 "parser.yy"
     7704#line 1925 "parser.yy"
    76917705    {
    76927706                        typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) );
     
    76987712
    76997713/* Line 1806 of yacc.c  */
    7700 #line 1928 "parser.yy"
     7714#line 1930 "parser.yy"
    77017715    {
    77027716                        typedefTable.leaveTrait();
     
    77097723
    77107724/* Line 1806 of yacc.c  */
    7711 #line 1938 "parser.yy"
     7725#line 1940 "parser.yy"
    77127726    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
    77137727    break;
     
    77167730
    77177731/* Line 1806 of yacc.c  */
    7718 #line 1948 "parser.yy"
     7732#line 1950 "parser.yy"
    77197733    {
    77207734                        typedefTable.addToEnclosingScope2( TypedefTable::ID );
     
    77267740
    77277741/* Line 1806 of yacc.c  */
    7728 #line 1953 "parser.yy"
     7742#line 1955 "parser.yy"
    77297743    {
    77307744                        typedefTable.addToEnclosingScope2( TypedefTable::ID );
     
    77367750
    77377751/* Line 1806 of yacc.c  */
    7738 #line 1958 "parser.yy"
     7752#line 1960 "parser.yy"
    77397753    {
    77407754                        typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
     
    77467760
    77477761/* Line 1806 of yacc.c  */
    7748 #line 1966 "parser.yy"
     7762#line 1968 "parser.yy"
    77497763    {
    77507764                        typedefTable.addToEnclosingScope2( TypedefTable::ID );
     
    77567770
    77577771/* Line 1806 of yacc.c  */
    7758 #line 1971 "parser.yy"
     7772#line 1973 "parser.yy"
    77597773    {
    77607774                        typedefTable.addToEnclosingScope2( TypedefTable::ID );
     
    77667780
    77677781/* Line 1806 of yacc.c  */
    7768 #line 1981 "parser.yy"
     7782#line 1983 "parser.yy"
    77697783    {}
    77707784    break;
     
    77737787
    77747788/* Line 1806 of yacc.c  */
    7775 #line 1983 "parser.yy"
     7789#line 1985 "parser.yy"
    77767790    { parseTree = parseTree != nullptr ? parseTree->appendList( (yyvsp[(1) - (1)].decl) ) : (yyvsp[(1) - (1)].decl);    }
    77777791    break;
     
    77807794
    77817795/* Line 1806 of yacc.c  */
    7782 #line 1989 "parser.yy"
     7796#line 1991 "parser.yy"
    77837797    { (yyval.decl) = (yyvsp[(1) - (3)].decl) != nullptr ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
    77847798    break;
     
    77877801
    77887802/* Line 1806 of yacc.c  */
    7789 #line 1994 "parser.yy"
     7803#line 1996 "parser.yy"
    77907804    { (yyval.decl) = 0; }
    77917805    break;
     
    77947808
    77957809/* Line 1806 of yacc.c  */
    7796 #line 2002 "parser.yy"
     7810#line 2004 "parser.yy"
    77977811    {}
    77987812    break;
     
    78017815
    78027816/* Line 1806 of yacc.c  */
    7803 #line 2004 "parser.yy"
     7817#line 2006 "parser.yy"
    78047818    {
    78057819                        linkageStack.push( linkage );                           // handle nested extern "C"/"Cforall"
     
    78117825
    78127826/* Line 1806 of yacc.c  */
    7813 #line 2009 "parser.yy"
     7827#line 2011 "parser.yy"
    78147828    {
    78157829                        linkage = linkageStack.top();
     
    78227836
    78237837/* Line 1806 of yacc.c  */
    7824 #line 2015 "parser.yy"
     7838#line 2017 "parser.yy"
    78257839    {   // mark all fields in list
    78267840                        for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() )
     
    78337847
    78347848/* Line 1806 of yacc.c  */
    7835 #line 2030 "parser.yy"
     7849#line 2032 "parser.yy"
    78367850    {
    78377851                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    78447858
    78457859/* Line 1806 of yacc.c  */
    7846 #line 2036 "parser.yy"
     7860#line 2038 "parser.yy"
    78477861    {
    78487862                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    78557869
    78567870/* Line 1806 of yacc.c  */
    7857 #line 2045 "parser.yy"
     7871#line 2047 "parser.yy"
    78587872    {
    78597873                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    78667880
    78677881/* Line 1806 of yacc.c  */
    7868 #line 2051 "parser.yy"
     7882#line 2053 "parser.yy"
    78697883    {
    78707884                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    78777891
    78787892/* Line 1806 of yacc.c  */
    7879 #line 2057 "parser.yy"
     7893#line 2059 "parser.yy"
    78807894    {
    78817895                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    78887902
    78897903/* Line 1806 of yacc.c  */
    7890 #line 2063 "parser.yy"
     7904#line 2065 "parser.yy"
    78917905    {
    78927906                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    78997913
    79007914/* Line 1806 of yacc.c  */
    7901 #line 2069 "parser.yy"
     7915#line 2071 "parser.yy"
    79027916    {
    79037917                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    79107924
    79117925/* Line 1806 of yacc.c  */
    7912 #line 2077 "parser.yy"
     7926#line 2079 "parser.yy"
    79137927    {
    79147928                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    79217935
    79227936/* Line 1806 of yacc.c  */
    7923 #line 2083 "parser.yy"
     7937#line 2085 "parser.yy"
    79247938    {
    79257939                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    79327946
    79337947/* Line 1806 of yacc.c  */
    7934 #line 2091 "parser.yy"
     7948#line 2093 "parser.yy"
    79357949    {
    79367950                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    79437957
    79447958/* Line 1806 of yacc.c  */
    7945 #line 2097 "parser.yy"
     7959#line 2099 "parser.yy"
    79467960    {
    79477961                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    79547968
    79557969/* Line 1806 of yacc.c  */
    7956 #line 2112 "parser.yy"
     7970#line 2114 "parser.yy"
    79577971    { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
    79587972    break;
     
    79617975
    79627976/* Line 1806 of yacc.c  */
    7963 #line 2117 "parser.yy"
     7977#line 2119 "parser.yy"
    79647978    { delete (yyvsp[(3) - (5)].str); }
    79657979    break;
     
    79687982
    79697983/* Line 1806 of yacc.c  */
    7970 #line 2122 "parser.yy"
     7984#line 2124 "parser.yy"
    79717985    { (yyval.decl) = 0; }
    79727986    break;
     
    79757989
    79767990/* Line 1806 of yacc.c  */
    7977 #line 2129 "parser.yy"
     7991#line 2131 "parser.yy"
    79787992    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    79797993    break;
     
    79827996
    79837997/* Line 1806 of yacc.c  */
    7984 #line 2135 "parser.yy"
     7998#line 2137 "parser.yy"
    79857999    { (yyval.decl) = 0; }
    79868000    break;
     
    79898003
    79908004/* Line 1806 of yacc.c  */
    7991 #line 2146 "parser.yy"
     8005#line 2148 "parser.yy"
    79928006    { delete (yyvsp[(3) - (4)].en); }
    79938007    break;
     
    79968010
    79978011/* Line 1806 of yacc.c  */
    7998 #line 2150 "parser.yy"
     8012#line 2152 "parser.yy"
    79998013    { delete (yyvsp[(1) - (1)].tok); }
    80008014    break;
    80018015
    80028016  case 557:
    8003 
    8004 /* Line 1806 of yacc.c  */
    8005 #line 2151 "parser.yy"
    8006     { delete (yyvsp[(1) - (1)].decl); }
    8007     break;
    8008 
    8009   case 558:
    8010 
    8011 /* Line 1806 of yacc.c  */
    8012 #line 2152 "parser.yy"
    8013     { delete (yyvsp[(1) - (1)].decl); }
    8014     break;
    8015 
    8016   case 559:
    80178017
    80188018/* Line 1806 of yacc.c  */
     
    80218021    break;
    80228022
     8023  case 558:
     8024
     8025/* Line 1806 of yacc.c  */
     8026#line 2154 "parser.yy"
     8027    { delete (yyvsp[(1) - (1)].decl); }
     8028    break;
     8029
     8030  case 559:
     8031
     8032/* Line 1806 of yacc.c  */
     8033#line 2155 "parser.yy"
     8034    { delete (yyvsp[(1) - (1)].decl); }
     8035    break;
     8036
    80238037  case 560:
    80248038
    80258039/* Line 1806 of yacc.c  */
    8026 #line 2188 "parser.yy"
     8040#line 2190 "parser.yy"
    80278041    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    80288042    break;
    80298043
    80308044  case 562:
    8031 
    8032 /* Line 1806 of yacc.c  */
    8033 #line 2191 "parser.yy"
    8034     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8035     break;
    8036 
    8037   case 563:
    80388045
    80398046/* Line 1806 of yacc.c  */
     
    80428049    break;
    80438050
     8051  case 563:
     8052
     8053/* Line 1806 of yacc.c  */
     8054#line 2195 "parser.yy"
     8055    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8056    break;
     8057
    80448058  case 564:
    80458059
    80468060/* Line 1806 of yacc.c  */
    8047 #line 2198 "parser.yy"
     8061#line 2200 "parser.yy"
    80488062    {
    80498063                        typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
     
    80558069
    80568070/* Line 1806 of yacc.c  */
    8057 #line 2203 "parser.yy"
     8071#line 2205 "parser.yy"
    80588072    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    80598073    break;
     
    80628076
    80638077/* Line 1806 of yacc.c  */
    8064 #line 2208 "parser.yy"
     8078#line 2210 "parser.yy"
    80658079    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    80668080    break;
     
    80698083
    80708084/* Line 1806 of yacc.c  */
    8071 #line 2210 "parser.yy"
     8085#line 2212 "parser.yy"
    80728086    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    80738087    break;
     
    80768090
    80778091/* Line 1806 of yacc.c  */
    8078 #line 2212 "parser.yy"
     8092#line 2214 "parser.yy"
    80798093    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    80808094    break;
     
    80838097
    80848098/* Line 1806 of yacc.c  */
    8085 #line 2217 "parser.yy"
     8099#line 2219 "parser.yy"
    80868100    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
    80878101    break;
    80888102
    80898103  case 570:
    8090 
    8091 /* Line 1806 of yacc.c  */
    8092 #line 2219 "parser.yy"
    8093     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8094     break;
    8095 
    8096   case 571:
    80978104
    80988105/* Line 1806 of yacc.c  */
     
    81018108    break;
    81028109
     8110  case 571:
     8111
     8112/* Line 1806 of yacc.c  */
     8113#line 2223 "parser.yy"
     8114    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8115    break;
     8116
    81038117  case 572:
    81048118
    81058119/* Line 1806 of yacc.c  */
    8106 #line 2223 "parser.yy"
     8120#line 2225 "parser.yy"
    81078121    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    81088122    break;
     
    81118125
    81128126/* Line 1806 of yacc.c  */
    8113 #line 2228 "parser.yy"
     8127#line 2230 "parser.yy"
    81148128    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    81158129    break;
     
    81188132
    81198133/* Line 1806 of yacc.c  */
    8120 #line 2230 "parser.yy"
     8134#line 2232 "parser.yy"
    81218135    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    81228136    break;
     
    81258139
    81268140/* Line 1806 of yacc.c  */
    8127 #line 2239 "parser.yy"
     8141#line 2241 "parser.yy"
    81288142    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    81298143    break;
     
    81328146
    81338147/* Line 1806 of yacc.c  */
    8134 #line 2242 "parser.yy"
     8148#line 2244 "parser.yy"
    81358149    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    81368150    break;
     
    81398153
    81408154/* Line 1806 of yacc.c  */
    8141 #line 2247 "parser.yy"
     8155#line 2249 "parser.yy"
    81428156    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
    81438157    break;
     
    81468160
    81478161/* Line 1806 of yacc.c  */
    8148 #line 2249 "parser.yy"
     8162#line 2251 "parser.yy"
    81498163    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    81508164    break;
     
    81538167
    81548168/* Line 1806 of yacc.c  */
    8155 #line 2251 "parser.yy"
     8169#line 2253 "parser.yy"
    81568170    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    81578171    break;
     
    81608174
    81618175/* Line 1806 of yacc.c  */
    8162 #line 2256 "parser.yy"
     8176#line 2258 "parser.yy"
    81638177    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    81648178    break;
     
    81678181
    81688182/* Line 1806 of yacc.c  */
    8169 #line 2258 "parser.yy"
     8183#line 2260 "parser.yy"
    81708184    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    81718185    break;
     
    81748188
    81758189/* Line 1806 of yacc.c  */
    8176 #line 2260 "parser.yy"
     8190#line 2262 "parser.yy"
    81778191    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    81788192    break;
    81798193
    81808194  case 584:
    8181 
    8182 /* Line 1806 of yacc.c  */
    8183 #line 2265 "parser.yy"
    8184     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8185     break;
    8186 
    8187   case 585:
    81888195
    81898196/* Line 1806 of yacc.c  */
     
    81928199    break;
    81938200
     8201  case 585:
     8202
     8203/* Line 1806 of yacc.c  */
     8204#line 2269 "parser.yy"
     8205    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8206    break;
     8207
    81948208  case 586:
    81958209
    81968210/* Line 1806 of yacc.c  */
    8197 #line 2269 "parser.yy"
     8211#line 2271 "parser.yy"
    81988212    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    81998213    break;
     
    82028216
    82038217/* Line 1806 of yacc.c  */
    8204 #line 2284 "parser.yy"
     8218#line 2286 "parser.yy"
    82058219    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
    82068220    break;
     
    82098223
    82108224/* Line 1806 of yacc.c  */
    8211 #line 2286 "parser.yy"
     8225#line 2288 "parser.yy"
    82128226    { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
    82138227    break;
     
    82168230
    82178231/* Line 1806 of yacc.c  */
    8218 #line 2288 "parser.yy"
     8232#line 2290 "parser.yy"
    82198233    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    82208234    break;
     
    82238237
    82248238/* Line 1806 of yacc.c  */
    8225 #line 2293 "parser.yy"
     8239#line 2295 "parser.yy"
    82268240    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    82278241    break;
     
    82308244
    82318245/* Line 1806 of yacc.c  */
    8232 #line 2295 "parser.yy"
     8246#line 2297 "parser.yy"
    82338247    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    82348248    break;
     
    82378251
    82388252/* Line 1806 of yacc.c  */
    8239 #line 2297 "parser.yy"
     8253#line 2299 "parser.yy"
    82408254    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    82418255    break;
    82428256
    82438257  case 596:
    8244 
    8245 /* Line 1806 of yacc.c  */
    8246 #line 2302 "parser.yy"
    8247     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8248     break;
    8249 
    8250   case 597:
    82518258
    82528259/* Line 1806 of yacc.c  */
     
    82558262    break;
    82568263
     8264  case 597:
     8265
     8266/* Line 1806 of yacc.c  */
     8267#line 2306 "parser.yy"
     8268    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8269    break;
     8270
    82578271  case 598:
    82588272
    82598273/* Line 1806 of yacc.c  */
    8260 #line 2306 "parser.yy"
     8274#line 2308 "parser.yy"
    82618275    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    82628276    break;
     
    82658279
    82668280/* Line 1806 of yacc.c  */
    8267 #line 2321 "parser.yy"
     8281#line 2323 "parser.yy"
    82688282    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    82698283    break;
    82708284
    82718285  case 601:
    8272 
    8273 /* Line 1806 of yacc.c  */
    8274 #line 2324 "parser.yy"
    8275     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8276     break;
    8277 
    8278   case 602:
    82798286
    82808287/* Line 1806 of yacc.c  */
     
    82838290    break;
    82848291
     8292  case 602:
     8293
     8294/* Line 1806 of yacc.c  */
     8295#line 2328 "parser.yy"
     8296    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8297    break;
     8298
    82858299  case 604:
    82868300
    82878301/* Line 1806 of yacc.c  */
    8288 #line 2332 "parser.yy"
     8302#line 2334 "parser.yy"
    82898303    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    82908304    break;
     
    82938307
    82948308/* Line 1806 of yacc.c  */
    8295 #line 2337 "parser.yy"
     8309#line 2339 "parser.yy"
    82968310    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    82978311    break;
     
    83008314
    83018315/* Line 1806 of yacc.c  */
    8302 #line 2339 "parser.yy"
     8316#line 2341 "parser.yy"
    83038317    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    83048318    break;
     
    83078321
    83088322/* Line 1806 of yacc.c  */
    8309 #line 2341 "parser.yy"
     8323#line 2343 "parser.yy"
    83108324    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    83118325    break;
     
    83148328
    83158329/* Line 1806 of yacc.c  */
    8316 #line 2346 "parser.yy"
     8330#line 2348 "parser.yy"
    83178331    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
    83188332    break;
    83198333
    83208334  case 609:
    8321 
    8322 /* Line 1806 of yacc.c  */
    8323 #line 2348 "parser.yy"
    8324     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8325     break;
    8326 
    8327   case 610:
    83288335
    83298336/* Line 1806 of yacc.c  */
     
    83328339    break;
    83338340
     8341  case 610:
     8342
     8343/* Line 1806 of yacc.c  */
     8344#line 2352 "parser.yy"
     8345    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8346    break;
     8347
    83348348  case 611:
    83358349
    83368350/* Line 1806 of yacc.c  */
    8337 #line 2352 "parser.yy"
     8351#line 2354 "parser.yy"
    83388352    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    83398353    break;
     
    83428356
    83438357/* Line 1806 of yacc.c  */
    8344 #line 2357 "parser.yy"
     8358#line 2359 "parser.yy"
    83458359    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
    83468360    break;
     
    83498363
    83508364/* Line 1806 of yacc.c  */
    8351 #line 2359 "parser.yy"
     8365#line 2361 "parser.yy"
    83528366    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    83538367    break;
     
    83568370
    83578371/* Line 1806 of yacc.c  */
    8358 #line 2361 "parser.yy"
     8372#line 2363 "parser.yy"
    83598373    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    83608374    break;
     
    83638377
    83648378/* Line 1806 of yacc.c  */
    8365 #line 2371 "parser.yy"
     8379#line 2373 "parser.yy"
    83668380    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    83678381    break;
    83688382
    83698383  case 617:
    8370 
    8371 /* Line 1806 of yacc.c  */
    8372 #line 2374 "parser.yy"
    8373     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8374     break;
    8375 
    8376   case 618:
    83778384
    83788385/* Line 1806 of yacc.c  */
     
    83818388    break;
    83828389
     8390  case 618:
     8391
     8392/* Line 1806 of yacc.c  */
     8393#line 2378 "parser.yy"
     8394    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8395    break;
     8396
    83838397  case 619:
    83848398
    83858399/* Line 1806 of yacc.c  */
    8386 #line 2381 "parser.yy"
     8400#line 2383 "parser.yy"
    83878401    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    83888402    break;
     
    83918405
    83928406/* Line 1806 of yacc.c  */
    8393 #line 2383 "parser.yy"
     8407#line 2385 "parser.yy"
    83948408    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    83958409    break;
     
    83988412
    83998413/* Line 1806 of yacc.c  */
    8400 #line 2385 "parser.yy"
     8414#line 2387 "parser.yy"
    84018415    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    84028416    break;
     
    84058419
    84068420/* Line 1806 of yacc.c  */
    8407 #line 2390 "parser.yy"
     8421#line 2392 "parser.yy"
    84088422    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
    84098423    break;
    84108424
    84118425  case 623:
    8412 
    8413 /* Line 1806 of yacc.c  */
    8414 #line 2392 "parser.yy"
    8415     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8416     break;
    8417 
    8418   case 624:
    84198426
    84208427/* Line 1806 of yacc.c  */
     
    84238430    break;
    84248431
     8432  case 624:
     8433
     8434/* Line 1806 of yacc.c  */
     8435#line 2396 "parser.yy"
     8436    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8437    break;
     8438
    84258439  case 625:
    84268440
    84278441/* Line 1806 of yacc.c  */
    8428 #line 2396 "parser.yy"
     8442#line 2398 "parser.yy"
    84298443    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    84308444    break;
     
    84338447
    84348448/* Line 1806 of yacc.c  */
    8435 #line 2401 "parser.yy"
     8449#line 2403 "parser.yy"
    84368450    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
    84378451    break;
     
    84408454
    84418455/* Line 1806 of yacc.c  */
    8442 #line 2403 "parser.yy"
     8456#line 2405 "parser.yy"
    84438457    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    84448458    break;
     
    84478461
    84488462/* Line 1806 of yacc.c  */
    8449 #line 2405 "parser.yy"
     8463#line 2407 "parser.yy"
    84508464    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    84518465    break;
     
    84548468
    84558469/* Line 1806 of yacc.c  */
    8456 #line 2436 "parser.yy"
     8470#line 2438 "parser.yy"
    84578471    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    84588472    break;
    84598473
    84608474  case 631:
    8461 
    8462 /* Line 1806 of yacc.c  */
    8463 #line 2439 "parser.yy"
    8464     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8465     break;
    8466 
    8467   case 632:
    84688475
    84698476/* Line 1806 of yacc.c  */
     
    84728479    break;
    84738480
     8481  case 632:
     8482
     8483/* Line 1806 of yacc.c  */
     8484#line 2443 "parser.yy"
     8485    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8486    break;
     8487
    84748488  case 633:
    84758489
    84768490/* Line 1806 of yacc.c  */
    8477 #line 2446 "parser.yy"
     8491#line 2448 "parser.yy"
    84788492    {
    84798493                        typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
     
    84858499
    84868500/* Line 1806 of yacc.c  */
    8487 #line 2451 "parser.yy"
     8501#line 2453 "parser.yy"
    84888502    {
    84898503                        typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
     
    84958509
    84968510/* Line 1806 of yacc.c  */
    8497 #line 2459 "parser.yy"
     8511#line 2461 "parser.yy"
    84988512    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    84998513    break;
     
    85028516
    85038517/* Line 1806 of yacc.c  */
    8504 #line 2461 "parser.yy"
     8518#line 2463 "parser.yy"
    85058519    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    85068520    break;
     
    85098523
    85108524/* Line 1806 of yacc.c  */
    8511 #line 2463 "parser.yy"
     8525#line 2465 "parser.yy"
    85128526    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    85138527    break;
     
    85168530
    85178531/* Line 1806 of yacc.c  */
    8518 #line 2468 "parser.yy"
     8532#line 2470 "parser.yy"
    85198533    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
    85208534    break;
     
    85238537
    85248538/* Line 1806 of yacc.c  */
    8525 #line 2470 "parser.yy"
     8539#line 2472 "parser.yy"
    85268540    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    85278541    break;
     
    85308544
    85318545/* Line 1806 of yacc.c  */
    8532 #line 2475 "parser.yy"
     8546#line 2477 "parser.yy"
    85338547    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
    85348548    break;
     
    85378551
    85388552/* Line 1806 of yacc.c  */
    8539 #line 2477 "parser.yy"
     8553#line 2479 "parser.yy"
    85408554    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    85418555    break;
    85428556
    85438557  case 643:
    8544 
    8545 /* Line 1806 of yacc.c  */
    8546 #line 2492 "parser.yy"
    8547     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8548     break;
    8549 
    8550   case 644:
    85518558
    85528559/* Line 1806 of yacc.c  */
     
    85558562    break;
    85568563
     8564  case 644:
     8565
     8566/* Line 1806 of yacc.c  */
     8567#line 2496 "parser.yy"
     8568    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8569    break;
     8570
    85578571  case 645:
    85588572
    85598573/* Line 1806 of yacc.c  */
    8560 #line 2499 "parser.yy"
     8574#line 2501 "parser.yy"
    85618575    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
    85628576    break;
     
    85658579
    85668580/* Line 1806 of yacc.c  */
    8567 #line 2501 "parser.yy"
     8581#line 2503 "parser.yy"
    85688582    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
    85698583    break;
     
    85728586
    85738587/* Line 1806 of yacc.c  */
    8574 #line 2503 "parser.yy"
     8588#line 2505 "parser.yy"
    85758589    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    85768590    break;
     
    85798593
    85808594/* Line 1806 of yacc.c  */
    8581 #line 2505 "parser.yy"
     8595#line 2507 "parser.yy"
    85828596    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    85838597    break;
     
    85868600
    85878601/* Line 1806 of yacc.c  */
    8588 #line 2507 "parser.yy"
     8602#line 2509 "parser.yy"
    85898603    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    85908604    break;
    85918605
    85928606  case 651:
    8593 
    8594 /* Line 1806 of yacc.c  */
    8595 #line 2513 "parser.yy"
    8596     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8597     break;
    8598 
    8599   case 652:
    86008607
    86018608/* Line 1806 of yacc.c  */
     
    86048611    break;
    86058612
     8613  case 652:
     8614
     8615/* Line 1806 of yacc.c  */
     8616#line 2517 "parser.yy"
     8617    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8618    break;
     8619
    86068620  case 653:
    86078621
    86088622/* Line 1806 of yacc.c  */
    8609 #line 2517 "parser.yy"
     8623#line 2519 "parser.yy"
    86108624    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    86118625    break;
     
    86148628
    86158629/* Line 1806 of yacc.c  */
    8616 #line 2522 "parser.yy"
     8630#line 2524 "parser.yy"
    86178631    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
    86188632    break;
     
    86218635
    86228636/* Line 1806 of yacc.c  */
    8623 #line 2524 "parser.yy"
     8637#line 2526 "parser.yy"
    86248638    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    86258639    break;
     
    86288642
    86298643/* Line 1806 of yacc.c  */
    8630 #line 2526 "parser.yy"
     8644#line 2528 "parser.yy"
    86318645    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    86328646    break;
     
    86358649
    86368650/* Line 1806 of yacc.c  */
    8637 #line 2532 "parser.yy"
     8651#line 2534 "parser.yy"
    86388652    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
    86398653    break;
     
    86428656
    86438657/* Line 1806 of yacc.c  */
    8644 #line 2534 "parser.yy"
     8658#line 2536 "parser.yy"
    86458659    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
    86468660    break;
     
    86498663
    86508664/* Line 1806 of yacc.c  */
    8651 #line 2540 "parser.yy"
     8665#line 2542 "parser.yy"
    86528666    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
    86538667    break;
     
    86568670
    86578671/* Line 1806 of yacc.c  */
    8658 #line 2542 "parser.yy"
     8672#line 2544 "parser.yy"
    86598673    { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
    86608674    break;
     
    86638677
    86648678/* Line 1806 of yacc.c  */
    8665 #line 2544 "parser.yy"
     8679#line 2546 "parser.yy"
    86668680    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
    86678681    break;
     
    86708684
    86718685/* Line 1806 of yacc.c  */
    8672 #line 2546 "parser.yy"
     8686#line 2548 "parser.yy"
    86738687    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
    86748688    break;
    86758689
    86768690  case 665:
    8677 
    8678 /* Line 1806 of yacc.c  */
    8679 #line 2561 "parser.yy"
    8680     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8681     break;
    8682 
    8683   case 666:
    86848691
    86858692/* Line 1806 of yacc.c  */
     
    86888695    break;
    86898696
     8697  case 666:
     8698
     8699/* Line 1806 of yacc.c  */
     8700#line 2565 "parser.yy"
     8701    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8702    break;
     8703
    86908704  case 667:
    86918705
    86928706/* Line 1806 of yacc.c  */
    8693 #line 2568 "parser.yy"
     8707#line 2570 "parser.yy"
    86948708    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
    86958709    break;
     
    86988712
    86998713/* Line 1806 of yacc.c  */
    8700 #line 2570 "parser.yy"
     8714#line 2572 "parser.yy"
    87018715    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
    87028716    break;
     
    87058719
    87068720/* Line 1806 of yacc.c  */
    8707 #line 2572 "parser.yy"
     8721#line 2574 "parser.yy"
    87088722    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    87098723    break;
     
    87128726
    87138727/* Line 1806 of yacc.c  */
    8714 #line 2574 "parser.yy"
     8728#line 2576 "parser.yy"
    87158729    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    87168730    break;
     
    87198733
    87208734/* Line 1806 of yacc.c  */
    8721 #line 2576 "parser.yy"
     8735#line 2578 "parser.yy"
    87228736    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    87238737    break;
    87248738
    87258739  case 673:
    8726 
    8727 /* Line 1806 of yacc.c  */
    8728 #line 2582 "parser.yy"
    8729     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8730     break;
    8731 
    8732   case 674:
    87338740
    87348741/* Line 1806 of yacc.c  */
     
    87378744    break;
    87388745
     8746  case 674:
     8747
     8748/* Line 1806 of yacc.c  */
     8749#line 2586 "parser.yy"
     8750    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8751    break;
     8752
    87398753  case 675:
    87408754
    87418755/* Line 1806 of yacc.c  */
    8742 #line 2586 "parser.yy"
     8756#line 2588 "parser.yy"
    87438757    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    87448758    break;
     
    87478761
    87488762/* Line 1806 of yacc.c  */
    8749 #line 2591 "parser.yy"
     8763#line 2593 "parser.yy"
    87508764    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
    87518765    break;
     
    87548768
    87558769/* Line 1806 of yacc.c  */
    8756 #line 2593 "parser.yy"
     8770#line 2595 "parser.yy"
    87578771    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    87588772    break;
     
    87618775
    87628776/* Line 1806 of yacc.c  */
    8763 #line 2595 "parser.yy"
     8777#line 2597 "parser.yy"
    87648778    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    87658779    break;
     
    87688782
    87698783/* Line 1806 of yacc.c  */
    8770 #line 2602 "parser.yy"
     8784#line 2604 "parser.yy"
    87718785    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
    87728786    break;
     
    87758789
    87768790/* Line 1806 of yacc.c  */
    8777 #line 2613 "parser.yy"
     8791#line 2615 "parser.yy"
    87788792    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
    87798793    break;
     
    87828796
    87838797/* Line 1806 of yacc.c  */
    8784 #line 2616 "parser.yy"
     8798#line 2618 "parser.yy"
    87858799    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
    87868800    break;
     
    87898803
    87908804/* Line 1806 of yacc.c  */
    8791 #line 2618 "parser.yy"
     8805#line 2620 "parser.yy"
    87928806    { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
    87938807    break;
     
    87968810
    87978811/* Line 1806 of yacc.c  */
    8798 #line 2621 "parser.yy"
     8812#line 2623 "parser.yy"
    87998813    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
    88008814    break;
     
    88038817
    88048818/* Line 1806 of yacc.c  */
    8805 #line 2623 "parser.yy"
     8819#line 2625 "parser.yy"
    88068820    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
    88078821    break;
     
    88108824
    88118825/* Line 1806 of yacc.c  */
    8812 #line 2625 "parser.yy"
     8826#line 2627 "parser.yy"
    88138827    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
    88148828    break;
    88158829
    88168830  case 689:
    8817 
    8818 /* Line 1806 of yacc.c  */
    8819 #line 2639 "parser.yy"
    8820     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
    8821     break;
    8822 
    8823   case 690:
    88248831
    88258832/* Line 1806 of yacc.c  */
     
    88288835    break;
    88298836
     8837  case 690:
     8838
     8839/* Line 1806 of yacc.c  */
     8840#line 2643 "parser.yy"
     8841    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     8842    break;
     8843
    88308844  case 691:
    88318845
    88328846/* Line 1806 of yacc.c  */
    8833 #line 2646 "parser.yy"
     8847#line 2648 "parser.yy"
    88348848    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
    88358849    break;
     
    88388852
    88398853/* Line 1806 of yacc.c  */
    8840 #line 2648 "parser.yy"
     8854#line 2650 "parser.yy"
    88418855    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
    88428856    break;
     
    88458859
    88468860/* Line 1806 of yacc.c  */
    8847 #line 2650 "parser.yy"
     8861#line 2652 "parser.yy"
    88488862    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
    88498863    break;
     
    88528866
    88538867/* Line 1806 of yacc.c  */
    8854 #line 2652 "parser.yy"
     8868#line 2654 "parser.yy"
    88558869    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
    88568870    break;
     
    88598873
    88608874/* Line 1806 of yacc.c  */
    8861 #line 2654 "parser.yy"
     8875#line 2656 "parser.yy"
    88628876    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    88638877    break;
    88648878
    88658879  case 697:
    8866 
    8867 /* Line 1806 of yacc.c  */
    8868 #line 2660 "parser.yy"
    8869     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
    8870     break;
    8871 
    8872   case 698:
    88738880
    88748881/* Line 1806 of yacc.c  */
     
    88778884    break;
    88788885
     8886  case 698:
     8887
     8888/* Line 1806 of yacc.c  */
     8889#line 2664 "parser.yy"
     8890    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     8891    break;
     8892
    88798893  case 699:
    88808894
    88818895/* Line 1806 of yacc.c  */
    8882 #line 2664 "parser.yy"
     8896#line 2666 "parser.yy"
    88838897    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    88848898    break;
     
    88878901
    88888902/* Line 1806 of yacc.c  */
    8889 #line 2669 "parser.yy"
     8903#line 2671 "parser.yy"
    88908904    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
    88918905    break;
     
    88948908
    88958909/* Line 1806 of yacc.c  */
    8896 #line 2671 "parser.yy"
     8910#line 2673 "parser.yy"
    88978911    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
    88988912    break;
     
    89018915
    89028916/* Line 1806 of yacc.c  */
    8903 #line 2681 "parser.yy"
     8917#line 2683 "parser.yy"
    89048918    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    89058919    break;
     
    89088922
    89098923/* Line 1806 of yacc.c  */
    8910 #line 2691 "parser.yy"
     8924#line 2693 "parser.yy"
    89118925    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    89128926    break;
     
    89158929
    89168930/* Line 1806 of yacc.c  */
    8917 #line 2693 "parser.yy"
     8931#line 2695 "parser.yy"
    89188932    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
    89198933    break;
     
    89228936
    89238937/* Line 1806 of yacc.c  */
    8924 #line 2695 "parser.yy"
     8938#line 2697 "parser.yy"
    89258939    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    89268940    break;
     
    89298943
    89308944/* Line 1806 of yacc.c  */
    8931 #line 2697 "parser.yy"
     8945#line 2699 "parser.yy"
    89328946    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
    89338947    break;
     
    89368950
    89378951/* Line 1806 of yacc.c  */
    8938 #line 2699 "parser.yy"
     8952#line 2701 "parser.yy"
    89398953    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    89408954    break;
     
    89438957
    89448958/* Line 1806 of yacc.c  */
    8945 #line 2701 "parser.yy"
     8959#line 2703 "parser.yy"
    89468960    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
    89478961    break;
     
    89508964
    89518965/* Line 1806 of yacc.c  */
    8952 #line 2708 "parser.yy"
     8966#line 2710 "parser.yy"
    89538967    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    89548968    break;
     
    89578971
    89588972/* Line 1806 of yacc.c  */
    8959 #line 2710 "parser.yy"
     8973#line 2712 "parser.yy"
    89608974    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
    89618975    break;
     
    89648978
    89658979/* Line 1806 of yacc.c  */
    8966 #line 2712 "parser.yy"
     8980#line 2714 "parser.yy"
    89678981    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    89688982    break;
     
    89718985
    89728986/* Line 1806 of yacc.c  */
    8973 #line 2714 "parser.yy"
     8987#line 2716 "parser.yy"
    89748988    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
    89758989    break;
     
    89788992
    89798993/* Line 1806 of yacc.c  */
    8980 #line 2716 "parser.yy"
     8994#line 2718 "parser.yy"
    89818995    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
    89828996    break;
     
    89858999
    89869000/* Line 1806 of yacc.c  */
    8987 #line 2718 "parser.yy"
     9001#line 2720 "parser.yy"
    89889002    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    89899003    break;
     
    89929006
    89939007/* Line 1806 of yacc.c  */
    8994 #line 2720 "parser.yy"
     9008#line 2722 "parser.yy"
    89959009    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
    89969010    break;
     
    89999013
    90009014/* Line 1806 of yacc.c  */
    9001 #line 2722 "parser.yy"
     9015#line 2724 "parser.yy"
    90029016    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    90039017    break;
     
    90069020
    90079021/* Line 1806 of yacc.c  */
    9008 #line 2724 "parser.yy"
     9022#line 2726 "parser.yy"
    90099023    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
    90109024    break;
     
    90139027
    90149028/* Line 1806 of yacc.c  */
    9015 #line 2726 "parser.yy"
     9029#line 2728 "parser.yy"
    90169030    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
    90179031    break;
     
    90209034
    90219035/* Line 1806 of yacc.c  */
    9022 #line 2731 "parser.yy"
     9036#line 2733 "parser.yy"
    90239037    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
    90249038    break;
     
    90279041
    90289042/* Line 1806 of yacc.c  */
    9029 #line 2733 "parser.yy"
     9043#line 2735 "parser.yy"
    90309044    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
    90319045    break;
     
    90349048
    90359049/* Line 1806 of yacc.c  */
    9036 #line 2738 "parser.yy"
     9050#line 2740 "parser.yy"
    90379051    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
    90389052    break;
     
    90419055
    90429056/* Line 1806 of yacc.c  */
    9043 #line 2740 "parser.yy"
     9057#line 2742 "parser.yy"
    90449058    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); }
    90459059    break;
     
    90489062
    90499063/* Line 1806 of yacc.c  */
    9050 #line 2767 "parser.yy"
     9064#line 2769 "parser.yy"
    90519065    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
    90529066    break;
     
    90559069
    90569070/* Line 1806 of yacc.c  */
    9057 #line 2778 "parser.yy"
     9071#line 2780 "parser.yy"
    90589072    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    90599073    break;
     
    90629076
    90639077/* Line 1806 of yacc.c  */
    9064 #line 2780 "parser.yy"
     9078#line 2782 "parser.yy"
    90659079    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
    90669080    break;
     
    90699083
    90709084/* Line 1806 of yacc.c  */
    9071 #line 2782 "parser.yy"
     9085#line 2784 "parser.yy"
    90729086    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    90739087    break;
     
    90769090
    90779091/* Line 1806 of yacc.c  */
    9078 #line 2784 "parser.yy"
     9092#line 2786 "parser.yy"
    90799093    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
    90809094    break;
     
    90839097
    90849098/* Line 1806 of yacc.c  */
    9085 #line 2786 "parser.yy"
     9099#line 2788 "parser.yy"
    90869100    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    90879101    break;
     
    90909104
    90919105/* Line 1806 of yacc.c  */
    9092 #line 2788 "parser.yy"
     9106#line 2790 "parser.yy"
    90939107    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
    90949108    break;
     
    90979111
    90989112/* Line 1806 of yacc.c  */
    9099 #line 2795 "parser.yy"
     9113#line 2797 "parser.yy"
    91009114    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    91019115    break;
     
    91049118
    91059119/* Line 1806 of yacc.c  */
    9106 #line 2797 "parser.yy"
     9120#line 2799 "parser.yy"
    91079121    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    91089122    break;
     
    91119125
    91129126/* Line 1806 of yacc.c  */
    9113 #line 2799 "parser.yy"
     9127#line 2801 "parser.yy"
    91149128    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
    91159129    break;
     
    91189132
    91199133/* Line 1806 of yacc.c  */
    9120 #line 2801 "parser.yy"
     9134#line 2803 "parser.yy"
    91219135    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    91229136    break;
     
    91259139
    91269140/* Line 1806 of yacc.c  */
    9127 #line 2803 "parser.yy"
     9141#line 2805 "parser.yy"
    91289142    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    91299143    break;
     
    91329146
    91339147/* Line 1806 of yacc.c  */
    9134 #line 2805 "parser.yy"
     9148#line 2807 "parser.yy"
    91359149    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
    91369150    break;
     
    91399153
    91409154/* Line 1806 of yacc.c  */
    9141 #line 2810 "parser.yy"
     9155#line 2812 "parser.yy"
    91429156    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
    91439157    break;
     
    91469160
    91479161/* Line 1806 of yacc.c  */
    9148 #line 2815 "parser.yy"
     9162#line 2817 "parser.yy"
    91499163    { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
    91509164    break;
    91519165
    91529166  case 746:
    9153 
    9154 /* Line 1806 of yacc.c  */
    9155 #line 2817 "parser.yy"
    9156     { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
    9157     break;
    9158 
    9159   case 747:
    91609167
    91619168/* Line 1806 of yacc.c  */
     
    91649171    break;
    91659172
     9173  case 747:
     9174
     9175/* Line 1806 of yacc.c  */
     9176#line 2821 "parser.yy"
     9177    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     9178    break;
     9179
    91669180  case 750:
    91679181
    91689182/* Line 1806 of yacc.c  */
    9169 #line 2843 "parser.yy"
     9183#line 2845 "parser.yy"
    91709184    { (yyval.en) = 0; }
    91719185    break;
     
    91749188
    91759189/* Line 1806 of yacc.c  */
    9176 #line 2845 "parser.yy"
     9190#line 2847 "parser.yy"
    91779191    { (yyval.en) = (yyvsp[(2) - (2)].en); }
    91789192    break;
     
    91819195
    91829196/* Line 1806 of yacc.c  */
    9183 #line 9184 "Parser/parser.cc"
     9197#line 9198 "Parser/parser.cc"
    91849198      default: break;
    91859199    }
     
    94129426
    94139427/* Line 2067 of yacc.c  */
    9414 #line 2848 "parser.yy"
     9428#line 2850 "parser.yy"
    94159429
    94169430// ----end of grammar----
  • src/Parser/parser.yy

    r906e24d raa8f9df  
    377377                { $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); }
    378378        | postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector
     379                { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $5 ) ) ); }
    379380        | postfix_expression ARROW no_attr_identifier
    380381                { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
    381382        | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector
     383                        { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); }
    382384        | postfix_expression ICR
    383385                { $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); }
     
    827829                { $$ = new StatementNode( build_while( $3, $5 ) ); }
    828830        | DO statement WHILE '(' comma_expression ')' ';'
    829                 { $$ = new StatementNode( build_while( $5, $2 ) ); }
     831                { $$ = new StatementNode( build_while( $5, $2, true ) ); }
    830832        | FOR '(' push for_control_expression ')' statement
    831833                { $$ = new StatementNode( build_for( $4, $6 ) ); }
  • src/ResolvExpr/AlternativeFinder.cc

    r906e24d raa8f9df  
    3838#include "SynTree/TypeSubstitution.h"
    3939#include "SymTab/Validate.h"
    40 #include "Tuples/TupleAssignment.h"
    41 #include "Tuples/NameMatcher.h"
     40#include "Tuples/Tuples.h"
    4241#include "Common/utility.h"
    4342#include "InitTweak/InitTweak.h"
     
    6463        }
    6564
     65        Cost sumCost( const AltList &in ) {
     66                Cost total;
     67                for ( AltList::const_iterator i = in.begin(); i != in.end(); ++i ) {
     68                        total += i->cost;
     69                }
     70                return total;
     71        }
     72
    6673        namespace {
    6774                void printAlts( const AltList &list, std::ostream &os, int indent = 0 ) {
     
    7683                                out.push_back( i->expr->clone() );
    7784                        }
    78                 }
    79 
    80                 Cost sumCost( const AltList &in ) {
    81                         Cost total;
    82                         for ( AltList::const_iterator i = in.begin(); i != in.end(); ++i ) {
    83                                 total += i->cost;
    84                         }
    85                         return total;
    8685                }
    8786
     
    139138                }
    140139
    141                 template< typename InputIterator, typename OutputIterator >
    142                 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
    143                         AltList alternatives;
    144 
    145                         // select the alternatives that have the minimum parameter cost
    146                         Cost minCost = Cost::infinity;
    147                         for ( AltList::iterator i = begin; i != end; ++i ) {
    148                                 if ( i->cost < minCost ) {
    149                                         minCost = i->cost;
    150                                         i->cost = i->cvtCost;
    151                                         alternatives.clear();
    152                                         alternatives.push_back( *i );
    153                                 } else if ( i->cost == minCost ) {
    154                                         i->cost = i->cvtCost;
    155                                         alternatives.push_back( *i );
    156                                 }
    157                         }
    158                         std::copy( alternatives.begin(), alternatives.end(), out );
    159                 }
    160 
    161140                template< typename InputIterator >
    162141                void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {
     
    236215
    237216        template< typename StructOrUnionType >
    238         void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ) {
     217        void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {
     218
     219                // // member must be either a tuple expression or a name expr
     220                // if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( memberExpr->get_member() ) ) {
     221                //  addAggMembers( structInst, agg->expr, agg->cost, nameExpr->get_name() );
     222                // } else {
     223                //  TupleExpr * tupleExpr = safe_dynamic_cast< TupleExpr * >( memberExpr->get_member() );
     224                //  // xxx - ...
     225                //  assert( false );
     226                // }
     227                // if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( memberExpr->get_member() ) ) {
     228
     229                // }
     230                NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member );
     231                const std::string & name = nameExpr->get_name();
    239232                std::list< Declaration* > members;
    240233                aggInst->lookup( name, members );
     
    262255                std::list< DeclarationWithType* >::iterator formal = formals.begin();
    263256                std::list< Expression* >& actuals = appExpr->get_args();
     257
     258                std::list< Type * > formalTypes;
     259                std::list< Type * >::iterator formalType = formalTypes.end();
     260
    264261                for ( std::list< Expression* >::iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) {
     262
    265263                        PRINT(
    266264                                std::cerr << "actual expression:" << std::endl;
     
    271269                        std::list< DeclarationWithType* >::iterator startFormal = formal;
    272270                        Cost actualCost;
    273                         // xxx - tuple type matching
    274271                        std::list< Type * > flatActualTypes;
    275272                        flatten( (*actualExpr)->get_result(), back_inserter( flatActualTypes ) );
    276                         for ( std::list< Type* >::iterator actual = flatActualTypes.begin(); actual != flatActualTypes.end(); ++actual ) {
    277                                 if ( formal == formals.end() ) {
    278                                         if ( function->get_isVarArgs() ) {
    279                                                 convCost += Cost( 1, 0, 0 );
    280                                                 break;
    281                                         } else {
    282                                                 return Cost::infinity;
     273                        for ( std::list< Type* >::iterator actualType = flatActualTypes.begin(); actualType != flatActualTypes.end(); ++actualType ) {
     274
     275
     276                                // tuple handling code
     277                                if ( formalType == formalTypes.end() ) {
     278                                        // the type of the formal parameter may be a tuple type. To make this easier to work with,
     279                                        // flatten the tuple type and traverse the resulting list of types, incrementing the formal
     280                                        // iterator once its types have been extracted. Once a particular formal parameter's type has
     281                                        // been exhausted load the next formal parameter's type.
     282                                        if ( formal == formals.end() ) {
     283                                                if ( function->get_isVarArgs() ) {
     284                                                        convCost += Cost( 1, 0, 0 );
     285                                                        break;
     286                                                } else {
     287                                                        return Cost::infinity;
     288                                                }
    283289                                        }
     290                                        formalTypes.clear();
     291                                        flatten( (*formal)->get_type(), back_inserter( formalTypes ) );
     292                                        formalType = formalTypes.begin();
     293                                        ++formal;
    284294                                }
     295
    285296                                PRINT(
    286297                                        std::cerr << std::endl << "converting ";
    287                                         (*actual)->print( std::cerr, 8 );
     298                                        (*actualType)->print( std::cerr, 8 );
    288299                                        std::cerr << std::endl << " to ";
    289300                                        (*formal)->get_type()->print( std::cerr, 8 );
    290301                                )
    291                                 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env );
     302                                Cost newCost = conversionCost( *actualType, *formalType, indexer, alt.env );
    292303                                PRINT(
    293304                                        std::cerr << std::endl << "cost is" << newCost << std::endl;
     
    300311                                actualCost += newCost;
    301312
    302                                 convCost += Cost( 0, polyCost( (*formal)->get_type(), alt.env, indexer ) + polyCost( *actual, alt.env, indexer ), 0 );
    303 
    304                                 formal++;
     313                                convCost += Cost( 0, polyCost( *formalType, alt.env, indexer ) + polyCost( *actualType, alt.env, indexer ), 0 );
     314
     315                                formalType++;
    305316                        }
    306317                        if ( actualCost != Cost( 0, 0, 0 ) ) {
     
    368379                resultEnv.extractOpenVars( openVars );
    369380
    370                 /*
    371                   Tuples::NameMatcher matcher( formals );
    372                   try {
    373                   matcher.match( actuals );
    374                   } catch ( Tuples::NoMatch &e ) {
    375                   std::cerr << "Alternative doesn't match: " << e.message << std::endl;
    376                   }
    377                 */
    378381                std::list< DeclarationWithType* >::iterator formal = formals.begin();
     382
     383                std::list< Type * > formalTypes;
     384                std::list< Type * >::iterator formalType = formalTypes.end();
     385
    379386                for ( AltList::const_iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) {
    380387                        std::list< Type * > flatActualTypes;
    381388                        flatten( actualExpr->expr->get_result(), back_inserter( flatActualTypes ) );
    382                         for ( std::list< Type* >::iterator actual = flatActualTypes.begin(); actual != flatActualTypes.end(); ++actual ) {
    383                                 if ( formal == formals.end() ) {
    384                                         return isVarArgs;
     389                        for ( std::list< Type* >::iterator actualType = flatActualTypes.begin(); actualType != flatActualTypes.end(); ++actualType, ++formalType ) {
     390                                if ( formalType == formalTypes.end() ) {
     391                                        // the type of the formal parameter may be a tuple type. To make this easier to work with,
     392                                        // flatten the tuple type and traverse the resulting list of types, incrementing the formal
     393                                        // iterator once its types have been extracted. Once a particular formal parameter's type has
     394                                        // been exhausted load the next formal parameter's type.
     395                                        if ( formal == formals.end() ) {
     396                                                return isVarArgs;
     397                                        }
     398                                        formalTypes.clear();
     399                                        flatten( (*formal)->get_type(), back_inserter( formalTypes ) );
     400                                        formalType = formalTypes.begin();
     401                                        ++formal;
    385402                                }
    386403                                PRINT(
    387404                                        std::cerr << "formal type is ";
    388                                         (*formal)->get_type()->print( std::cerr );
     405                                        (*formalType)->print( std::cerr );
    389406                                        std::cerr << std::endl << "actual type is ";
    390                                         (*actual)->print( std::cerr );
     407                                        (*actualType)->print( std::cerr );
    391408                                        std::cerr << std::endl;
    392409                                )
    393                                 if ( ! unify( (*formal)->get_type(), *actual, resultEnv, resultNeed, resultHave, openVars, indexer ) ) {
     410                                if ( ! unify( *formalType, *actualType, resultEnv, resultNeed, resultHave, openVars, indexer ) ) {
    394411                                        return false;
    395412                                }
    396                                 formal++;
    397                         }
    398                 }
     413                        }
     414                }
     415
     416                // xxx - a tuple type was not completely matched
     417                // partially handle the tuple with default arguments??
     418                if ( formalType != formalTypes.end() ) return false;
     419
    399420                // Handling of default values
    400421                while ( formal != formals.end() ) {
     
    583604                combos( argAlternatives.begin(), argAlternatives.end(), back_inserter( possibilities ) );
    584605
    585                 Tuples::TupleAssignSpotter tassign( this );
    586                 if ( tassign.isTupleAssignment( untypedExpr, possibilities ) ) {
    587                         // take care of possible tuple assignments, or discard expression
    588                         return;
    589                 } // else ...
     606                // take care of possible tuple assignments
     607                // if not tuple assignment, assignment is taken care of as a normal function call
     608                Tuples::handleTupleAssignment( *this, untypedExpr, possibilities );
    590609
    591610                AltList candidates;
     
    773792                        renameTypes( alternatives.back().expr );
    774793                        if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) {
    775                                 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, "" );
     794                                NameExpr nameExpr( "" );
     795                                addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
    776796                        } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) {
    777                                 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, "" );
     797                                NameExpr nameExpr( "" );
     798                                addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
    778799                        } // if
    779800                } // for
     
    973994                        TupleExpr *newExpr = new TupleExpr;
    974995                        makeExprList( *i, newExpr->get_exprs() );
     996                        TupleType *tupleType = new TupleType( Type::Qualifiers(true, true, true, true, true, true) );
     997                        Type::Qualifiers &qualifiers = tupleType->get_qualifiers();
    975998                        for ( Expression * resultExpr : newExpr->get_exprs() ) {
    976                                 newExpr->set_result( resultExpr->get_result()->clone() );
     999                                Type * type = resultExpr->get_result()->clone();
     1000                                tupleType->get_types().push_back( type );
     1001                                qualifiers &= type->get_qualifiers();
    9771002                        } // for
     1003                        newExpr->set_result( tupleType );
    9781004
    9791005                        TypeEnvironment compositeEnv;
     
    9961022                }
    9971023        }
     1024
     1025        void AlternativeFinder::visit( TupleIndexExpr *tupleExpr ) {
     1026                alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );
     1027        }
     1028
     1029        void AlternativeFinder::visit( TupleAssignExpr *tupleAssignExpr ) {
     1030                alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) );
     1031        }
    9981032} // namespace ResolvExpr
    9991033
  • src/ResolvExpr/AlternativeFinder.h

    r906e24d raa8f9df  
    6767                virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr );
    6868                virtual void visit( ConstructorExpr * ctorExpr );
    69           public:  // xxx - temporary hack - should make Tuples::TupleAssignment a friend
     69                virtual void visit( TupleIndexExpr *tupleExpr );
     70                virtual void visit( TupleAssignExpr *tupleExpr );
     71                /// Runs a new alternative finder on each element in [begin, end)
     72                /// and writes each alternative finder to out.
    7073                template< typename InputIterator, typename OutputIterator >
    7174                void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out );
    7275
    73           private:
    7476                /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member
    75                 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name );
     77                template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
    7678                /// Adds alternatives for offsetof expressions, given the base type and name of the member
    7779                template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name );
     
    8991
    9092        Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env );
     93
     94        template< typename InputIterator, typename OutputIterator >
     95        void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
     96                AltList alternatives;
     97
     98                // select the alternatives that have the minimum parameter cost
     99                Cost minCost = Cost::infinity;
     100                for ( InputIterator i = begin; i != end; ++i ) {
     101                        if ( i->cost < minCost ) {
     102                                minCost = i->cost;
     103                                i->cost = i->cvtCost;
     104                                alternatives.clear();
     105                                alternatives.push_back( *i );
     106                        } else if ( i->cost == minCost ) {
     107                                i->cost = i->cvtCost;
     108                                alternatives.push_back( *i );
     109                        }
     110                }
     111                std::copy( alternatives.begin(), alternatives.end(), out );
     112        }
     113
     114        Cost sumCost( const AltList &in );
    91115} // namespace ResolvExpr
    92116
  • src/SymTab/Indexer.cc

    r906e24d raa8f9df  
    452452        }
    453453
    454         void Indexer::visit( SolvedTupleExpr *tupleExpr ) {
     454        void Indexer::visit( TupleAssignExpr *tupleExpr ) {
    455455                acceptNewScope( tupleExpr->get_result(), *this );
    456                 acceptAll( tupleExpr->get_exprs(), *this );
     456                enterScope();
     457                acceptAll( tupleExpr->get_tempDecls(), *this );
     458                acceptAll( tupleExpr->get_assigns(), *this );
     459                leaveScope();
    457460        }
    458461
  • src/SymTab/Indexer.h

    r906e24d raa8f9df  
    6464                virtual void visit( ConditionalExpr *conditionalExpr );
    6565                virtual void visit( CommaExpr *commaExpr );
    66                 virtual void visit( TupleExpr *tupleExpr );
    67                 virtual void visit( SolvedTupleExpr *tupleExpr );
    6866                virtual void visit( TypeExpr *typeExpr );
    6967                virtual void visit( AsmExpr *asmExpr );
    7068                virtual void visit( UntypedValofExpr *valofExpr );
     69                virtual void visit( TupleExpr *tupleExpr );
     70                virtual void visit( TupleAssignExpr *tupleExpr );
    7171
    7272                virtual void visit( TraitInstType *contextInst );
  • src/SynTree/Expression.cc

    r906e24d raa8f9df  
    304304}
    305305
    306 UntypedMemberExpr::UntypedMemberExpr( std::string _member, Expression *_aggregate, Expression *_aname ) :
     306UntypedMemberExpr::UntypedMemberExpr( Expression * _member, Expression *_aggregate, Expression *_aname ) :
    307307                Expression( _aname ), member(_member), aggregate(_aggregate) {}
    308308
    309309UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr &other ) :
    310                 Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) {
     310                Expression( other ), member( maybeClone( other.member ) ), aggregate( maybeClone( other.aggregate ) ) {
    311311}
    312312
    313313UntypedMemberExpr::~UntypedMemberExpr() {
    314314        delete aggregate;
     315        delete member;
    315316}
    316317
    317318void UntypedMemberExpr::print( std::ostream &os, int indent ) const {
    318         os << "Untyped Member Expression, with field: " << get_member();
     319        os << "Untyped Member Expression, with field: " << std::endl;
     320        get_member()->print(os, indent+4);
     321        os << std::string( indent+2, ' ' );
    319322
    320323        Expression *agg = get_aggregate();
    321         os << ", from aggregate: ";
     324        os << "from aggregate: " << std::endl;
    322325        if (agg != 0) {
    323                 os << std::string( indent + 2, ' ' );
    324                 agg->print(os, indent + 2);
     326                os << std::string( indent + 4, ' ' );
     327                agg->print(os, indent + 4);
    325328        }
    326329        os << std::string( indent+2, ' ' );
     
    363366}
    364367
    365 
    366 UntypedExpr::UntypedExpr( Expression *_function, Expression *_aname ) : Expression( _aname ), function( _function ) {}
     368UntypedExpr::UntypedExpr( Expression *_function, const std::list<Expression *> &_args, Expression *_aname ) :
     369                Expression( _aname ), function(_function), args(_args) {}
    367370
    368371UntypedExpr::UntypedExpr( const UntypedExpr &other ) :
     
    370373        cloneAll( other.args, args );
    371374}
    372 
    373 UntypedExpr::UntypedExpr( Expression *_function, std::list<Expression *> &_args, Expression *_aname ) :
    374                 Expression( _aname ), function(_function), args(_args) {}
    375375
    376376UntypedExpr::~UntypedExpr() {
     
    557557}
    558558
     559StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) {
     560        assert( statements );
     561        std::list< Statement * > & body = statements->get_kids();
     562        if ( ! body.empty() ) {
     563                if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) {
     564                        set_result( maybeClone( exprStmt->get_expr()->get_result() ) );
     565                }
     566        }
     567}
     568StmtExpr::StmtExpr( const StmtExpr &other ) : statements( other.statements->clone() ) {}
     569StmtExpr::~StmtExpr() {
     570        delete statements;
     571}
     572void StmtExpr::print( std::ostream &os, int indent ) const {
     573        os << std::string( indent, ' ' ) << "Statement Expression: " << std::endl;
     574        statements->print( os, indent+2 );
     575}
     576
    559577std::ostream & operator<<( std::ostream & out, const Expression * expr ) {
    560578        expr->print( out );
  • src/SynTree/Expression.h

    r906e24d raa8f9df  
    9999class UntypedExpr : public Expression {
    100100  public:
    101         UntypedExpr( Expression *function, Expression *_aname = nullptr );
     101        UntypedExpr( Expression *function, const std::list<Expression *> &args = std::list< Expression * >(), Expression *_aname = nullptr );
    102102        UntypedExpr( const UntypedExpr &other );
    103         UntypedExpr( Expression *function, std::list<Expression *> &args, Expression *_aname = nullptr );
    104103        virtual ~UntypedExpr();
    105104
     
    201200class UntypedMemberExpr : public Expression {
    202201  public:
    203         UntypedMemberExpr( std::string member, Expression *aggregate, Expression *_aname = nullptr );
     202        UntypedMemberExpr( Expression *member, Expression *aggregate, Expression *_aname = nullptr );
    204203        UntypedMemberExpr( const UntypedMemberExpr &other );
    205204        virtual ~UntypedMemberExpr();
    206205
    207         std::string get_member() const { return member; }
    208         void set_member( const std::string &newValue ) { member = newValue; }
     206        Expression * get_member() const { return member; }
     207        void set_member( Expression * newValue ) { member = newValue; }
    209208        Expression *get_aggregate() const { return aggregate; }
    210209        void set_aggregate( Expression *newValue ) { aggregate = newValue; }
     
    215214        virtual void print( std::ostream &os, int indent = 0 ) const;
    216215  private:
    217         std::string member;
     216        Expression *member;
    218217        Expression *aggregate;
    219218};
     
    484483};
    485484
    486 /// TupleExpr represents a tuple expression ( [a, b, c] )
    487 class TupleExpr : public Expression {
    488   public:
    489         TupleExpr( Expression *_aname = nullptr );
    490         TupleExpr( const TupleExpr &other );
    491         virtual ~TupleExpr();
    492 
    493         void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }
    494         std::list<Expression*>& get_exprs() { return exprs; }
    495 
    496         virtual TupleExpr *clone() const { return new TupleExpr( *this ); }
    497         virtual void accept( Visitor &v ) { v.visit( this ); }
    498         virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    499         virtual void print( std::ostream &os, int indent = 0 ) const;
    500   private:
    501         std::list<Expression*> exprs;
    502 };
    503 
    504 /// SolvedTupleExpr represents a TupleExpr whose components have been type-resolved. It is effectively a shell for the code generator to work on
    505 class SolvedTupleExpr : public Expression {
    506   public:
    507         SolvedTupleExpr( Expression *_aname = nullptr ) : Expression( _aname ) {}
    508         SolvedTupleExpr( std::list<Expression *> &, Expression *_aname = nullptr );
    509         SolvedTupleExpr( const SolvedTupleExpr &other );
    510         virtual ~SolvedTupleExpr() {}
    511 
    512         std::list<Expression*> &get_exprs() { return exprs; }
    513 
    514         virtual SolvedTupleExpr *clone() const { return new SolvedTupleExpr( *this ); }
    515         virtual void accept( Visitor &v ) { v.visit( this ); }
    516         virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    517         virtual void print( std::ostream &os, int indent = 0 ) const;
    518   private:
    519         std::list<Expression*> exprs;
    520 };
    521 
    522485/// TypeExpr represents a type used in an expression (e.g. as a type generator parameter)
    523486class TypeExpr : public Expression {
     
    619582        CompoundLiteralExpr( Type * type, Initializer * initializer );
    620583        CompoundLiteralExpr( const CompoundLiteralExpr &other );
    621         ~CompoundLiteralExpr();
     584        virtual ~CompoundLiteralExpr();
    622585
    623586        Type * get_type() const { return type; }
     
    671634  private:
    672635        Expression *low, *high;
     636};
     637
     638/// TupleExpr represents a tuple expression ( [a, b, c] )
     639class TupleExpr : public Expression {
     640  public:
     641        TupleExpr( Expression *_aname = nullptr );
     642        TupleExpr( const TupleExpr &other );
     643        virtual ~TupleExpr();
     644
     645        void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }
     646        std::list<Expression*>& get_exprs() { return exprs; }
     647
     648        virtual TupleExpr *clone() const { return new TupleExpr( *this ); }
     649        virtual void accept( Visitor &v ) { v.visit( this ); }
     650        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     651        virtual void print( std::ostream &os, int indent = 0 ) const;
     652  private:
     653        std::list<Expression*> exprs;
     654};
     655
     656/// TupleIndexExpr represents an element selection operation on a tuple value, e.g. t.3 after processing by the expression analyzer
     657class TupleIndexExpr : public Expression {
     658  public:
     659        TupleIndexExpr( Expression * tuple, unsigned int index );
     660        TupleIndexExpr( const TupleIndexExpr &other );
     661        virtual ~TupleIndexExpr();
     662
     663        Expression * get_tuple() const { return tuple; }
     664        int get_index() const { return index; }
     665        TupleIndexExpr * set_tuple( Expression *newValue ) { tuple = newValue; return this; }
     666        TupleIndexExpr * set_index( unsigned int newValue ) { index = newValue; return this; }
     667
     668        virtual TupleIndexExpr *clone() const { return new TupleIndexExpr( *this ); }
     669        virtual void accept( Visitor &v ) { v.visit( this ); }
     670        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     671        virtual void print( std::ostream &os, int indent = 0 ) const;
     672  private:
     673        Expression * tuple;
     674        unsigned int index;
     675};
     676
     677/// MemberTupleExpr represents a tuple member selection operation on a struct type, e.g. s.[a, b, c] after processing by the expression analyzer
     678class MemberTupleExpr : public Expression {
     679  public:
     680        MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname = nullptr );
     681        MemberTupleExpr( const MemberTupleExpr &other );
     682        virtual ~MemberTupleExpr();
     683
     684        Expression * get_member() const { return member; }
     685        Expression * get_aggregate() const { return aggregate; }
     686        MemberTupleExpr * set_member( Expression *newValue ) { member = newValue; return this; }
     687        MemberTupleExpr * set_aggregate( Expression *newValue ) { aggregate = newValue; return this; }
     688
     689        virtual MemberTupleExpr *clone() const { return new MemberTupleExpr( *this ); }
     690        virtual void accept( Visitor &v ) { v.visit( this ); }
     691        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     692        virtual void print( std::ostream &os, int indent = 0 ) const;
     693  private:
     694        Expression * member;
     695        Expression * aggregate;
     696};
     697
     698/// TupleAssignExpr represents a multiple assignment operation, where both sides of the assignment have tuple type, e.g. [a, b, c] = [d, e, f];, or a mass assignment operation, where the left hand side has tuple type and the right hand side does not, e.g. [a, b, c] = 5.0;
     699class TupleAssignExpr : public Expression {
     700  public:
     701        TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname = nullptr );
     702        TupleAssignExpr( const TupleAssignExpr &other );
     703        virtual ~TupleAssignExpr();
     704
     705        std::list< Expression * > & get_assigns() { return assigns; }
     706        std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; }
     707
     708        virtual TupleAssignExpr *clone() const { return new TupleAssignExpr( *this ); }
     709        virtual void accept( Visitor &v ) { v.visit( this ); }
     710        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     711        virtual void print( std::ostream &os, int indent = 0 ) const;
     712  private:
     713        std::list< Expression * > assigns; // assignment expressions that use tempDecls
     714        std::list< ObjectDecl * > tempDecls; // temporaries for address of lhs exprs
     715};
     716
     717/// StmtExpr represents a GCC 'statement expression', e.g. ({ int x = 5; x; })
     718class StmtExpr : public Expression {
     719public:
     720        StmtExpr( CompoundStmt *statements );
     721        StmtExpr( const StmtExpr & other );
     722        virtual ~StmtExpr();
     723
     724        CompoundStmt * get_statements() const { return statements; }
     725        StmtExpr * set_statements( CompoundStmt * newValue ) { statements = newValue; return this; }
     726
     727        virtual StmtExpr *clone() const { return new StmtExpr( *this ); }
     728        virtual void accept( Visitor &v ) { v.visit( this ); }
     729        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     730        virtual void print( std::ostream &os, int indent = 0 ) const;
     731private:
     732        CompoundStmt * statements;
    673733};
    674734
  • src/SynTree/Mutator.cc

    r906e24d raa8f9df  
    216216        memberExpr->set_result( maybeMutate( memberExpr->get_result(), *this ) );
    217217        memberExpr->set_aggregate( maybeMutate( memberExpr->get_aggregate(), *this ) );
     218        memberExpr->set_member( maybeMutate( memberExpr->get_member(), *this ) );
    218219        return memberExpr;
    219220}
     
    307308}
    308309
    309 Expression *Mutator::mutate( TupleExpr *tupleExpr ) {
    310         tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
    311         mutateAll( tupleExpr->get_exprs(), *this );
    312         return tupleExpr;
    313 }
    314 
    315 Expression *Mutator::mutate( SolvedTupleExpr *tupleExpr ) {
    316         tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
    317         mutateAll( tupleExpr->get_exprs(), *this );
    318         return tupleExpr;
    319 }
    320 
    321310Expression *Mutator::mutate( TypeExpr *typeExpr ) {
    322311        typeExpr->set_result( maybeMutate( typeExpr->get_result(), *this ) );
     
    361350        rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) );
    362351        return rangeExpr;
     352}
     353
     354Expression *Mutator::mutate( TupleExpr *tupleExpr ) {
     355        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     356        mutateAll( tupleExpr->get_exprs(), *this );
     357        return tupleExpr;
     358}
     359
     360Expression *Mutator::mutate( TupleIndexExpr *tupleExpr ) {
     361        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     362        tupleExpr->set_tuple( maybeMutate( tupleExpr->get_tuple(), *this ) );
     363        return tupleExpr;
     364}
     365
     366Expression *Mutator::mutate( MemberTupleExpr *tupleExpr ) {
     367        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     368        tupleExpr->set_member( maybeMutate( tupleExpr->get_member(), *this ) );
     369        tupleExpr->set_aggregate( maybeMutate( tupleExpr->get_aggregate(), *this ) );
     370        return tupleExpr;
     371}
     372
     373Expression *Mutator::mutate( TupleAssignExpr *assignExpr ) {
     374        assignExpr->set_result( maybeMutate( assignExpr->get_result(), *this ) );
     375        mutateAll( assignExpr->get_tempDecls(), *this );
     376        mutateAll( assignExpr->get_assigns(), *this );
     377        return assignExpr;
     378}
     379
     380Expression *Mutator::mutate( StmtExpr *stmtExpr ) {
     381        stmtExpr->set_result( maybeMutate( stmtExpr->get_result(), *this ) );
     382        stmtExpr->set_statements( maybeMutate( stmtExpr->get_statements(), *this ) );
     383        return stmtExpr;
    363384}
    364385
  • src/SynTree/Mutator.h

    r906e24d raa8f9df  
    7171        virtual Expression* mutate( ConditionalExpr *conditionalExpr );
    7272        virtual Expression* mutate( CommaExpr *commaExpr );
    73         virtual Expression* mutate( TupleExpr *tupleExpr );
    74         virtual Expression* mutate( SolvedTupleExpr *tupleExpr );
    7573        virtual Expression* mutate( TypeExpr *typeExpr );
    7674        virtual Expression* mutate( AsmExpr *asmExpr );
     
    8078        virtual Expression* mutate( UntypedValofExpr *valofExpr );
    8179        virtual Expression* mutate( RangeExpr *rangeExpr );
     80        virtual Expression* mutate( TupleExpr *tupleExpr );
     81        virtual Expression* mutate( TupleIndexExpr *tupleExpr );
     82        virtual Expression* mutate( MemberTupleExpr *tupleExpr );
     83        virtual Expression* mutate( TupleAssignExpr *assignExpr );
     84        virtual Expression* mutate( StmtExpr * stmtExpr );
    8285
    8386        virtual Type* mutate( VoidType *basicType );
  • src/SynTree/ReferenceToType.cc

    r906e24d raa8f9df  
    5656        }
    5757} // namespace
     58
     59StructInstType::StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct ) : Parent( tq, baseStruct->get_name() ), baseStruct( baseStruct ) {}
    5860
    5961std::string StructInstType::typeString() const { return "struct"; }
  • src/SynTree/SynTree.h

    r906e24d raa8f9df  
    7676class ConditionalExpr;
    7777class CommaExpr;
    78 class TupleExpr;
    79 class SolvedTupleExpr;
    8078class TypeExpr;
    8179class AsmExpr;
     
    8583class UntypedValofExpr;
    8684class RangeExpr;
     85class TupleExpr;
     86class TupleIndexExpr;
     87class MemberTupleExpr;
     88class TupleAssignExpr;
     89class StmtExpr;
    8790
    8891class Type;
  • src/SynTree/TupleExpr.cc

    r906e24d raa8f9df  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // TupleExpr.cc -- 
     7// TupleExpr.cc --
    88//
    99// Author           : Richard C. Bilson
     
    1616#include "Expression.h"
    1717#include "Common/utility.h"
     18#include "Type.h"
     19#include "Declaration.h"
    1820
    1921TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) {
     
    2931
    3032void TupleExpr::print( std::ostream &os, int indent ) const {
    31         os << std::string( indent, ' ' ) << "Tuple:" << std::endl;
     33        os << "Tuple:" << std::endl;
    3234        printAll( exprs, os, indent+2 );
    3335        Expression::print( os, indent );
    3436}
    3537
    36 SolvedTupleExpr::SolvedTupleExpr( std::list<Expression *> &_exprs, Expression *_aname ) : Expression( _aname ) {
    37         std::copy(_exprs.begin(), _exprs.end(), back_inserter(exprs));
     38TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) {
     39        TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() );
     40        assert( type->size() >= index );
     41        set_result( *std::next( type->get_types().begin(), index ) );
    3842}
    3943
    40 SolvedTupleExpr::SolvedTupleExpr( const SolvedTupleExpr &other ) : Expression( other ) {
    41         cloneAll( other.exprs, exprs );
     44TupleIndexExpr::TupleIndexExpr( const TupleIndexExpr &other ) : Expression( other ), tuple( other.tuple->clone() ), index( other.index ) {
    4245}
    4346
    44 void SolvedTupleExpr::print( std::ostream &os, int indent ) const {
    45         os << std::string( indent, ' ' ) << "Solved Tuple:" << std::endl;
    46         printAll( exprs, os, indent+2 );
     47TupleIndexExpr::~TupleIndexExpr() {
     48        delete tuple;
     49}
     50
     51void TupleIndexExpr::print( std::ostream &os, int indent ) const {
     52        os << "Tuple Index Expression, with tuple:" << std::endl;
     53        tuple->print( os, indent+2 );
     54        os << std::string( indent+2, ' ' ) << "with index: " << index << std::endl;
    4755        Expression::print( os, indent );
    4856}
     57
     58MemberTupleExpr::MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname ) : Expression( _aname ) {
     59        set_result( maybeClone( member->get_result() ) ); // xxx - ???
     60}
     61
     62MemberTupleExpr::MemberTupleExpr( const MemberTupleExpr &other ) : Expression( other ), member( other.member->clone() ), aggregate( other.aggregate->clone() ) {
     63}
     64
     65MemberTupleExpr::~MemberTupleExpr() {
     66        delete member;
     67        delete aggregate;
     68}
     69
     70void MemberTupleExpr::print( std::ostream &os, int indent ) const {
     71        os << "Member Tuple Expression, with aggregate:" << std::endl;
     72        aggregate->print( os, indent+2 );
     73        os << std::string( indent+2, ' ' ) << "with member: " << std::endl;
     74        member->print( os, indent+2 );
     75        Expression::print( os, indent );
     76}
     77
     78
     79TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname ) : Expression( _aname ), assigns( assigns ), tempDecls( tempDecls ) {
     80        TupleType * type = new TupleType( Type::Qualifiers() );
     81        for ( Expression * expr : assigns ) {
     82                assert( expr->has_result() );
     83                type->get_types().push_back( expr->get_result()->clone() );
     84        }
     85        set_result( type );
     86}
     87
     88TupleAssignExpr::TupleAssignExpr( const TupleAssignExpr &other ) : Expression( other ), tempDecls( other.tempDecls ) /* temporary */ {
     89        cloneAll( other.assigns, assigns );
     90        // xxx - clone needs to go into assigns and replace tempDecls
     91}
     92
     93TupleAssignExpr::~TupleAssignExpr() {
     94        deleteAll( assigns );
     95        // deleteAll( tempDecls );
     96}
     97
     98void TupleAssignExpr::print( std::ostream &os, int indent ) const {
     99        os << std::string( indent, ' ' ) << "Tuple Assignment Expression, with temporaries:" << std::endl;
     100        printAll( tempDecls, os, indent+4 );
     101        os << std::string( indent+2, ' ' ) << "with assignments: " << std::endl;
     102        printAll( assigns, os, indent+4 );
     103        Expression::print( os, indent );
     104}
     105
     106
    49107
    50108// Local Variables: //
  • src/SynTree/TupleType.cc

    r906e24d raa8f9df  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // TupleType.cc -- 
     7// TupleType.cc --
    88//
    99// Author           : Richard C. Bilson
     
    1717#include "Common/utility.h"
    1818
    19 TupleType::TupleType( const Type::Qualifiers &tq ) : Type( tq ) {
     19TupleType::TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types ) : Type( tq ), types( types ) {
    2020}
    2121
  • src/SynTree/Type.h

    r906e24d raa8f9df  
    2727                Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic, bool isAttribute ): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ), isAttribute( isAttribute ) {}
    2828
     29                Qualifiers &operator&=( const Qualifiers &other );
    2930                Qualifiers &operator+=( const Qualifiers &other );
    3031                Qualifiers &operator-=( const Qualifiers &other );
     
    240241  public:
    241242        StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {}
     243        StructInstType( const Type::Qualifiers &tq, StructDecl * baseStruct );
    242244        StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {}
    243245
     
    354356class TupleType : public Type {
    355357  public:
    356         TupleType( const Type::Qualifiers &tq );
     358        TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types = std::list< Type * >() );
    357359        TupleType( const TupleType& );
    358360        virtual ~TupleType();
    359361
     362        typedef std::list<Type*> value_type;
     363        typedef value_type::iterator iterator;
     364
    360365        std::list<Type*>& get_types() { return types; }
    361366        virtual unsigned size() const { return types.size(); };
     367
     368        iterator begin() { return types.begin(); }
     369        iterator end() { return types.end(); }
    362370
    363371        virtual TupleType *clone() const { return new TupleType( *this ); }
     
    425433};
    426434
     435inline Type::Qualifiers &Type::Qualifiers::operator&=( const Type::Qualifiers &other ) {
     436        isConst &= other.isConst;
     437        isVolatile &= other.isVolatile;
     438        isRestrict &= other.isRestrict;
     439        isLvalue &= other.isLvalue;
     440        isAtomic &= other.isAtomic;
     441        return *this;
     442}
     443
    427444inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) {
    428445        isConst |= other.isConst;
  • src/SynTree/Visitor.cc

    r906e24d raa8f9df  
    182182        maybeAccept( memberExpr->get_result(), *this );
    183183        maybeAccept( memberExpr->get_aggregate(), *this );
     184        maybeAccept( memberExpr->get_member(), *this );
    184185}
    185186
     
    260261}
    261262
    262 void Visitor::visit( TupleExpr *tupleExpr ) {
    263         maybeAccept( tupleExpr->get_result(), *this );
    264         acceptAll( tupleExpr->get_exprs(), *this );
    265 }
    266 
    267 void Visitor::visit( SolvedTupleExpr *tupleExpr ) {
    268         maybeAccept( tupleExpr->get_result(), *this );
    269         acceptAll( tupleExpr->get_exprs(), *this );
    270 }
    271 
    272263void Visitor::visit( TypeExpr *typeExpr ) {
    273264        maybeAccept( typeExpr->get_result(), *this );
     
    306297        maybeAccept( rangeExpr->get_low(), *this );
    307298        maybeAccept( rangeExpr->get_high(), *this );
     299}
     300
     301void Visitor::visit( TupleExpr *tupleExpr ) {
     302        maybeAccept( tupleExpr->get_result(), *this );
     303        acceptAll( tupleExpr->get_exprs(), *this );
     304}
     305
     306void Visitor::visit( TupleIndexExpr *tupleExpr ) {
     307        maybeAccept( tupleExpr->get_result(), *this );
     308        maybeAccept( tupleExpr->get_tuple(), *this );
     309}
     310
     311void Visitor::visit( MemberTupleExpr *tupleExpr ) {
     312        maybeAccept( tupleExpr->get_result(), *this );
     313        maybeAccept( tupleExpr->get_member(), *this );
     314        maybeAccept( tupleExpr->get_aggregate(), *this );
     315}
     316
     317void Visitor::visit( TupleAssignExpr *assignExpr ) {
     318        maybeAccept( assignExpr->get_result(), *this );
     319        acceptAll( assignExpr->get_tempDecls(), *this );
     320        acceptAll( assignExpr->get_assigns(), *this );
     321}
     322
     323void Visitor::visit( StmtExpr *stmtExpr ) {
     324        maybeAccept( stmtExpr->get_result(), *this );
     325        maybeAccept( stmtExpr->get_statements(), *this );
    308326}
    309327
  • src/SynTree/Visitor.h

    r906e24d raa8f9df  
    7171        virtual void visit( ConditionalExpr *conditionalExpr );
    7272        virtual void visit( CommaExpr *commaExpr );
    73         virtual void visit( TupleExpr *tupleExpr );
    74         virtual void visit( SolvedTupleExpr *tupleExpr );
    7573        virtual void visit( TypeExpr *typeExpr );
    7674        virtual void visit( AsmExpr *asmExpr );
     
    8078        virtual void visit( UntypedValofExpr *valofExpr );
    8179        virtual void visit( RangeExpr *rangeExpr );
     80        virtual void visit( TupleExpr *tupleExpr );
     81        virtual void visit( TupleIndexExpr *tupleExpr );
     82        virtual void visit( MemberTupleExpr *tupleExpr );
     83        virtual void visit( TupleAssignExpr *assignExpr );
     84        virtual void visit( StmtExpr * stmtExpr );
    8285
    8386        virtual void visit( VoidType *basicType );
  • src/Tuples/TupleAssignment.cc

    r906e24d raa8f9df  
    1818#include "ResolvExpr/typeops.h"
    1919#include "SynTree/Expression.h"
    20 #include "TupleAssignment.h"
     20#include "SynTree/Initializer.h"
     21#include "Tuples.h"
    2122#include "Common/SemanticError.h"
    2223
     
    2728#include <cassert>
    2829#include <set>
     30#include <unordered_set>
    2931
    3032namespace Tuples {
    31         TupleAssignSpotter::TupleAssignSpotter( ResolvExpr::AlternativeFinder *f = 0 )
    32                 : currentFinder(f), matcher(0), hasMatched( false ) {}
    33 
    34         bool TupleAssignSpotter::pointsToTuple( Expression *expr ) {
     33        class TupleAssignSpotter {
     34          public:
     35                // dispatcher for Tuple (multiple and mass) assignment operations
     36                TupleAssignSpotter( ResolvExpr::AlternativeFinder & );
     37                void spot( UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities );
     38
     39          private:
     40                void match();
     41                // records for assignment generation
     42                struct Options {
     43                        void print( std::ostream & );
     44                        int size() const { return options.size(); }
     45                        bool empty() const { return options.empty(); }
     46                        typedef std::list< ResolvExpr::AltList >::iterator iterator;
     47                        iterator begin() { return options.begin(); }
     48                        iterator end() { return options.end(); }
     49
     50                        std::list< ResolvExpr::AltList > options;
     51                };
     52
     53                struct Matcher {
     54                  public:
     55                        Matcher( TupleAssignSpotter &spotter, Expression *_lhs, Expression *_rhs );
     56                        virtual ~Matcher() {}
     57                        virtual void match( std::list< Expression * > &out ) = 0;
     58                        std::list< Expression * > lhs, rhs;
     59                        TupleAssignSpotter &spotter;
     60                        std::list< ObjectDecl * > tmpDecls;
     61                };
     62
     63                struct MassAssignMatcher : public Matcher {
     64                  public:
     65                        MassAssignMatcher( TupleAssignSpotter &spotter, Expression *lhs, Expression *rhs ) : Matcher( spotter, lhs, rhs ) {
     66                                this->rhs.push_back( rhs );
     67                        }
     68                        virtual void match( std::list< Expression * > &out );
     69                };
     70
     71                struct MultipleAssignMatcher : public Matcher {
     72                  public:
     73                        MultipleAssignMatcher( TupleAssignSpotter &spot, Expression *lhs, Expression *rhs );
     74                        virtual void match( std::list< Expression * > &out );
     75                };
     76
     77                ResolvExpr::AlternativeFinder &currentFinder;
     78                // Expression *rhs, *lhs;
     79                Matcher *matcher = nullptr;
     80                Options options;
     81        };
     82
     83        bool isTupleVar( DeclarationWithType *decl ) {
     84                return dynamic_cast< TupleType * >( decl->get_type() );
     85        }
     86
     87        /// true if expr is an expression of tuple type, i.e. a tuple expression, tuple variable, or MRV (multiple-return-value) function
     88        bool isTuple( Expression *expr ) {
     89                if ( ! expr ) return false;
     90                assert( expr->has_result() );
     91                // xxx - used to include cast to varExpr and call to isTupleVar, but this doesn't seem like it should be necessary
     92                return dynamic_cast<TupleExpr *>(expr) || expr->get_result()->size() > 1;
     93        }
     94
     95        bool pointsToTuple( Expression *expr ) {
    3596                // also check for function returning tuple of reference types
    36                 if (AddressExpr *addr = dynamic_cast<AddressExpr *>(expr) )
    37                         if ( isTuple(addr->get_arg() ) )
    38                                 return true;
     97                if ( AddressExpr *addr = dynamic_cast< AddressExpr * >( expr) ) {
     98                        return isTuple( addr->get_arg() );
     99                }
    39100                return false;
    40101        }
    41102
    42         bool TupleAssignSpotter::isTupleVar( DeclarationWithType *decl ) {
    43                 if ( dynamic_cast<TupleType *>(decl->get_type()) )
    44                         return true;
    45                 return false;
    46         }
    47 
    48         bool TupleAssignSpotter::isTuple( Expression *expr, bool isRight ) {
    49                 // true if `expr' is an expression returning a tuple: tuple, tuple variable or MRV function
    50                 if ( ! expr ) return false;
    51 
    52                 if ( dynamic_cast<TupleExpr *>(expr) )
    53                         return true;
    54                 else if ( VariableExpr *var = dynamic_cast<VariableExpr *>(expr) ) {
    55                         if ( isTupleVar(var->get_var()) )
    56                                 return true;
    57                 }
    58 
    59                 return false;
    60         }
    61 
    62         bool TupleAssignSpotter::match() {
    63                 assert ( matcher != 0 );
    64 
    65                 std::list< Expression * > new_assigns;
    66                 if ( ! matcher->match(new_assigns) )
    67                         return false;
    68 
    69                 if ( new_assigns.empty() ) return false;
    70                 /*return */matcher->solve( new_assigns );
    71                 if ( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
    72                         // now resolve new assignments
    73                         std::list< Expression * > solved_assigns;
    74                         ResolvExpr::AltList solved_alts;
    75                         assert( currentFinder != 0 );
    76 
    77                         ResolvExpr::AltList current;
    78                         for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
    79                                 //try {
    80                                 ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
    81                                 finder.findWithAdjustment(*i);
    82                                 // prune expressions that don't coincide with
    83                                 ResolvExpr::AltList alts = finder.get_alternatives();
    84                                 assert( alts.size() == 1 );
    85                                 assert(alts.front().expr != 0 );
    86                                 current.push_back( finder.get_alternatives().front() );
    87                                 solved_assigns.push_back( alts.front().expr->clone() );
    88                                 //solved_assigns.back()->print(std::cerr);
    89                                 /*} catch( ... ) {
    90                                   continue; // no reasonable alternative found
    91                                   }*/
    92                         }
    93                         options.add_option( current );
    94 
    95                         return true;
    96                 } else { // mass assignment
    97                         //if ( new_assigns.empty() ) return false;
    98                         std::list< Expression * > solved_assigns;
    99                         ResolvExpr::AltList solved_alts;
    100                         assert( currentFinder != 0 );
    101 
    102                         ResolvExpr::AltList current;
    103                         if ( optMass.empty() ) {
    104                                 for ( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
    105                                         optMass.push_back( ResolvExpr::AltList() );
    106                         }
    107                         int cnt = 0;
    108                         for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
    109 
    110                                 ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
    111                                 finder.findWithAdjustment(*i);
    112                                 ResolvExpr::AltList alts = finder.get_alternatives();
    113                                 assert( alts.size() == 1 );
    114                                 assert(alts.front().expr != 0 );
    115                                 current.push_back( finder.get_alternatives().front() );
    116                                 optMass[cnt].push_back( finder.get_alternatives().front() );
    117                                 solved_assigns.push_back( alts.front().expr->clone() );
    118                         }
    119 
    120                         return true;
    121                 }
    122 
    123                 return false;
    124         }
    125 
    126         bool TupleAssignSpotter::isMVR( Expression *expr ) {
    127                 return isTuple( expr );
    128         }
    129 
    130         bool TupleAssignSpotter::isTupleAssignment( UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
     103        bool isTupleExpr( Expression *expr ) {
     104                assert( expr->has_result() );
     105                return expr->get_result()->size() > 1;
     106        }
     107
     108        void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
     109                TupleAssignSpotter spotter( currentFinder );
     110                spotter.spot( expr, possibilities );
     111        }
     112
     113        TupleAssignSpotter::TupleAssignSpotter( ResolvExpr::AlternativeFinder &f )
     114                : currentFinder(f) {}
     115
     116        void TupleAssignSpotter::spot( UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
    131117                if (  NameExpr *assgnop = dynamic_cast< NameExpr * >(expr->get_function()) ) {
    132 
    133118                        if ( assgnop->get_name() == std::string("?=?") ) {
    134 
    135119                                for ( std::list<ResolvExpr::AltList>::iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) {
    136120                                        assert( ali->size() == 2 );
    137                                         ResolvExpr::AltList::iterator opit = ali->begin();
    138                                         ResolvExpr::Alternative op1 = *opit, op2 = *(++opit);
    139 
     121                                        ResolvExpr::Alternative op1 = ali->front(), op2 = ali->back();
     122
     123                                        MultipleAssignMatcher multiMatcher( *this, op1.expr, op2.expr );
     124                                        MassAssignMatcher massMatcher( *this, op1.expr, op2.expr );
    140125                                        if ( pointsToTuple(op1.expr) ) { // also handles tuple vars
    141                                                 if ( isTuple( op2.expr, true ) )
    142                                                         matcher = new MultipleAssignMatcher(op1.expr, op2.expr);
    143                                                 else if ( isMVR( op2.expr ) ) {
    144                                                         // handle MVR differently
    145                                                 } else
     126                                                if ( isTuple( op2.expr ) ) {
     127                                                        matcher = &multiMatcher;
     128                                                } else {
    146129                                                        // mass assignment
    147                                                         matcher = new MassAssignMatcher(op1.expr, op2.expr);
    148 
    149                                                 std::list< ResolvExpr::AltList > options;
    150                                                 if ( match() )
    151                                                         /*
    152                                                           if ( hasMatched ) {
    153                                                           // throw SemanticError("Ambiguous tuple assignment");
    154                                                           } else {*/
    155                                                         // Matched for the first time
    156                                                         hasMatched = true;
    157                                                 /*} */
    158                                         } /* else if ( isTuple( op2 ) )
    159                                                  throw SemanticError("Inapplicable tuple assignment.");
    160                                           */
    161                                 }
    162 
    163                                 if ( hasMatched ) {
    164                                         if ( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
    165                                                 //options.print( std::cerr );
    166                                                 std::list< ResolvExpr::AltList >best = options.get_best();
    167                                                 if ( best.size() == 1 ) {
    168                                                         std::list<Expression *> solved_assigns;
    169                                                         for ( ResolvExpr::AltList::iterator i = best.front().begin(); i != best.front().end(); ++i ) {
    170                                                                 solved_assigns.push_back( i->expr );
    171                                                         }
    172                                                         /* assigning cost zero? */
    173                                                         currentFinder->get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns/*, SolvedTupleExpr::MULTIPLE*/), currentFinder->get_environ(), ResolvExpr::Cost() ) );
     130                                                        matcher = &massMatcher;
    174131                                                }
    175                                         } else {
    176                                                 assert( ! optMass.empty() );
    177                                                 ResolvExpr::AltList winners;
    178                                                 for ( std::vector< ResolvExpr::AltList >::iterator i = optMass.begin(); i != optMass.end(); ++i )
    179                                                         findMinCostAlt( i->begin(), i->end(), back_inserter(winners) );
    180 
    181                                                 std::list< Expression *> solved_assigns;
    182                                                 for ( ResolvExpr::AltList::iterator i = winners.begin(); i != winners.end(); ++i )
    183                                                         solved_assigns.push_back( i->expr );
    184                                                 currentFinder->get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns/*, SolvedTupleExpr::MASS*/), currentFinder->get_environ(), ResolvExpr::Cost() ) );
     132                                                match();
     133                                        } else if ( isTuple( op2.expr ) ) {
     134                                                throw SemanticError("Cannot assign a tuple value into a non-tuple lvalue.", expr);
    185135                                        }
    186136                                }
    187137                        }
    188138                }
    189                 return hasMatched;
    190         }
    191 
    192         void TupleAssignSpotter::Matcher::init( Expression *_lhs, Expression *_rhs ) {
    193                 lhs.clear();
    194                 if (AddressExpr *addr = dynamic_cast<AddressExpr *>(_lhs) )
     139        }
     140
     141        void TupleAssignSpotter::match() {
     142                assert ( matcher != 0 );
     143
     144                std::list< Expression * > new_assigns;
     145                matcher->match( new_assigns );
     146
     147                if ( new_assigns.empty() ) return;
     148                ResolvExpr::AltList current;
     149                // now resolve new assignments
     150                for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
     151                        ResolvExpr::AlternativeFinder finder( currentFinder.get_indexer(), currentFinder.get_environ() );
     152                        finder.findWithAdjustment(*i);
     153                        // prune expressions that don't coincide with
     154                        ResolvExpr::AltList alts = finder.get_alternatives();
     155                        assert( alts.size() == 1 );
     156                        assert( alts.front().expr != 0 );
     157                        current.push_back( alts.front() );
     158                }
     159
     160                // extract expressions from the assignment alternatives to produce a list of assignments that
     161                // together form a single alternative
     162                std::list< Expression *> solved_assigns;
     163                for ( ResolvExpr::Alternative & alt : current ) {
     164                        solved_assigns.push_back( alt.expr->clone() );
     165                }
     166                // xxx - need to do this??
     167                // TypeEnvironment compositeEnv;
     168                // simpleCombineEnvironments( i->begin(), i->end(), compositeEnv );
     169                currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new TupleAssignExpr(solved_assigns, matcher->tmpDecls), currentFinder.get_environ(), ResolvExpr::sumCost( current ) ) );
     170        }
     171
     172        TupleAssignSpotter::Matcher::Matcher( TupleAssignSpotter &spotter, Expression *lhs, Expression *rhs ) : spotter(spotter) {
     173                // xxx - shouldn't need to be &<tuple-expr>, just &<lvalue-tuple-type>
     174                if (AddressExpr *addr = dynamic_cast<AddressExpr *>(lhs) )
    195175                        if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(addr->get_arg()) )
    196                                 std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(lhs) );
    197 
    198                 rhs.clear();
    199         }
    200 
    201         TupleAssignSpotter::Matcher::Matcher( /*TupleAssignSpotter &spot,*/ Expression *_lhs, Expression *_rhs ) /*: own_spotter(spot) */{
    202                 init(_lhs,_rhs);
    203         }
    204 
    205         TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( Expression *_lhs, Expression *_rhs )/* : own_spotter(spot) */{
    206                 init(_lhs,_rhs);
    207 
    208                 if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(_rhs) )
    209                         std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(rhs) );
    210         }
    211 
    212         UntypedExpr *TupleAssignSpotter::Matcher::createAssgn( Expression *left, Expression *right ) {
    213                 if ( left && right ) {
    214                         std::list< Expression * > args;
    215                         args.push_back(new AddressExpr(left->clone()));  args.push_back(right->clone());
    216                         return new UntypedExpr(new NameExpr("?=?"), args);
    217                 } else
    218                         throw 0; // xxx - diagnose the problem
    219         }
    220 
    221         bool TupleAssignSpotter::MassAssignMatcher::match( std::list< Expression * > &out ) {
    222                 if ( lhs.empty() || (rhs.size() != 1) ) return false;
    223 
    224                 for ( std::list< Expression * >::iterator l = lhs.begin(); l != lhs.end(); l++ ) {
    225                         std::list< Expression * > args;
    226                         args.push_back( new AddressExpr(*l) );
    227                         args.push_back( rhs.front() );
    228                         out.push_back( new UntypedExpr(new NameExpr("?=?"), args) );
    229                 }
    230 
    231                 return true;
    232         }
    233 
    234         bool TupleAssignSpotter::MassAssignMatcher::solve( std::list< Expression * > &assigns ) {
    235                 /*
    236                   std::list< Expression * > solved_assigns;
    237                   ResolvExpr::AltList solved_alts;
    238                   assert( currentFinder != 0 );
    239 
    240                   ResolvExpr::AltList current;
    241                   if ( optMass.empty() ) {
    242                   for ( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
    243                   optMass.push_back( ResolvExpr::AltList() );
    244                   }
    245                   int cnt = 0;
    246                   for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
    247 
    248                   ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
    249                   finder.findWithAdjustment(*i);
    250                   ResolvExpr::AltList alts = finder.get_alternatives();
    251                   assert( alts.size() == 1 );
    252                   assert(alts.front().expr != 0 );
    253                   current.push_back( finder.get_alternatives().front() );
    254                   optMass[cnt].push_back( finder.get_alternatives().front() );
    255                   solved_assigns.push_back( alts.front().expr->clone() );
    256                   }
    257                 */
    258                 return true;
    259         }
    260 
    261         bool TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) {
    262                 // need more complicated matching
     176                                std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(this->lhs) );
     177        }
     178
     179        TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( TupleAssignSpotter &spotter, Expression *lhs, Expression *rhs ) : Matcher( spotter, lhs, rhs ) {
     180
     181                if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(rhs) )
     182                        std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(this->rhs) );
     183        }
     184
     185        UntypedExpr * createAssgn( ObjectDecl *left, ObjectDecl *right ) {
     186                assert( left && right );
     187                std::list< Expression * > args;
     188                args.push_back( new AddressExpr( new UntypedExpr( new NameExpr("*?"), std::list< Expression * >{ new VariableExpr( left ) } ) ) );
     189                args.push_back( new VariableExpr( right ) );
     190                return new UntypedExpr( new NameExpr( "?=?" ), args );
     191        }
     192
     193        ObjectDecl * newObject( UniqueName & namer, Expression * expr ) {
     194                assert( expr->has_result() && ! expr->get_result()->isVoid() );
     195                return new ObjectDecl( namer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) );
     196        }
     197
     198        void TupleAssignSpotter::MassAssignMatcher::match( std::list< Expression * > &out ) {
     199                static UniqueName lhsNamer( "__massassign_L" );
     200                static UniqueName rhsNamer( "__massassign_R" );
     201                assert ( ! lhs.empty() && rhs.size() == 1);
     202
     203                ObjectDecl * rtmp = newObject( rhsNamer, rhs.front() );
     204                for ( Expression * l : lhs ) {
     205                        ObjectDecl * ltmp = newObject( lhsNamer, new AddressExpr( l ) );
     206                        out.push_back( createAssgn( ltmp, rtmp ) );
     207                        tmpDecls.push_back( ltmp );
     208                }
     209                tmpDecls.push_back( rtmp );
     210        }
     211
     212        void TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) {
     213                static UniqueName lhsNamer( "__multassign_L" );
     214                static UniqueName rhsNamer( "__multassign_R" );
     215                // xxx - need more complicated matching?
    263216                if ( lhs.size() == rhs.size() ) {
    264                         zipWith( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), back_inserter(out), TupleAssignSpotter::Matcher::createAssgn );
    265                         return true;
    266                 } //else
    267                 //std::cerr << "The length of (left, right) is: (" << lhs.size() << "," << rhs.size() << ")" << std::endl;*/
    268                 return false;
    269         }
    270 
    271         bool TupleAssignSpotter::MultipleAssignMatcher::solve( std::list< Expression * > &assigns ) {
    272                 /*
    273                   std::list< Expression * > solved_assigns;
    274                   ResolvExpr::AltList solved_alts;
    275                   assert( currentFinder != 0 );
    276 
    277                   ResolvExpr::AltList current;
    278                   for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
    279                   //try {
    280                   ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
    281                   finder.findWithAdjustment(*i);
    282                   // prune expressions that don't coincide with
    283                   ResolvExpr::AltList alts = finder.get_alternatives();
    284                   assert( alts.size() == 1 );
    285                   assert(alts.front().expr != 0 );
    286                   current.push_back( finder.get_alternatives().front() );
    287                   solved_assigns.push_back( alts.front().expr->clone() );
    288                   //solved_assigns.back()->print(std::cerr);
    289                   //} catch( ... ) {
    290                   //continue; // no reasonable alternative found
    291                   //}
    292                   }
    293                   options.add_option( current );
    294                 */
    295 
    296                 return true;
    297         }
    298 
    299         void TupleAssignSpotter::Options::add_option( ResolvExpr::AltList &opt ) {
    300                 using namespace std;
    301 
    302                 options.push_back( opt );
    303                 /*
    304                   vector< Cost > costs;
    305                   costs.reserve( opt.size() );
    306                   transform( opt.begin(), opt.end(), back_inserter(costs), ptr_fun(extract_cost) );
    307                 */
    308                 // transpose matrix
    309                 if ( costMatrix.empty() )
    310                         for ( unsigned int i = 0; i< opt.size(); ++i)
    311                                 costMatrix.push_back( vector<ResolvExpr::Cost>() );
    312 
    313                 int cnt = 0;
    314                 for ( ResolvExpr::AltList::iterator i = opt.begin(); i != opt.end(); ++i, cnt++ )
    315                         costMatrix[cnt].push_back( i->cost );
    316 
    317                 return;
    318         }
    319 
    320         std::list< ResolvExpr::AltList > TupleAssignSpotter::Options::get_best() {
    321                 using namespace std;
    322                 using namespace ResolvExpr;
    323                 list< ResolvExpr::AltList > ret;
    324                 list< multiset<int> > solns;
    325                 for ( vector< vector<Cost> >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
    326                         list<int> current;
    327                         findMinCost( i->begin(), i->end(), back_inserter(current) );
    328                         solns.push_back( multiset<int>(current.begin(), current.end()) );
    329                 }
    330                 // need to combine
    331                 multiset<int> result;
    332                 lift_intersection( solns.begin(), solns.end(), inserter( result, result.begin() ) );
    333                 if ( result.size() != 1 )
    334                         throw SemanticError("Ambiguous tuple expression");
    335                 ret.push_back(get_option( *(result.begin() )));
    336                 return ret;
     217                        std::list< ObjectDecl * > ltmp;
     218                        std::list< ObjectDecl * > rtmp;
     219                        std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), []( Expression * expr ){
     220                                return newObject( lhsNamer, new AddressExpr( expr ) );
     221                        });
     222                        std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), []( Expression * expr ){
     223                                return newObject( rhsNamer, expr );
     224                        });
     225                        zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), createAssgn );
     226                        tmpDecls.splice( tmpDecls.end(), ltmp );
     227                        tmpDecls.splice( tmpDecls.end(), rtmp );
     228                }
    337229        }
    338230
    339231        void TupleAssignSpotter::Options::print( std::ostream &ostr ) {
    340                 using namespace std;
    341 
    342                 for ( vector< vector < ResolvExpr::Cost > >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
    343                         for ( vector < ResolvExpr::Cost >::iterator j = i->begin(); j != i->end(); ++j )
    344                                 ostr << *j << " " ;
     232                for ( ResolvExpr::AltList & l : options ) {
     233                        for ( ResolvExpr::Alternative & alt : l ) {
     234                                alt.print( ostr );
     235                                ostr << " ";
     236                        }
    345237                        ostr << std::endl;
    346238                } // for
    347                 return;
    348         }
    349 
    350         ResolvExpr::Cost extract_cost( ResolvExpr::Alternative &alt ) {
    351                 return alt.cost;
    352         }
    353 
    354         template< typename InputIterator, typename OutputIterator >
    355         void TupleAssignSpotter::Options::findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
    356                 using namespace ResolvExpr;
    357                 std::list<int> alternatives;
    358 
    359                 // select the alternatives that have the minimum parameter cost
    360                 Cost minCost = Cost::infinity;
    361                 unsigned int index = 0;
    362                 for ( InputIterator i = begin; i != end; ++i, index++ ) {
    363                         if ( *i < minCost ) {
    364                                 minCost = *i;
    365                                 alternatives.clear();
    366                                 alternatives.push_back( index );
    367                         } else if ( *i == minCost ) {
    368                                 alternatives.push_back( index );
    369                         }
    370                 }
    371                 std::copy( alternatives.begin(), alternatives.end(), out );
    372         }
    373 
    374         template< class InputIterator, class OutputIterator >
    375         void TupleAssignSpotter::Options::lift_intersection( InputIterator begin, InputIterator end, OutputIterator out ) {
    376                 if ( begin == end ) return;
    377                 InputIterator test = begin;
    378 
    379                 if (++test == end)
    380                         { copy(begin->begin(), begin->end(), out); return; }
    381 
    382 
    383                 std::multiset<int> cur; // InputIterator::value_type::value_type
    384                 copy( begin->begin(), begin->end(), inserter( cur, cur.begin() ) );
    385 
    386                 while ( test != end ) {
    387                         std::multiset<int> temp;
    388                         set_intersection( cur.begin(), cur.end(), test->begin(), test->end(), inserter(temp,temp.begin()) );
    389                         cur.clear();
    390                         copy( temp.begin(), temp.end(), inserter(cur,cur.begin()));
    391                         ++test;
    392                 }
    393 
    394                 copy( cur.begin(), cur.end(), out );
    395                 return;
    396         }
    397 
    398         ResolvExpr::AltList TupleAssignSpotter::Options::get_option( std::list< ResolvExpr::AltList >::size_type index ) {
    399                 if ( index >= options.size() )
    400                         throw 0; // XXX
    401                 std::list< ResolvExpr::AltList >::iterator it = options.begin();
    402                 for ( std::list< ResolvExpr::AltList >::size_type i = 0; i < index; ++i, ++it );
    403                 return *it;
    404239        }
    405240} // namespace Tuples
  • src/Tuples/module.mk

    r906e24d raa8f9df  
    66## file "LICENCE" distributed with Cforall.
    77##
    8 ## module.mk -- 
     8## module.mk --
    99##
    1010## Author           : Richard C. Bilson
     
    1616
    1717SRC +=  Tuples/TupleAssignment.cc \
    18         Tuples/NameMatcher.cc
     18        Tuples/TupleExpansion.cc
  • src/examples/gc_no_raii/bug-repro/field.c

    r906e24d raa8f9df  
    6262{
    6363        struct gc_object_header* object;
    64         #if _DEBUG
     64        #ifndef NDEBUG
    6565                intptr_t lower_limit;
    6666                intptr_t upper_limit;
     
    7171                gc_pool_object_iterator* const this,
    7272                void* start_object
    73                 #if _DEBUG
     73                #ifndef NDEBUG
    7474                        , intptr_t pool_start
    7575                        , intptr_t pool_end
  • src/examples/gc_no_raii/src/gcpointers.c

    r906e24d raa8f9df  
    1414                gc_object_header* obj = gc_get_object_for_ref(gc_get_state(), (void*)this);
    1515                check(obj);
    16                 check(gc_obj_is_valide(obj));
    17                 check(gc_is_managed(this) == gc_is_managed(obj->type_chain) || obj->type_chain == NULL);
     16                check(is_valid(obj));
     17                check(gc_is_managed(this) == gc_is_managed(obj->type_chain) || !obj->type_chain);
    1818                this->next = obj->type_chain;
    1919                obj->type_chain = this;
    20                 check(obj->is_valide());
     20                check(is_valid(obj));
    2121        }
    2222        else
     
    2424                gc_object_header* obj = gc_get_object_ptr((void*)this->ptr);
    2525                check(obj);
    26                 check(gc_obj_is_valide(obj));
    27                 check(gc_is_managed(this) == gc_is_managed(obj->root_chain) || obj->root_chain == NULL);
     26                check(is_valid(obj));
     27                check(!obj->root_chain || this->ptr == obj->root_chain->ptr);
     28                check(!obj->root_chain || gc_is_managed(this) == gc_is_managed(obj->root_chain));
    2829                this->next = obj->root_chain;
    2930                obj->root_chain = this;
    30                 check(gc_obj_is_valide(obj));
     31                check(is_valid(obj));
    3132        }
    3233}
     
    6970}
    7071
    71 gcpointer_t* gcpointer_assign(gcpointer_t* this, gcpointer_t* rhs)
     72gcpointer_t ?=?(gcpointer_t* this, gcpointer_t rhs)
    7273{
    73         if(this != rhs)
    74         {
    75                 unregister_ptr(this);
     74        unregister_ptr(this);
     75        this->ptr = rhs.ptr;
     76        register_ptr(this);
    7677
    77                 this->ptr = rhs->ptr;
    78 
    79                 register_ptr(this);
    80         }
    81 
    82         return this;
     78        return *this;
    8379}
    8480
    8581//Logical operators
    86 bool gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs)
     82bool gcpointer_equal(const gcpointer_t* this, const gcpointer_t* rhs)
    8783{
    8884        return this->ptr == rhs->ptr;
    8985}
    9086
    91 bool gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs)
     87bool gcpointer_not_equal(const gcpointer_t* this, const gcpointer_t* rhs)
    9288{
    9389        return this->ptr != rhs->ptr;
    9490}
    9591
    96 bool gcpointer_null(gcpointer_t* this)
     92bool gcpointer_null(const gcpointer_t* this)
    9793{
    9894        return this->ptr == (intptr_t)NULL;
    9995}
     96
     97#ifndef NDEBUG
     98        bool is_valid(const gcpointer_t* this) {
     99                if(gcpointer_null(this)) return true;
     100
     101                gc_object_header* obj = gc_get_object_ptr((void*)this->ptr);
     102                check(obj);
     103                check(is_valid(obj));
     104                check(!obj->root_chain || this->ptr == obj->root_chain->ptr);
     105
     106                if( !gc_is_managed(this))
     107                {
     108                        check( !(this->next) || this->ptr == this->next->ptr );
     109                }
     110
     111                return true;
     112        }
     113#endif
    100114
    101115forall(otype T) void ?{}(gcpointer(T)* this) {
     
    107121}
    108122
    109 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T)* other) {
    110         (&this->internal) { other->internal };
     123forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other) {
     124        (&this->internal) { other.internal };
    111125}
    112126
     
    115129}
    116130
    117 // forall(otype T) gcpointer(T) ?=?(gcpointer(T) this, gcpointer(T) rhs);
     131forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs) {
     132        this->internal = rhs.internal;
     133        return *this;
     134}
    118135//
    119136// forall(otype T) T *?(gcpointer(T) this);
     
    124141//
    125142// //Logical operators
     143forall(otype T) int ?!=?(gcpointer(T) this, int zero) {
     144        return this.internal.ptr != 0;
     145}
    126146// forall(otype T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs);
    127147// forall(otype T) int ?==?(gcpointer(T) this, gcpointer(T) rhs);
  • src/examples/gc_no_raii/src/gcpointers.h

    r906e24d raa8f9df  
    33#include <stdbool.h>
    44#include <stdint.h>
     5
     6forall(dtype T)
     7struct gcpointer;
    58
    69struct gcpointer_t
     
    1417void ?{}(gcpointer_t* this, gcpointer_t other);
    1518void ^?{}(gcpointer_t* this);
    16 gcpointer_t* ?=?(gcpointer_t this, gcpointer_t rhs);
     19gcpointer_t ?=?(gcpointer_t* this, gcpointer_t rhs);
    1720
    1821//Logical operators
    1922bool gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs);
    2023bool gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs);
    21 bool gcpointer_null(gcpointer_t* this);
     24bool gcpointer_null(const gcpointer_t* this);
    2225
    23 forall(otype T)
     26
     27#ifndef NDEBUG
     28        bool is_valid(const gcpointer_t* this);
     29#endif
     30
     31forall(dtype T)
    2432struct gcpointer
    2533{
     
    3038forall(otype T) void ?{}(gcpointer(T)* this);
    3139forall(otype T) void ?{}(gcpointer(T)* this, void* address);
    32 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T)* other);
     40forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other);
    3341forall(otype T) void ^?{}(gcpointer(T)* this);
    34 forall(otype T) gcpointer(T) ?=?(gcpointer(T) this, gcpointer(T) rhs);
     42forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs);
    3543
    3644
    37 forall(otype T) T *?(gcpointer(T) this);
     45// forall(otype T) T *?(gcpointer(T) this);
    3846forall(otype T) T* get(gcpointer(T)* this);
    3947
    4048//Logical operators
     49forall(otype T) int ?!=?(gcpointer(T) this, int zero);
    4150forall(otype T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs);
    4251forall(otype T) int ?==?(gcpointer(T) this, gcpointer(T) rhs);
  • src/examples/gc_no_raii/src/internal/card_table.h

    r906e24d raa8f9df  
    11#pragma once
    2 
    3 #include <stdlib>
    42
    53#include "globals.h"
     
    97{
    108        size_t card = ( ((intptr_t)address) & CARDS_OFFSET_MASK ) >> CARDS_SIZE_EXP;
     9        checkf(card < CARDS_COUNT, (const char*)"%lu %lu = (%lx & %lx) >> %lu\n", (size_t)CARDS_COUNT, (size_t)card, (size_t)address, (size_t)CARDS_OFFSET_MASK, (size_t)CARDS_SIZE_EXP);
    1110        check(card < CARDS_COUNT);
    1211        return card;
     
    1918};
    2019
    21 static inline void ctor(card_table_t* const this)
     20static inline void ctor_card(card_table_t* const this)
    2221{
    2322        this->count = 0;
    2423}
    2524
    26 static inline void dtor(card_table_t* const this)
     25static inline void dtor_card(card_table_t* const this)
    2726{
    2827
     
    4847        else
    4948        {
    50                 check(card == count);
     49                check(card == this->count);
    5150                this->count++;
    5251                this->cards_start[card] = object;
  • src/examples/gc_no_raii/src/internal/collector.c

    r906e24d raa8f9df  
    2525        gc_object_header* obj = gc_get_object_ptr((void*)target->ptr);
    2626
    27         check(gc_is_valide(obj));
     27        check(is_valid(obj));
    2828
    2929        gcpointer_t** prev_next_ptr = managed ? &obj->type_chain : &obj->root_chain;
     
    3838void* gc_allocate(size_t target_size)
    3939{
    40         sout | "Allocating " | target_size | " bytes" | endl;
     40        // sout | "Allocating " | target_size | " bytes" | endl;
    4141
    4242        size_t size = gc_compute_size(target_size + sizeof(gc_object_header));
    4343
    44         sout | "Object header size: " | sizeof(gc_object_header) | " bytes" | endl;
    45         sout | "Actual allocation size: " | size | " bytes" | endl;
     44        // sout | "Object header size: " | sizeof(gc_object_header) | " bytes" | endl;
     45        // sout | "Actual allocation size: " | size | " bytes" | endl;
    4646
    4747        check(size < POOL_SIZE_BYTES);
     
    6060        if((intptr_t)(block = gc_try_allocate(gc, size))) return gc_finish_alloc_block(block, size, target_size);
    6161
    62         checkf(false, "ERROR: allocation in new pool failed");
     62        checkf( (int) 0, "ERROR: allocation in new pool failed");
    6363
    6464        return NULL;
     
    6767void* gc_finish_alloc_block(void* block, size_t actual_size, size_t target_size)
    6868{
    69         void* data = (void*)(((intptr_t)block) + sizeof(gc_object_header));
     69        intptr_t data = ((intptr_t)block) + sizeof(gc_object_header);
    7070        void* header = block;
    7171
    72         check(((intptr_t)data) > ((intptr_t)block));
    73         check(((intptr_t)data) >= ((intptr_t)header));
    74         check(is_aligned(data));
    75         check(((intptr_t)data) + target_size <= ((intptr_t)block) + actual_size);
     72        check( data > ((intptr_t)block));
     73        check( data >= ((intptr_t)header));
     74        check( gc_is_aligned( (void*)data ) );
     75        check( data + target_size <= ((intptr_t)block) + actual_size );
    7676
    7777        gc_object_header* obj = placement_ctor(header, actual_size);
    7878
    7979        (void)obj; //remove unsused warning since this is for debug
    80         check(obj == get_object_ptr(data));
     80        check(obj == gc_get_object_ptr( (void*)data ));
    8181
    8282        gc_register_allocation(gc_get_state(), actual_size);
    8383
    84         return data;
     84        return (void*)data;
    8585}
    8686
     
    119119        check(!ptr->forward);
    120120        check(!ptr->is_forwarded);
    121         check(gc_is_from_space(gc_pool_of(ptr)));
     121        check(gc_pool_is_from_space(gc_pool_of(ptr)));
    122122
    123123        gc_memory_pool* pool = gc_pool_of(ptr)->mirror;
     
    143143                check(((intptr_t)field) < ((intptr_t)((intptr_t)object) + object->size));
    144144
    145                 check(gc_is_in_to_space(gc_get_state(), &type->ptr));
     145                check(gc_is_in_to_space(gc_get_state(), &field->ptr));
    146146
    147147                intptr_t* ref = &field->ptr;
  • src/examples/gc_no_raii/src/internal/collector.h

    r906e24d raa8f9df  
    11#pragma once
    22
    3 #include <stdlib>
     3#include <stdlib.h>
    44
    55#include "tools.h"
  • src/examples/gc_no_raii/src/internal/memory_pool.c

    r906e24d raa8f9df  
    11#include "memory_pool.h"
    22
    3 #include <stdlib>
     3extern "C" {
     4        #include <stdlib.h>
     5        #include <string.h>
     6}
    47
     8#include "collector.h"
    59#include "object_header.h"
    610
     
    1519        card_table_t* new = (card_table_t*)malloc(sizeof(card_table_t));
    1620        this->cards = new;
    17         ctor(this->cards);
     21        ctor_card(this->cards);
    1822
    1923        this->end_p = ((uint8_t*)this) + size;
    2024        this->free_p = this->start_p;
    2125
    22         check(gc_pool_of(this) == this);
     26        check( gc_pool_of( (void*)this ) == this);
    2327        check(this->cards);
    2428        gc_reset_pool(this);
     
    2731void dtor(gc_memory_pool *const this)
    2832{
    29         dtor(this->cards);
     33        dtor_card(this->cards);
    3034        free(this->cards);
    3135}
     
    3438{
    3539        this->free_p = this->start_p;
    36         #if _DEBUG
    37                 memset(this->start_p, 0xCD, gc_pool_total_size(this));
     40        #ifndef NDEBUG
     41                memset(this->start_p, 0xCD, gc_pool_size_total(this));
    3842        #endif
    3943
     
    4145        reset(this->cards);
    4246
    43         check(gc_pool_size_left(this) == gc_pool_total_size(this));
     47        check(gc_pool_size_left(this) == gc_pool_size_total(this));
    4448}
    4549
     
    5862}
    5963
    60 void ctor(
    61                 gc_pool_object_iterator* const this,
     64void ?{}(       gc_pool_object_iterator* this,
    6265                struct gc_object_header* start_object
    63                 #if _DEBUG
     66                #ifndef NDEBUG
    6467                        , intptr_t pool_start
    6568                        , intptr_t pool_end
     
    6871{
    6972        this->object = start_object;
    70         #if _DEBUG
     73        #ifndef NDEBUG
    7174                this->lower_limit = pool_start;
    7275                this->upper_limit = pool_end;
    7376        #endif
    7477
    75         check( ((intptr_t)start_object) >= lower_limit );
    76         check( ((intptr_t)start_object) <= upper_limit );
     78        check( ((intptr_t)start_object) >= this->lower_limit );
     79        check( ((intptr_t)start_object) <= this->upper_limit );
    7780}
     81
     82void ^?{}( gc_pool_object_iterator* this ) {}
    7883
    7984gc_pool_object_iterator gc_pool_iterator_for(gc_memory_pool* const this, void* member)
     
    8186        size_t card = card_of(member);
    8287        intptr_t member_add = (intptr_t)member;
    83         void* start_obj;
    84         intptr_t start_obj_add;
     88        intptr_t start_obj;
    8589
    8690        do
    8791        {
    8892                check(card < CARDS_COUNT);
    89                 start_obj = object_at(this->cards, card);
     93                start_obj = (intptr_t)object_at(this->cards, card);
    9094                check(card != 0 || start_obj);
    9195                card--;
    92                 start_obj_add = (intptr_t)start_obj;
    9396        }
    94         while(start_obj_add > member_add || start_obj_add != 0);
     97        while(start_obj > member_add || !(start_obj));
    9598
    96         check(start_obj);
    97        
     99        check( start_obj );
     100
    98101        struct gc_object_header* start_obj_typed = (struct gc_object_header*)start_obj;
    99102
    100         gc_pool_object_iterator it;
    101         ctor( &it,
    102                 start_obj_typed,
    103                 #if _DEBUG
     103        return (gc_pool_object_iterator) {
     104                start_obj_typed
     105                #ifndef NDEBUG
    104106                        , (intptr_t)this->start_p
    105107                        , (intptr_t)this->free_p
    106108                #endif
    107         );
    108         return it;
     109        };
    109110}
    110111
     
    117118{
    118119        struct gc_object_header* start_obj = (struct gc_object_header*)this->start_p;
    119         gc_pool_object_iterator it;
    120         ctor( &it,
    121                 start_obj,
    122                 #if _DEBUG
     120        return (gc_pool_object_iterator) {
     121                start_obj
     122                #ifndef NDEBUG
    123123                        , (intptr_t)this->start_p
    124124                        , (intptr_t)this->free_p
    125125                #endif
    126         );
    127         return it;
     126        };
    128127}
    129128
    130129gc_pool_object_iterator end(gc_memory_pool* const this)
    131130{
    132         gc_pool_object_iterator it;
    133         ctor( &it,
    134                 (struct gc_object_header*)this->free_p,
    135                 #if _DEBUG
     131        return (gc_pool_object_iterator) {
     132                (struct gc_object_header*)this->free_p
     133                #ifndef NDEBUG
    136134                        , (intptr_t)this->start_p
    137135                        , (intptr_t)this->free_p
    138136                #endif
    139         );
    140         return it;
     137        };
    141138}
    142139
     
    145142        struct gc_object_header* object = it->object;
    146143        intptr_t next_ptr = ((intptr_t)object) + object->size;
    147         check(next_ptr > lower_limit);
    148         check(next_ptr <= upper_limit);
     144        check(next_ptr > it->lower_limit);
     145        check(next_ptr <= it->upper_limit);
    149146
    150147        struct gc_object_header* next_obj = ((struct gc_object_header*)next_ptr);
    151         check(next_ptr == upper_limit || is_valide(next_obj));
     148        check(next_ptr == it->upper_limit || is_valid(next_obj));
    152149
    153150        it->object = next_obj;
  • src/examples/gc_no_raii/src/internal/memory_pool.h

    r906e24d raa8f9df  
    3939{
    4040        struct gc_object_header* object;
    41         #if _DEBUG
     41        #ifndef NDEBUG
    4242                intptr_t lower_limit;
    4343                intptr_t upper_limit;
     
    4646
    4747
    48 void ctor(
    49                 gc_pool_object_iterator* const this,
     48void ?{}(       gc_pool_object_iterator* this,
    5049                struct gc_object_header* start_object
    51                 #if _DEBUG
     50                #ifndef NDEBUG
    5251                        , intptr_t pool_start
    5352                        , intptr_t pool_end
    5453                #endif
    5554        );
     55
     56void ^?{}( gc_pool_object_iterator* this );
    5657
    5758bool ?!=?(const gc_pool_object_iterator lhs, const gc_pool_object_iterator rhs);
  • src/examples/gc_no_raii/src/internal/object_header.c

    r906e24d raa8f9df  
    33#include <stdint.h>
    44
     5#include "collector.h"
    56#include "globals.h"
    67#include "gcpointers.h"
     
    89void ctor(gc_object_header* const this, size_t inSize)
    910{
    10         #if _DEBUG
     11        #ifndef NDEBUG
    1112                this->canary_start = CANARY_VALUE;
    1213        #endif
     
    1819        this->is_forwarded = false;
    1920
    20         #if _DEBUG
     21        #ifndef NDEBUG
    2122                this->canary_end = CANARY_VALUE;
    2223        #endif
     
    2526void copy_ctor(gc_object_header* const this, const gc_object_header* const other)
    2627{
    27         #if _DEBUG
     28        #ifndef NDEBUG
    2829                this->canary_start = CANARY_VALUE;
    2930        #endif
     
    3536        this->is_forwarded = false;
    3637
    37         #if _DEBUG
     38        #ifndef NDEBUG
    3839                this->canary_end = CANARY_VALUE;
    3940        #endif
     
    4243        while(root)
    4344        {
    44                 check(get_object_ptr(root->ptr) == other);
     45                check(gc_get_object_ptr( (void*)root->ptr ) == other);
    4546                root->ptr = ((intptr_t)this) + sizeof(gc_object_header);
    4647
    47                 check(get_object_ptr(root->ptr) == this);
     48                check(gc_get_object_ptr( (void*)root->ptr ) == this);
    4849                root = root->next;
    4950        }
     
    5657
    5758                size_t offset = (intptr_t)type - (intptr_t)other;
    58                 check(offset < size);
     59                check(offset < this->size);
    5960
    6061                gcpointer_t* member_ptr = (gcpointer_t*)( (intptr_t)this + offset );
     
    6364
    6465                size_t next_offset = type->next ? (intptr_t)type->next - (intptr_t)other : 0;
    65                 check(next_offset < size);
     66                check(next_offset < this->size);
    6667
    6768                gcpointer_t* next_ptr = type->next ? (gcpointer_t*)((intptr_t)this + next_offset) : NULL;
     
    7374        }
    7475
    75         check(is_valide(this));
     76        check(is_valid(this));
    7677}
    7778
    78 #if _DEBUG
    79         bool is_valide(const gc_object_header* const this)
     79#ifndef NDEBUG
     80        bool is_valid(const gc_object_header* const this)
    8081        {
    81                 check(this->canary_start == CANARY_VALUE);
    82                 check(this->canary_end == CANARY_VALUE);
     82                check((intptr_t)this->canary_start == (intptr_t)CANARY_VALUE);
     83                check((intptr_t)this->canary_end == (intptr_t)CANARY_VALUE);
    8384
    84                 check(this->is_forwarded == (this->forward != nullptr));
     85                check(this->is_forwarded == ( (intptr_t)this->forward != (intptr_t)NULL));
    8586
    8687                check(this->size < POOL_SIZE_BYTES);
     
    8990                while(root)
    9091                {
    91                         check(get_object_ptr(root->ptr) == this);
     92                        checkf(gc_get_object_ptr( (void*)root->ptr ) == this, (const char*)"Expected %lX got %lX\n", gc_get_object_ptr( (void*)root->ptr ), this);
    9293
    9394                        root = root->next;
    9495                }
    9596
    96                 gcpointer_t* type = type_chain;
     97                gcpointer_t* type = this->type_chain;
    9798                while(type)
    9899                {
    99100                        check((intptr_t)type > (intptr_t)this);
    100                         check((intptr_t)type < (intptr_t)((intptr_t)this + size));
     101                        check((intptr_t)type < (intptr_t)(((intptr_t)this) + this->size));
    101102
    102103                        type = type->next;
     
    105106                return true;
    106107        }
     108        #else
     109        #error blarg
    107110#endif
  • src/examples/gc_no_raii/src/internal/object_header.h

    r906e24d raa8f9df  
    77#include "tools.h"
    88
    9 #if DEBUG
    10         static const long unsigned int CANARY_VALUE = 0xCAFEBABACAFEBABA;
     9#ifndef NDEBUG
     10        static void* const CANARY_VALUE = (void*)0xCAFEBABACAFEBABA;
    1111#endif
    1212
     
    1616struct gc_object_header
    1717{
    18         #if DEBUG
     18        #ifndef NDEBUG
    1919                void* canary_start;
    2020        #endif
     
    2626        bool                    is_forwarded;
    2727
    28         #if DEBUG
     28        #ifndef NDEBUG
    2929                void* canary_end;
    3030        #endif
     
    4747        return this;
    4848}
     49
     50#ifndef NDEBUG
     51        bool is_valid(const gc_object_header* const this);
     52#endif
  • src/examples/gc_no_raii/src/internal/state.c

    r906e24d raa8f9df  
    2121void gc_state_calc_usage(gc_state *const this);
    2222
    23 #if DEBUG
     23#ifndef NDEBUG
    2424        bool gc_state_roots_match(gc_state *const this);
    2525        bool gc_state_no_from_space_ref(gc_state *const this);
     
    7676gc_object_header* gc_get_object_for_ref(gc_state* state, void* member)
    7777{
     78        volatile int stage = 0;
    7879        intptr_t target = ((intptr_t)member);
    7980        if(!gc_is_in_heap(state, member)) return NULL;
     81        stage++;
    8082
    8183        gc_memory_pool* pool = gc_pool_of(member);
     84        stage++;
    8285        gc_pool_object_iterator it = gc_pool_iterator_for(pool, member);
     86        stage++;
    8387        gc_pool_object_iterator end = end(pool);
     88        stage++;
    8489
    8590        while(it != end)
    8691        {
    8792                gc_object_header* object = *it;
     93                check(object);
     94                check( is_valid(object) );
    8895                {
    8996                        intptr_t start = ((intptr_t)object);
     
    94101                        }
    95102                }
     103                stage++;
    96104                ++it;
    97105        }
    98106
    99         checkf(false, "is_in_heap() and iterator_for() return inconsistent data");
     107        checkf( (int) 0, "is_in_heap() and iterator_for() return inconsistent data");
    100108        abort();
    101109        return NULL;
     
    176184        this->from_code = (~this->from_code) & 0x01;
    177185
    178         #if _DEBUG
     186        #ifndef NDEBUG
    179187                {
    180188                        gc_memory_pool* pool = this->from_space;
     
    251259}
    252260
    253 #if _DEBUG
     261#ifndef NDEBUG
    254262        bool gc_state_roots_match(gc_state* const this)
    255263        {
     
    265273                                size += object->size;
    266274
    267                                 gcpointer_base* ptr = object->root_chain;
     275                                gcpointer_t* ptr = object->root_chain;
    268276                                while(ptr)
    269277                                {
    270                                         check(get_object_ptr(ptr->m_ptr) == object);
    271                                         ptr = ptr->m_next;
     278                                        check(gc_get_object_ptr( (void*)ptr->ptr ) == object);
     279                                        ptr = ptr->next;
    272280                                }
    273281                        }
    274282
    275                         check(size + gc_pool_size_used(pool) == gc_pool_size_total(pool));
     283                        checkf(size + gc_pool_size_left(pool) == gc_pool_size_total(pool),
     284                                (const char*)"expected %lu + %lu == %lu\n",
     285                                (size_t)size,
     286                                (size_t)gc_pool_size_left(pool),
     287                                (size_t)gc_pool_size_total(pool));
    276288
    277289                        pool = pool->next;
     
    286298                while(pool)
    287299                {
    288                         void** potential_ref = (void**)pool->m_start;
    289                         while(potential_ref < (void**)pool->m_free)
     300                        void** potential_ref = (void**)pool->start_p;
     301                        while(potential_ref < (void**)pool->free_p)
    290302                        {
    291303                                check(!gc_is_in_heap(this, *potential_ref));
  • src/examples/gc_no_raii/src/internal/state.h

    r906e24d raa8f9df  
    3838static inline bool gc_needs_collect(gc_state* state)
    3939{
    40         sout | "Used Space: " | state->used_space | " bytes" | endl;
     40        // sout | "Used Space: " | state->used_space | " bytes" | endl;
    4141        return state->used_space * 2 > state->total_space;
    4242}
  • src/examples/gc_no_raii/src/tools/checks.h

    r906e24d raa8f9df  
    11#pragma once
    22
    3 #if _DEBUG
     3#ifdef NDEBUG
     4
     5#define check(x)
     6
     7#define checkf(x, format, ...)
     8
     9#warning no debug checks
     10
     11#else
    412
    513#include <stdlib.h>
     
    1018                printf("CHECK failed : %s at %s:%i\n", #x, __FILE__, __LINE__);\
    1119                abort();\
    12         }}while(0)\
     20        }}while( (int)0 )\
    1321
    1422#define checkf(x, ...) do {\
     
    1725                printf(__VA_ARGS__);\
    1826                abort();\
    19         }}while(0)\
    20 
    21 #else
    22 
    23 #define check(x)
    24 
    25 #define checkf(x, format, ...)
     27        }}while( (int)0 )\
    2628
    2729#endif //NO_CHECKS
  • src/examples/gc_no_raii/src/tools/print.c

    r906e24d raa8f9df  
    11#include "tools.h"
    22
    3 #if _DEBUG
    4         ofstream *sout = ofstream_stdout();
     3#ifndef NDEBUG
     4        // ofstream *sout = ofstream_stdout();
    55#endif
  • src/examples/gc_no_raii/src/tools/print.h

    r906e24d raa8f9df  
    11#pragma once
    22
    3 #if _DEBUG
    4 
    5 #include <fstream>
    6 
    7 #define DEBUG_OUT(x) sout | x | endl;
    8 
    9 #else
     3// #ifndef NDEBUG
     4//
     5// #include <fstream>
     6//
     7// #define DEBUG_OUT(x) sout | x | endl;
     8//
     9// #else
    1010
    1111#define DEBUG_OUT(x)
    1212
    13 #endif //NO_CHECKS
     13// #endif //NO_CHECKS
  • src/examples/gc_no_raii/test/badlll.c

    r906e24d raa8f9df  
    11#include "gc.h"
     2
     3#include <stdio.h>
    24
    35struct List_t
     
    79};
    810
    9 void ?{}(List_t* this);
    10 List_t* ?=?(List_t* this, List_t* rhs);
    11 
    1211typedef gcpointer(List_t) LLL;
    1312
    14 #define MAX (1024 * 1024)
     13#define MAX (1024 * 1)
    1514
    16 // LLL buildLLL(int sz)
    17 void bla()
     15LLL buildLLL(int sz)
    1816{
    19         int i;
    20         // LLL ll0;//, lll, llc;
    21 //
    22 //      ll0 = gcmalloc();
    23 //      ll0->val = 0;
    24 //      lll = ll0;
    25 //
    26 //      for (i = 1; i < sz; i++)
    27 //      {
    28 //              llc = gcmalloc();
    29 //              llc->val = i;
    30 //              lll->next = llc;
    31 //              lll = llc;
    32 //      }
    33 //
    34         // return ll0;
     17        int i = 0;
     18        LLL ll0;
     19
     20        gcmalloc( &ll0 );
     21        List_t* ll0_ptr = get( &ll0 );
     22        ll0_ptr->val = i;
     23        LLL lll = ll0;
     24
     25        for (i = 1; i < sz; i++)
     26        {
     27                LLL llc;
     28                gcmalloc( &llc );
     29                List_t* llc_ptr = get( &llc );
     30                llc_ptr->val = i;
     31                List_t* lll_ptr = get( &lll );
     32                lll_ptr->next = llc;
     33
     34                lll = llc;
     35        }
     36
     37        check(is_valid( &ll0.internal ));
     38
     39        return ll0;
    3540}
    36 //
    37 // void testLLL(LLL lll)
    38 // {
    39 //      unsigned char *counted;
    40 //
    41 //      counted = (unsigned char *) calloc(MAX, sizeof(unsigned char));
    42 //      while (lll)
    43 //      {
    44 //              counted[lll->val]++;
    45 //              if (counted[lll->val] > 1)
    46 //              {
    47 //                      fprintf(stderr, "ERROR! Encountered %d twice!\n", lll->val);
    48 //                      exit(1);
    49 //              }
    50 //              lll = lll->next;
    51 //      }
    52 //
    53 //      return;
    54 // }
     41
     42void testLLL(LLL lll)
     43{
     44        unsigned char *counted;
     45
     46        counted = (unsigned char *) calloc(MAX, sizeof(unsigned char));
     47        while (lll)
     48        {
     49                List_t* lll_ptr = get( &lll );
     50                counted[lll_ptr->val]++;
     51                if (counted[lll_ptr->val] > 1)
     52                {
     53                        fprintf(stderr, "ERROR! Encountered %d twice!\n", lll_ptr->val);
     54                        exit(1);
     55                }
     56                lll = lll_ptr->next;
     57        }
     58
     59        return;
     60}
    5561
    5662int main(void)
     
    5864        LLL mylll;
    5965
    60         // mylll = buildLLL(MAX);
    61         //
    62         // testLLL(mylll);
     66        mylll = buildLLL(MAX);
     67
     68        testLLL(mylll);
    6369
    6470        return 0;
  • src/main.cc

    r906e24d raa8f9df  
    4242#include "Common/UnimplementedError.h"
    4343#include "../config.h"
     44#include "Tuples/Tuples.h"
    4445
    4546using namespace std;
     
    265266                OPTPRINT( "convertLvalue" )
    266267                GenPoly::convertLvalue( translationUnit );
     268                OPTPRINT( "expandTuples" ); // xxx - is this the right place for this?
     269                Tuples::expandTuples( translationUnit );
    267270
    268271                if ( bboxp ) {
  • src/tests/avltree/avl_test.c

    r906e24d raa8f9df  
    1414
    1515  // int -> int
    16   tree(int, int) * imap = create(-1, 0);
     16  tree(int, int) * imap = create(-1, (int)0);
    1717  insert(&imap, 12, 13);
    1818  insert(&imap, 2, 3);
Note: See TracChangeset for help on using the changeset viewer.