Changes in / [1eba452:fd782b2]


Ignore:
Location:
src
Files:
2 added
3 deleted
27 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r1eba452 rfd782b2  
    656656        }
    657657
     658        void CodeGenerator::visit( StmtExpr * stmtExpr ) {
     659                output << "(";
     660                stmtExpr->get_statements()->accept( *this );
     661                output << ")";
     662        }
     663
    658664        //*** Statements
    659665        void CodeGenerator::visit( CompoundStmt * compoundStmt ) {
  • src/CodeGen/CodeGenerator.h

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

    r1eba452 rfd782b2  
    388388                                return memberExpr->get_member()->get_name();
    389389                        } else if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * > ( func ) ) {
    390                                 return memberExpr->get_member();
     390                                return funcName( memberExpr->get_member() );
    391391                        } else {
    392392                                assertf( false, "Unexpected expression type being called as a function in call expression" );
     
    451451                // virtual void visit( LogicalExpr *logicalExpr );
    452452                // virtual void visit( ConditionalExpr *conditionalExpr );
    453                 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
    454                 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }
    455453                virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; }
    456454                virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; }
    457455                virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; }
    458456                virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; }
     457                virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
     458                virtual void visit( TupleAssignExpr *tupleExpr ) { isConstExpr = false; }
    459459
    460460                bool isConstExpr;
  • src/Makefile.in

    r1eba452 rfd782b2  
    189189        SynTree/driver_cfa_cpp-Attribute.$(OBJEXT) \
    190190        Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \
    191         Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT)
     191        Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)
    192192am_driver_cfa_cpp_OBJECTS = $(am__objects_1)
    193193driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS)
     
    402402        SynTree/AddStmtVisitor.cc SynTree/TypeSubstitution.cc \
    403403        SynTree/Attribute.cc Tuples/TupleAssignment.cc \
    404         Tuples/NameMatcher.cc
     404        Tuples/TupleExpansion.cc
    405405MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
    406406        ${cfa_cpplib_PROGRAMS}}
     
    769769Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT):  \
    770770        Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp)
    771 Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT): Tuples/$(am__dirstamp) \
    772         Tuples/$(DEPDIR)/$(am__dirstamp)
     771Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT): \
     772        Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp)
    773773driver/$(am__dirstamp):
    774774        @$(MKDIR_P) driver
     
    877877        -rm -f SynTree/driver_cfa_cpp-Visitor.$(OBJEXT)
    878878        -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT)
    879         -rm -f Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT)
    880879        -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT)
     880        -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)
    881881
    882882distclean-compile:
     
    982982@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-Visitor.Po@am__quote@
    983983@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@
    984 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po@am__quote@
    985984@AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@
     985@AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@
    986986
    987987.cc.o:
     
    24012401@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`
    24022402
    2403 Tuples/driver_cfa_cpp-NameMatcher.o: Tuples/NameMatcher.cc
    2404 @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
    2405 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po
    2406 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.o' libtool=no @AMDEPBACKSLASH@
    2407 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    2408 @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
    2409 
    2410 Tuples/driver_cfa_cpp-NameMatcher.obj: Tuples/NameMatcher.cc
    2411 @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`
    2412 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po
    2413 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.obj' libtool=no @AMDEPBACKSLASH@
    2414 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    2415 @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`
     2403Tuples/driver_cfa_cpp-TupleExpansion.o: Tuples/TupleExpansion.cc
     2404@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
     2405@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po
     2406@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.o' libtool=no @AMDEPBACKSLASH@
     2407@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2408@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
     2409
     2410Tuples/driver_cfa_cpp-TupleExpansion.obj: Tuples/TupleExpansion.cc
     2411@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`
     2412@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po
     2413@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.obj' libtool=no @AMDEPBACKSLASH@
     2414@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2415@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`
    24162416
    24172417.ll.cc:
  • src/Parser/ExpressionNode.cc

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    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.h

    r1eba452 rfd782b2  
    1 /* A Bison parser, made by GNU Bison 3.0.2.  */
     1/* A Bison parser, made by GNU Bison 2.5.  */
    22
    33/* Bison interface for Yacc-like parsers in C
    4 
    5    Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
    6 
     4   
     5      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
     6   
    77   This program is free software: you can redistribute it and/or modify
    88   it under the terms of the GNU General Public License as published by
    99   the Free Software Foundation, either version 3 of the License, or
    1010   (at your option) any later version.
    11 
     11   
    1212   This program is distributed in the hope that it will be useful,
    1313   but WITHOUT ANY WARRANTY; without even the implied warranty of
    1414   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1515   GNU General Public License for more details.
    16 
     16   
    1717   You should have received a copy of the GNU General Public License
    1818   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     
    2727   Bison output files to be licensed under the GNU General Public
    2828   License without this special exception.
    29 
     29   
    3030   This special exception was added by the Free Software Foundation in
    3131   version 2.2 of Bison.  */
    3232
    33 #ifndef YY_YY_PARSER_PARSER_H_INCLUDED
    34 # define YY_YY_PARSER_PARSER_H_INCLUDED
    35 /* Debug traces.  */
    36 #ifndef YYDEBUG
    37 # define YYDEBUG 1
    38 #endif
    39 #if YYDEBUG
    40 extern int yydebug;
    41 #endif
    42 
    43 /* Token type.  */
     33
     34/* Tokens.  */
    4435#ifndef YYTOKENTYPE
    4536# define YYTOKENTYPE
    46   enum yytokentype
    47   {
    48     TYPEDEF = 258,
    49     AUTO = 259,
    50     EXTERN = 260,
    51     REGISTER = 261,
    52     STATIC = 262,
    53     INLINE = 263,
    54     FORTRAN = 264,
    55     CONST = 265,
    56     VOLATILE = 266,
    57     RESTRICT = 267,
    58     FORALL = 268,
    59     LVALUE = 269,
    60     VOID = 270,
    61     CHAR = 271,
    62     SHORT = 272,
    63     INT = 273,
    64     LONG = 274,
    65     FLOAT = 275,
    66     DOUBLE = 276,
    67     SIGNED = 277,
    68     UNSIGNED = 278,
    69     VALIST = 279,
    70     BOOL = 280,
    71     COMPLEX = 281,
    72     IMAGINARY = 282,
    73     TYPEOF = 283,
    74     LABEL = 284,
    75     ENUM = 285,
    76     STRUCT = 286,
    77     UNION = 287,
    78     OTYPE = 288,
    79     FTYPE = 289,
    80     DTYPE = 290,
    81     TRAIT = 291,
    82     SIZEOF = 292,
    83     OFFSETOF = 293,
    84     ATTRIBUTE = 294,
    85     EXTENSION = 295,
    86     IF = 296,
    87     ELSE = 297,
    88     SWITCH = 298,
    89     CASE = 299,
    90     DEFAULT = 300,
    91     DO = 301,
    92     WHILE = 302,
    93     FOR = 303,
    94     BREAK = 304,
    95     CONTINUE = 305,
    96     GOTO = 306,
    97     RETURN = 307,
    98     CHOOSE = 308,
    99     DISABLE = 309,
    100     ENABLE = 310,
    101     FALLTHRU = 311,
    102     TRY = 312,
    103     CATCH = 313,
    104     CATCHRESUME = 314,
    105     FINALLY = 315,
    106     THROW = 316,
    107     THROWRESUME = 317,
    108     AT = 318,
    109     ASM = 319,
    110     ALIGNAS = 320,
    111     ALIGNOF = 321,
    112     ATOMIC = 322,
    113     GENERIC = 323,
    114     NORETURN = 324,
    115     STATICASSERT = 325,
    116     THREADLOCAL = 326,
    117     IDENTIFIER = 327,
    118     QUOTED_IDENTIFIER = 328,
    119     TYPEDEFname = 329,
    120     TYPEGENname = 330,
    121     ATTR_IDENTIFIER = 331,
    122     ATTR_TYPEDEFname = 332,
    123     ATTR_TYPEGENname = 333,
    124     INTEGERconstant = 334,
    125     FLOATINGconstant = 335,
    126     CHARACTERconstant = 336,
    127     STRINGliteral = 337,
    128     ZERO = 338,
    129     ONE = 339,
    130     ARROW = 340,
    131     ICR = 341,
    132     DECR = 342,
    133     LS = 343,
    134     RS = 344,
    135     LE = 345,
    136     GE = 346,
    137     EQ = 347,
    138     NE = 348,
    139     ANDAND = 349,
    140     OROR = 350,
    141     ELLIPSIS = 351,
    142     MULTassign = 352,
    143     DIVassign = 353,
    144     MODassign = 354,
    145     PLUSassign = 355,
    146     MINUSassign = 356,
    147     LSassign = 357,
    148     RSassign = 358,
    149     ANDassign = 359,
    150     ERassign = 360,
    151     ORassign = 361,
    152     ATassign = 362,
    153     THEN = 363
    154   };
     37   /* Put the tokens into the symbol table, so that GDB and other debuggers
     38      know about them.  */
     39   enum yytokentype {
     40     TYPEDEF = 258,
     41     AUTO = 259,
     42     EXTERN = 260,
     43     REGISTER = 261,
     44     STATIC = 262,
     45     INLINE = 263,
     46     FORTRAN = 264,
     47     CONST = 265,
     48     VOLATILE = 266,
     49     RESTRICT = 267,
     50     FORALL = 268,
     51     LVALUE = 269,
     52     VOID = 270,
     53     CHAR = 271,
     54     SHORT = 272,
     55     INT = 273,
     56     LONG = 274,
     57     FLOAT = 275,
     58     DOUBLE = 276,
     59     SIGNED = 277,
     60     UNSIGNED = 278,
     61     VALIST = 279,
     62     BOOL = 280,
     63     COMPLEX = 281,
     64     IMAGINARY = 282,
     65     TYPEOF = 283,
     66     LABEL = 284,
     67     ENUM = 285,
     68     STRUCT = 286,
     69     UNION = 287,
     70     OTYPE = 288,
     71     FTYPE = 289,
     72     DTYPE = 290,
     73     TRAIT = 291,
     74     SIZEOF = 292,
     75     OFFSETOF = 293,
     76     ATTRIBUTE = 294,
     77     EXTENSION = 295,
     78     IF = 296,
     79     ELSE = 297,
     80     SWITCH = 298,
     81     CASE = 299,
     82     DEFAULT = 300,
     83     DO = 301,
     84     WHILE = 302,
     85     FOR = 303,
     86     BREAK = 304,
     87     CONTINUE = 305,
     88     GOTO = 306,
     89     RETURN = 307,
     90     CHOOSE = 308,
     91     DISABLE = 309,
     92     ENABLE = 310,
     93     FALLTHRU = 311,
     94     TRY = 312,
     95     CATCH = 313,
     96     CATCHRESUME = 314,
     97     FINALLY = 315,
     98     THROW = 316,
     99     THROWRESUME = 317,
     100     AT = 318,
     101     ASM = 319,
     102     ALIGNAS = 320,
     103     ALIGNOF = 321,
     104     ATOMIC = 322,
     105     GENERIC = 323,
     106     NORETURN = 324,
     107     STATICASSERT = 325,
     108     THREADLOCAL = 326,
     109     IDENTIFIER = 327,
     110     QUOTED_IDENTIFIER = 328,
     111     TYPEDEFname = 329,
     112     TYPEGENname = 330,
     113     ATTR_IDENTIFIER = 331,
     114     ATTR_TYPEDEFname = 332,
     115     ATTR_TYPEGENname = 333,
     116     INTEGERconstant = 334,
     117     FLOATINGconstant = 335,
     118     CHARACTERconstant = 336,
     119     STRINGliteral = 337,
     120     ZERO = 338,
     121     ONE = 339,
     122     ARROW = 340,
     123     ICR = 341,
     124     DECR = 342,
     125     LS = 343,
     126     RS = 344,
     127     LE = 345,
     128     GE = 346,
     129     EQ = 347,
     130     NE = 348,
     131     ANDAND = 349,
     132     OROR = 350,
     133     ELLIPSIS = 351,
     134     MULTassign = 352,
     135     DIVassign = 353,
     136     MODassign = 354,
     137     PLUSassign = 355,
     138     MINUSassign = 356,
     139     LSassign = 357,
     140     RSassign = 358,
     141     ANDassign = 359,
     142     ERassign = 360,
     143     ORassign = 361,
     144     ATassign = 362,
     145     THEN = 363
     146   };
    155147#endif
    156148/* Tokens.  */
     
    262254#define THEN 363
    263255
    264 /* Value type.  */
     256
     257
     258
    265259#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
    266 typedef union YYSTYPE YYSTYPE;
    267 union YYSTYPE
     260typedef union YYSTYPE
    268261{
    269 #line 115 "parser.yy" /* yacc.c:1909  */
     262
     263/* Line 2068 of yacc.c  */
     264#line 115 "parser.yy"
    270265
    271266        Token tok;
     
    284279        bool flag;
    285280
    286 #line 287 "Parser/parser.h" /* yacc.c:1909  */
    287 };
     281
     282
     283/* Line 2068 of yacc.c  */
     284#line 285 "Parser/parser.h"
     285} YYSTYPE;
    288286# define YYSTYPE_IS_TRIVIAL 1
     287# define yystype YYSTYPE /* obsolescent; will be withdrawn */
    289288# define YYSTYPE_IS_DECLARED 1
    290289#endif
    291290
    292 
    293291extern YYSTYPE yylval;
    294292
    295 int yyparse (void);
    296 
    297 #endif /* !YY_YY_PARSER_PARSER_H_INCLUDED  */
     293
  • src/Parser/parser.yy

    r1eba452 rfd782b2  
    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 ) ); }
  • src/ResolvExpr/AlternativeFinder.cc

    r1eba452 rfd782b2  
    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
     
    142141                }
    143142
    144                 template< typename InputIterator, typename OutputIterator >
    145                 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
    146                         AltList alternatives;
    147 
    148                         // select the alternatives that have the minimum parameter cost
    149                         Cost minCost = Cost::infinity;
    150                         for ( AltList::iterator i = begin; i != end; ++i ) {
    151                                 if ( i->cost < minCost ) {
    152                                         minCost = i->cost;
    153                                         i->cost = i->cvtCost;
    154                                         alternatives.clear();
    155                                         alternatives.push_back( *i );
    156                                 } else if ( i->cost == minCost ) {
    157                                         i->cost = i->cvtCost;
    158                                         alternatives.push_back( *i );
    159                                 }
    160                         }
    161                         std::copy( alternatives.begin(), alternatives.end(), out );
    162                 }
    163 
    164143                template< typename InputIterator >
    165144                void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {
     
    172151                        for ( std::list< Type* >::iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) {
    173152                                (*i)->accept( global_renamer );
     153                        }
     154                }
     155
     156                // flatten tuple type into list of types
     157                template< typename OutputIterator >
     158                void flatten( Type * type, OutputIterator out ) {
     159                        if ( TupleType * tupleType = dynamic_cast< TupleType * >( type ) ) {
     160                                for ( Type * t : *tupleType ) {
     161                                        flatten( t, out );
     162                                }
     163                        } else {
     164                                *out++ = type;
    174165                        }
    175166                }
     
    241232
    242233        template< typename StructOrUnionType >
    243         void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ) {
     234        void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {
     235
     236                // // member must be either a tuple expression or a name expr
     237                // if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( memberExpr->get_member() ) ) {
     238                //  addAggMembers( structInst, agg->expr, agg->cost, nameExpr->get_name() );
     239                // } else {
     240                //  TupleExpr * tupleExpr = safe_dynamic_cast< TupleExpr * >( memberExpr->get_member() );
     241                //  // xxx - ...
     242                //  assert( false );
     243                // }
     244                // if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( memberExpr->get_member() ) ) {
     245
     246                // }
     247                NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member );
     248                const std::string & name = nameExpr->get_name();
    244249                std::list< Declaration* > members;
    245250                aggInst->lookup( name, members );
     
    259264
    260265        Cost computeConversionCost( Alternative &alt, const SymTab::Indexer &indexer ) {
    261                 ApplicationExpr *appExpr = dynamic_cast< ApplicationExpr* >( alt.expr );
    262                 assert( appExpr );
    263                 PointerType *pointer = dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() );
    264                 assert( pointer );
    265                 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() );
    266                 assert( function );
     266                ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( alt.expr );
     267                PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() );
     268                FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() );
    267269
    268270                Cost convCost( 0, 0, 0 );
     
    270272                std::list< DeclarationWithType* >::iterator formal = formals.begin();
    271273                std::list< Expression* >& actuals = appExpr->get_args();
     274
     275                std::list< Type * > formalTypes;
     276                std::list< Type * >::iterator formalType = formalTypes.end();
     277
    272278                for ( std::list< Expression* >::iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) {
     279
    273280                        PRINT(
    274281                                std::cerr << "actual expression:" << std::endl;
     
    279286                        std::list< DeclarationWithType* >::iterator startFormal = formal;
    280287                        Cost actualCost;
    281                         for ( std::list< Type* >::iterator actual = (*actualExpr)->get_results().begin(); actual != (*actualExpr)->get_results().end(); ++actual ) {
    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                        for ( std::list< Type* >::iterator actualType = (*actualExpr)->get_results().begin(); actualType != (*actualExpr)->get_results().end(); ++actualType ) {
     289
     290                                // tuple handling code
     291                                if ( formalType == formalTypes.end() ) {
     292                                        // the type of the formal parameter may be a tuple type. To make this easier to work with,
     293                                        // flatten the tuple type and traverse the resulting list of types, incrementing the formal
     294                                        // iterator once its types have been extracted. Once a particular formal parameter's type has
     295                                        // been exhausted load the next formal parameter's type.
     296                                        if ( formal == formals.end() ) {
     297                                                if ( function->get_isVarArgs() ) {
     298                                                        convCost += Cost( 1, 0, 0 );
     299                                                        break;
     300                                                } else {
     301                                                        return Cost::infinity;
     302                                                }
    288303                                        }
     304                                        formalTypes.clear();
     305                                        flatten( (*formal)->get_type(), back_inserter( formalTypes ) );
     306                                        formalType = formalTypes.begin();
     307                                        ++formal;
    289308                                }
     309
    290310                                PRINT(
    291311                                        std::cerr << std::endl << "converting ";
    292                                         (*actual)->print( std::cerr, 8 );
     312                                        (*actualType)->print( std::cerr, 8 );
    293313                                        std::cerr << std::endl << " to ";
    294314                                        (*formal)->get_type()->print( std::cerr, 8 );
    295315                                )
    296                                 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env );
     316                                Cost newCost = conversionCost( *actualType, *formalType, indexer, alt.env );
    297317                                PRINT(
    298318                                        std::cerr << std::endl << "cost is" << newCost << std::endl;
     
    305325                                actualCost += newCost;
    306326
    307                                 convCost += Cost( 0, polyCost( (*formal)->get_type(), alt.env, indexer ) + polyCost( *actual, alt.env, indexer ), 0 );
    308 
    309                                 formal++;
     327                                convCost += Cost( 0, polyCost( *formalType, alt.env, indexer ) + polyCost( *actualType, alt.env, indexer ), 0 );
     328
     329                                formalType++;
    310330                        }
    311331                        if ( actualCost != Cost( 0, 0, 0 ) ) {
     
    373393                resultEnv.extractOpenVars( openVars );
    374394
    375                 /*
    376                   Tuples::NameMatcher matcher( formals );
    377                   try {
    378                   matcher.match( actuals );
    379                   } catch ( Tuples::NoMatch &e ) {
    380                   std::cerr << "Alternative doesn't match: " << e.message << std::endl;
    381                   }
    382                 */
    383395                std::list< DeclarationWithType* >::iterator formal = formals.begin();
     396
     397                std::list< Type * > formalTypes;
     398                std::list< Type * >::iterator formalType = formalTypes.end();
     399
    384400                for ( AltList::const_iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) {
    385                         for ( std::list< Type* >::iterator actual = actualExpr->expr->get_results().begin(); actual != actualExpr->expr->get_results().end(); ++actual ) {
    386                                 if ( formal == formals.end() ) {
    387                                         return isVarArgs;
     401                        std::list< Type* > & actualTypes = actualExpr->expr->get_results();
     402                        for ( std::list< Type* >::iterator actualType = actualTypes.begin(); actualType != actualTypes.end(); ++actualType ) {
     403                                if ( formalType == formalTypes.end() ) {
     404                                        // the type of the formal parameter may be a tuple type. To make this easier to work with,
     405                                        // flatten the tuple type and traverse the resulting list of types, incrementing the formal
     406                                        // iterator once its types have been extracted. Once a particular formal parameter's type has
     407                                        // been exhausted load the next formal parameter's type.
     408                                        if ( formal == formals.end() ) {
     409                                                return isVarArgs;
     410                                        }
     411                                        formalTypes.clear();
     412                                        flatten( (*formal)->get_type(), back_inserter( formalTypes ) );
     413                                        formalType = formalTypes.begin();
     414                                        ++formal;
    388415                                }
    389416                                PRINT(
     
    391418                                        (*formal)->get_type()->print( std::cerr );
    392419                                        std::cerr << std::endl << "actual type is ";
    393                                         (*actual)->print( std::cerr );
     420                                        (*actualType)->print( std::cerr );
    394421                                        std::cerr << std::endl;
    395422                                )
    396                                 if ( ! unify( (*formal)->get_type(), *actual, resultEnv, resultNeed, resultHave, openVars, indexer ) ) {
     423                                if ( ! unify( *formalType, *actualType, resultEnv, resultNeed, resultHave, openVars, indexer ) ) {
    397424                                        return false;
    398425                                }
    399                                 formal++;
    400                         }
    401                 }
     426                                ++formalType;
     427                        }
     428                }
     429
     430                // xxx - a tuple type was not completely matched
     431                // partially handle the tuple with default arguments??
     432                if ( formalType != formalTypes.end() ) return false;
     433
    402434                // Handling of default values
    403435                while ( formal != formals.end() ) {
     
    587619                combos( argAlternatives.begin(), argAlternatives.end(), back_inserter( possibilities ) );
    588620
    589                 Tuples::TupleAssignSpotter tassign( this );
    590                 if ( tassign.isTupleAssignment( untypedExpr, possibilities ) ) {
    591                         // take care of possible tuple assignments, or discard expression
    592                         return;
    593                 } // else ...
     621                // take care of possible tuple assignments
     622                // if not tuple assignment, assignment is taken care of as a normal function call
     623                Tuples::handleTupleAssignment( *this, untypedExpr, possibilities );
    594624
    595625                AltList candidates;
     
    665695
    666696                        PRINT(
    667                                 ApplicationExpr *appExpr = dynamic_cast< ApplicationExpr* >( withFunc->expr );
    668                                 assert( appExpr );
    669                                 PointerType *pointer = dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() );
    670                                 assert( pointer );
    671                                 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() );
    672                                 assert( function );
     697                                ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( withFunc->expr );
     698                                PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() );
     699                                FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() );
    673700                                std::cerr << "Case +++++++++++++" << std::endl;
    674701                                std::cerr << "formals are:" << std::endl;
     
    791818                        renameTypes( alternatives.back().expr );
    792819                        if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) {
    793                                 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, "" );
     820                                NameExpr nameExpr( "" );
     821                                addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
    794822                        } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) {
    795                                 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, "" );
     823                                NameExpr nameExpr( "" );
     824                                addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
    796825                        } // if
    797826                } // for
     
    10241053                }
    10251054        }
     1055
     1056        void AlternativeFinder::visit( TupleIndexExpr *tupleExpr ) {
     1057                alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );
     1058        }
    10261059} // namespace ResolvExpr
    10271060
  • src/ResolvExpr/AlternativeFinder.h

    r1eba452 rfd782b2  
    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                /// Runs a new alternative finder on each element in [begin, end)
     71                /// and writes each alternative finder to out.
    7072                template< typename InputIterator, typename OutputIterator >
    7173                void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out );
    7274
    73           private:
    7475                /// 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 );
     76                template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
    7677                /// Adds alternatives for offsetof expressions, given the base type and name of the member
    7778                template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name );
     
    8990
    9091        Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env );
     92
     93        template< typename InputIterator, typename OutputIterator >
     94        void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
     95                AltList alternatives;
     96
     97                // select the alternatives that have the minimum parameter cost
     98                Cost minCost = Cost::infinity;
     99                for ( InputIterator i = begin; i != end; ++i ) {
     100                        if ( i->cost < minCost ) {
     101                                minCost = i->cost;
     102                                i->cost = i->cvtCost;
     103                                alternatives.clear();
     104                                alternatives.push_back( *i );
     105                        } else if ( i->cost == minCost ) {
     106                                i->cost = i->cvtCost;
     107                                alternatives.push_back( *i );
     108                        }
     109                }
     110                std::copy( alternatives.begin(), alternatives.end(), out );
     111        }
     112
     113        Cost sumCost( const AltList &in );
    91114} // namespace ResolvExpr
    92115
  • src/SymTab/Indexer.cc

    r1eba452 rfd782b2  
    452452        }
    453453
    454         void Indexer::visit( SolvedTupleExpr *tupleExpr ) {
     454        void Indexer::visit( TupleAssignExpr *tupleExpr ) {
    455455                acceptAllNewScope( tupleExpr->get_results(), *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

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    311311}
    312312
    313 UntypedMemberExpr::UntypedMemberExpr( std::string _member, Expression *_aggregate, Expression *_aname ) :
     313UntypedMemberExpr::UntypedMemberExpr( Expression * _member, Expression *_aggregate, Expression *_aname ) :
    314314                Expression( _aname ), member(_member), aggregate(_aggregate) {}
    315315
    316316UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr &other ) :
    317                 Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) {
     317                Expression( other ), member( maybeClone( other.member ) ), aggregate( maybeClone( other.aggregate ) ) {
    318318}
    319319
    320320UntypedMemberExpr::~UntypedMemberExpr() {
    321321        delete aggregate;
     322        delete member;
    322323}
    323324
    324325void UntypedMemberExpr::print( std::ostream &os, int indent ) const {
    325         os << "Untyped Member Expression, with field: " << get_member();
     326        os << "Untyped Member Expression, with field: " << std::endl;
     327        get_member()->print(os, indent+4);
     328        os << std::string( indent+2, ' ' );
    326329
    327330        Expression *agg = get_aggregate();
    328         os << ", from aggregate: ";
     331        os << "from aggregate: " << std::endl;
    329332        if (agg != 0) {
    330                 os << std::string( indent + 2, ' ' );
    331                 agg->print(os, indent + 2);
     333                os << std::string( indent + 4, ' ' );
     334                agg->print(os, indent + 4);
    332335        }
    333336        os << std::string( indent+2, ' ' );
     
    372375}
    373376
    374 
    375 UntypedExpr::UntypedExpr( Expression *_function, Expression *_aname ) : Expression( _aname ), function( _function ) {}
     377UntypedExpr::UntypedExpr( Expression *_function, const std::list<Expression *> &_args, Expression *_aname ) :
     378                Expression( _aname ), function(_function), args(_args) {}
    376379
    377380UntypedExpr::UntypedExpr( const UntypedExpr &other ) :
     
    379382        cloneAll( other.args, args );
    380383}
    381 
    382 UntypedExpr::UntypedExpr( Expression *_function, std::list<Expression *> &_args, Expression *_aname ) :
    383                 Expression( _aname ), function(_function), args(_args) {}
    384384
    385385UntypedExpr::~UntypedExpr() {
     
    565565}
    566566
     567StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) {
     568        assert( statements );
     569        std::list< Statement * > & body = statements->get_kids();
     570        if ( ! body.empty() ) {
     571                if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) {
     572                        cloneAll( exprStmt->get_expr()->get_results(), get_results() );
     573                }
     574        }
     575}
     576StmtExpr::StmtExpr( const StmtExpr &other ) : statements( other.statements->clone() ) {}
     577StmtExpr::~StmtExpr() {
     578        delete statements;
     579}
     580void StmtExpr::print( std::ostream &os, int indent ) const {
     581        os << std::string( indent, ' ' ) << "Statement Expression: " << std::endl;
     582        statements->print( os, indent+2 );
     583}
     584
    567585std::ostream & operator<<( std::ostream & out, const Expression * expr ) {
    568586        expr->print( out );
  • src/SynTree/Expression.h

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

    r1eba452 rfd782b2  
    216216        mutateAll( memberExpr->get_results(), *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         mutateAll( tupleExpr->get_results(), *this );
    311         mutateAll( tupleExpr->get_exprs(), *this );
    312         return tupleExpr;
    313 }
    314 
    315 Expression *Mutator::mutate( SolvedTupleExpr *tupleExpr ) {
    316         mutateAll( tupleExpr->get_results(), *this );
    317         mutateAll( tupleExpr->get_exprs(), *this );
    318         return tupleExpr;
    319 }
    320 
    321310Expression *Mutator::mutate( TypeExpr *typeExpr ) {
    322311        mutateAll( typeExpr->get_results(), *this );
     
    361350        rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) );
    362351        return rangeExpr;
     352}
     353
     354Expression *Mutator::mutate( TupleExpr *tupleExpr ) {
     355        mutateAll( tupleExpr->get_results(), *this );
     356        mutateAll( tupleExpr->get_exprs(), *this );
     357        return tupleExpr;
     358}
     359
     360Expression *Mutator::mutate( TupleIndexExpr *tupleExpr ) {
     361        mutateAll( tupleExpr->get_results(), *this );
     362        tupleExpr->set_tuple( maybeMutate( tupleExpr->get_tuple(), *this ) );
     363        return tupleExpr;
     364}
     365
     366Expression *Mutator::mutate( MemberTupleExpr *tupleExpr ) {
     367        mutateAll( tupleExpr->get_results(), *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        mutateAll( assignExpr->get_results(), *this );
     375        mutateAll( assignExpr->get_tempDecls(), *this );
     376        mutateAll( assignExpr->get_assigns(), *this );
     377        return assignExpr;
     378}
     379
     380Expression *Mutator::mutate( StmtExpr *stmtExpr ) {
     381        mutateAll( stmtExpr->get_results(), *this );
     382        stmtExpr->set_statements( maybeMutate( stmtExpr->get_statements(), *this ) );
     383        return stmtExpr;
    363384}
    364385
  • src/SynTree/Mutator.h

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    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 ) {
     
    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< TypeType * >( tuple->get_ )
     40        assert( tuple->get_results().size() >= index );
     41        add_result( *std::next( tuple->get_results().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 << std::string( indent, ' ' ) << "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        cloneAll( member->get_results(), get_results() ); // 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 << std::string( indent, ' ' ) << "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        for ( Expression * expr : assigns ) {
     81                cloneAll( expr->get_results(), get_results() );
     82        }
     83}
     84
     85TupleAssignExpr::TupleAssignExpr( const TupleAssignExpr &other ) : Expression( other ), tempDecls( other.tempDecls ) /* temporary */ {
     86        cloneAll( other.assigns, assigns );
     87        // xxx - clone needs to go into assigns and replace tempDecls
     88}
     89
     90TupleAssignExpr::~TupleAssignExpr() {
     91        deleteAll( assigns );
     92        // deleteAll( tempDecls );
     93}
     94
     95void TupleAssignExpr::print( std::ostream &os, int indent ) const {
     96        os << std::string( indent, ' ' ) << "Tuple Assignment Expression, with temporaries:" << std::endl;
     97        printAll( tempDecls, os, indent+4 );
     98        os << std::string( indent+2, ' ' ) << "with assignments: " << std::endl;
     99        printAll( assigns, os, indent+4 );
     100        Expression::print( os, indent );
     101}
     102
     103
    49104
    50105// Local Variables: //
  • src/SynTree/TupleType.cc

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    234234  public:
    235235        StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {}
     236        StructInstType( const Type::Qualifiers &tq, StructDecl * baseStruct );
    236237        StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {}
    237238
     
    348349class TupleType : public Type {
    349350  public:
    350         TupleType( const Type::Qualifiers &tq );
     351        TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types = std::list< Type * >() );
    351352        TupleType( const TupleType& );
    352353        virtual ~TupleType();
    353354
     355        typedef std::list<Type*> value_type;
     356        typedef value_type::iterator iterator;
     357
    354358        std::list<Type*>& get_types() { return types; }
     359
     360        iterator begin() { return types.begin(); }
     361        iterator end() { return types.end(); }
    355362
    356363        virtual TupleType *clone() const { return new TupleType( *this ); }
  • src/SynTree/Visitor.cc

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

    r1eba452 rfd782b2  
    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

    r1eba452 rfd782b2  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // TupleAssignment.cc -- 
     7// TupleAssignment.cc --
    88//
    99// Author           : Rodolfo G. Esteves
     
    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
     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_results().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                 if ( expr->get_results().size() > 1 ) {
    128                         // MVR processing
    129                         return true;
    130                 }
    131                 return false;
    132         }
    133 
    134         bool TupleAssignSpotter::isTupleAssignment( UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
     103        bool isTupleExpr( Expression *expr ) {
     104                return expr->get_results().size() > 1;
     105        }
     106
     107        void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
     108                TupleAssignSpotter spotter( currentFinder );
     109                spotter.spot( expr, possibilities );
     110        }
     111
     112        TupleAssignSpotter::TupleAssignSpotter( ResolvExpr::AlternativeFinder &f )
     113                : currentFinder(f) {}
     114
     115        void TupleAssignSpotter::spot( UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
    135116                if (  NameExpr *assgnop = dynamic_cast< NameExpr * >(expr->get_function()) ) {
    136 
    137117                        if ( assgnop->get_name() == std::string("?=?") ) {
    138 
    139118                                for ( std::list<ResolvExpr::AltList>::iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) {
    140119                                        assert( ali->size() == 2 );
    141                                         ResolvExpr::AltList::iterator opit = ali->begin();
    142                                         ResolvExpr::Alternative op1 = *opit, op2 = *(++opit);
    143 
     120                                        ResolvExpr::Alternative op1 = ali->front(), op2 = ali->back();
     121
     122                                        MultipleAssignMatcher multiMatcher( *this, op1.expr, op2.expr );
     123                                        MassAssignMatcher massMatcher( *this, op1.expr, op2.expr );
    144124                                        if ( pointsToTuple(op1.expr) ) { // also handles tuple vars
    145                                                 if ( isTuple( op2.expr, true ) )
    146                                                         matcher = new MultipleAssignMatcher(op1.expr, op2.expr);
    147                                                 else if ( isMVR( op2.expr ) ) {
    148                                                         // handle MVR differently
    149                                                 } else
     125                                                if ( isTuple( op2.expr ) ) {
     126                                                        matcher = &multiMatcher;
     127                                                } else {
    150128                                                        // mass assignment
    151                                                         matcher = new MassAssignMatcher(op1.expr, op2.expr);
    152 
    153                                                 std::list< ResolvExpr::AltList > options;
    154                                                 if ( match() )
    155                                                         /*
    156                                                           if ( hasMatched ) {
    157                                                           // throw SemanticError("Ambiguous tuple assignment");
    158                                                           } else {*/
    159                                                         // Matched for the first time
    160                                                         hasMatched = true;
    161                                                 /*} */
    162                                         } /* else if ( isTuple( op2 ) )
    163                                                  throw SemanticError("Inapplicable tuple assignment.");
    164                                           */
    165                                 }
    166 
    167                                 if ( hasMatched ) {
    168                                         if ( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
    169                                                 //options.print( std::cerr );
    170                                                 std::list< ResolvExpr::AltList >best = options.get_best();
    171                                                 if ( best.size() == 1 ) {
    172                                                         std::list<Expression *> solved_assigns;
    173                                                         for ( ResolvExpr::AltList::iterator i = best.front().begin(); i != best.front().end(); ++i ) {
    174                                                                 solved_assigns.push_back( i->expr );
    175                                                         }
    176                                                         /* assigning cost zero? */
    177                                                         currentFinder->get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns/*, SolvedTupleExpr::MULTIPLE*/), currentFinder->get_environ(), ResolvExpr::Cost() ) );
     129                                                        matcher = &massMatcher;
    178130                                                }
    179                                         } else {
    180                                                 assert( ! optMass.empty() );
    181                                                 ResolvExpr::AltList winners;
    182                                                 for ( std::vector< ResolvExpr::AltList >::iterator i = optMass.begin(); i != optMass.end(); ++i )
    183                                                         findMinCostAlt( i->begin(), i->end(), back_inserter(winners) );
    184 
    185                                                 std::list< Expression *> solved_assigns;
    186                                                 for ( ResolvExpr::AltList::iterator i = winners.begin(); i != winners.end(); ++i )
    187                                                         solved_assigns.push_back( i->expr );
    188                                                 currentFinder->get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns/*, SolvedTupleExpr::MASS*/), currentFinder->get_environ(), ResolvExpr::Cost() ) );
     131                                                match();
     132                                        } else if ( isTuple( op2.expr ) ) {
     133                                                throw SemanticError("Cannot assign a tuple value into a non-tuple lvalue.", expr);
    189134                                        }
    190135                                }
    191136                        }
    192137                }
    193                 return hasMatched;
    194         }
    195 
    196         void TupleAssignSpotter::Matcher::init( Expression *_lhs, Expression *_rhs ) {
    197                 lhs.clear();
    198                 if (AddressExpr *addr = dynamic_cast<AddressExpr *>(_lhs) )
     138        }
     139
     140        void TupleAssignSpotter::match() {
     141                assert ( matcher != 0 );
     142
     143                std::list< Expression * > new_assigns;
     144                matcher->match( new_assigns );
     145
     146                if ( new_assigns.empty() ) return;
     147                ResolvExpr::AltList current;
     148                // now resolve new assignments
     149                for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
     150                        ResolvExpr::AlternativeFinder finder( currentFinder.get_indexer(), currentFinder.get_environ() );
     151                        finder.findWithAdjustment(*i);
     152                        // prune expressions that don't coincide with
     153                        ResolvExpr::AltList alts = finder.get_alternatives();
     154                        assert( alts.size() == 1 );
     155                        assert( alts.front().expr != 0 );
     156                        current.push_back( alts.front() );
     157                }
     158
     159                // extract expressions from the assignment alternatives to produce a list of assignments that
     160                // together form a single alternative
     161                std::list< Expression *> solved_assigns;
     162                for ( ResolvExpr::Alternative & alt : current ) {
     163                        solved_assigns.push_back( alt.expr->clone() );
     164                }
     165                // xxx - need to do this??
     166                // TypeEnvironment compositeEnv;
     167                // simpleCombineEnvironments( i->begin(), i->end(), compositeEnv );
     168                currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new TupleAssignExpr(solved_assigns, matcher->tmpDecls), currentFinder.get_environ(), ResolvExpr::sumCost( current ) ) );
     169        }
     170
     171        TupleAssignSpotter::Matcher::Matcher( TupleAssignSpotter &spotter, Expression *lhs, Expression *rhs ) : spotter(spotter) {
     172                // xxx - shouldn't need to be &<tuple-expr>, just &<lvalue-tuple-type>
     173                if (AddressExpr *addr = dynamic_cast<AddressExpr *>(lhs) )
    199174                        if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(addr->get_arg()) )
    200                                 std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(lhs) );
    201 
    202                 rhs.clear();
    203         }
    204 
    205         TupleAssignSpotter::Matcher::Matcher( /*TupleAssignSpotter &spot,*/ Expression *_lhs, Expression *_rhs ) /*: own_spotter(spot) */{
    206                 init(_lhs,_rhs);
    207         }
    208 
    209         TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( Expression *_lhs, Expression *_rhs )/* : own_spotter(spot) */{
    210                 init(_lhs,_rhs);
    211 
    212                 if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(_rhs) )
    213                         std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(rhs) );
    214         }
    215 
    216         UntypedExpr *TupleAssignSpotter::Matcher::createAssgn( Expression *left, Expression *right ) {
    217                 if ( left && right ) {
    218                         std::list< Expression * > args;
    219                         args.push_back(new AddressExpr(left->clone()));  args.push_back(right->clone());
    220                         return new UntypedExpr(new NameExpr("?=?"), args);
    221                 } else
    222                         throw 0; // xxx - diagnose the problem
    223         }
    224 
    225         bool TupleAssignSpotter::MassAssignMatcher::match( std::list< Expression * > &out ) {
    226                 if ( lhs.empty() || (rhs.size() != 1) ) return false;
    227 
    228                 for ( std::list< Expression * >::iterator l = lhs.begin(); l != lhs.end(); l++ ) {
    229                         std::list< Expression * > args;
    230                         args.push_back( new AddressExpr(*l) );
    231                         args.push_back( rhs.front() );
    232                         out.push_back( new UntypedExpr(new NameExpr("?=?"), args) );
    233                 }
    234 
    235                 return true;
    236         }
    237 
    238         bool TupleAssignSpotter::MassAssignMatcher::solve( std::list< Expression * > &assigns ) {
    239                 /*
    240                   std::list< Expression * > solved_assigns;
    241                   ResolvExpr::AltList solved_alts;
    242                   assert( currentFinder != 0 );
    243 
    244                   ResolvExpr::AltList current;
    245                   if ( optMass.empty() ) {
    246                   for ( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
    247                   optMass.push_back( ResolvExpr::AltList() );
    248                   }
    249                   int cnt = 0;
    250                   for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
    251 
    252                   ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
    253                   finder.findWithAdjustment(*i);
    254                   ResolvExpr::AltList alts = finder.get_alternatives();
    255                   assert( alts.size() == 1 );
    256                   assert(alts.front().expr != 0 );
    257                   current.push_back( finder.get_alternatives().front() );
    258                   optMass[cnt].push_back( finder.get_alternatives().front() );
    259                   solved_assigns.push_back( alts.front().expr->clone() );
    260                   }
    261                 */
    262                 return true;
    263         }
    264 
    265         bool TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) {
    266                 // need more complicated matching
     175                                std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(this->lhs) );
     176        }
     177
     178        TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( TupleAssignSpotter &spotter, Expression *lhs, Expression *rhs ) : Matcher( spotter, lhs, rhs ) {
     179
     180                if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(rhs) )
     181                        std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(this->rhs) );
     182        }
     183
     184        UntypedExpr * createAssgn( ObjectDecl *left, ObjectDecl *right ) {
     185                assert( left && right );
     186                std::list< Expression * > args;
     187                args.push_back( new AddressExpr( new UntypedExpr( new NameExpr("*?"), std::list< Expression * >{ new VariableExpr( left ) } ) ) );
     188                args.push_back( new VariableExpr( right ) );
     189                return new UntypedExpr( new NameExpr( "?=?" ), args );
     190        }
     191
     192        ObjectDecl * newObject( UniqueName & namer, Expression * expr ) {
     193                Type * type;
     194                assert( expr->get_results().size() >= 1 );
     195                if ( expr->get_results().size() > 1 ) {
     196                        TupleType * tt = new TupleType( Type::Qualifiers() );
     197                        cloneAll( expr->get_results(), tt->get_types() );
     198                        type = tt;
     199                } else {
     200                        type = expr->get_results().front()->clone();
     201                }
     202                return new ObjectDecl( namer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, type, new SingleInit( expr->clone() ) );
     203        }
     204
     205        void TupleAssignSpotter::MassAssignMatcher::match( std::list< Expression * > &out ) {
     206                static UniqueName lhsNamer( "__massassign_L" );
     207                static UniqueName rhsNamer( "__massassign_R" );
     208                assert ( ! lhs.empty() && rhs.size() == 1);
     209
     210                ObjectDecl * rtmp = newObject( rhsNamer, rhs.front() );
     211                for ( Expression * l : lhs ) {
     212                        ObjectDecl * ltmp = newObject( lhsNamer, new AddressExpr( l ) );
     213                        out.push_back( createAssgn( ltmp, rtmp ) );
     214                        tmpDecls.push_back( ltmp );
     215                }
     216                tmpDecls.push_back( rtmp );
     217        }
     218
     219        void TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) {
     220                static UniqueName lhsNamer( "__multassign_L" );
     221                static UniqueName rhsNamer( "__multassign_R" );
     222                // xxx - need more complicated matching?
    267223                if ( lhs.size() == rhs.size() ) {
    268                         zipWith( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), back_inserter(out), TupleAssignSpotter::Matcher::createAssgn );
    269                         return true;
    270                 } //else
    271                 //std::cerr << "The length of (left, right) is: (" << lhs.size() << "," << rhs.size() << ")" << std::endl;*/
    272                 return false;
    273         }
    274 
    275         bool TupleAssignSpotter::MultipleAssignMatcher::solve( std::list< Expression * > &assigns ) {
    276                 /*
    277                   std::list< Expression * > solved_assigns;
    278                   ResolvExpr::AltList solved_alts;
    279                   assert( currentFinder != 0 );
    280 
    281                   ResolvExpr::AltList current;
    282                   for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
    283                   //try {
    284                   ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
    285                   finder.findWithAdjustment(*i);
    286                   // prune expressions that don't coincide with
    287                   ResolvExpr::AltList alts = finder.get_alternatives();
    288                   assert( alts.size() == 1 );
    289                   assert(alts.front().expr != 0 );
    290                   current.push_back( finder.get_alternatives().front() );
    291                   solved_assigns.push_back( alts.front().expr->clone() );
    292                   //solved_assigns.back()->print(std::cerr);
    293                   //} catch( ... ) {
    294                   //continue; // no reasonable alternative found
    295                   //}
    296                   }
    297                   options.add_option( current );
    298                 */
    299 
    300                 return true;
    301         }
    302 
    303         void TupleAssignSpotter::Options::add_option( ResolvExpr::AltList &opt ) {
    304                 using namespace std;
    305 
    306                 options.push_back( opt );
    307                 /*
    308                   vector< Cost > costs;
    309                   costs.reserve( opt.size() );
    310                   transform( opt.begin(), opt.end(), back_inserter(costs), ptr_fun(extract_cost) );
    311                 */
    312                 // transpose matrix
    313                 if ( costMatrix.empty() )
    314                         for ( unsigned int i = 0; i< opt.size(); ++i)
    315                                 costMatrix.push_back( vector<ResolvExpr::Cost>() );
    316 
    317                 int cnt = 0;
    318                 for ( ResolvExpr::AltList::iterator i = opt.begin(); i != opt.end(); ++i, cnt++ )
    319                         costMatrix[cnt].push_back( i->cost );
    320 
    321                 return;
    322         }
    323 
    324         std::list< ResolvExpr::AltList > TupleAssignSpotter::Options::get_best() {
    325                 using namespace std;
    326                 using namespace ResolvExpr;
    327                 list< ResolvExpr::AltList > ret;
    328                 list< multiset<int> > solns;
    329                 for ( vector< vector<Cost> >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
    330                         list<int> current;
    331                         findMinCost( i->begin(), i->end(), back_inserter(current) );
    332                         solns.push_back( multiset<int>(current.begin(), current.end()) );
    333                 }
    334                 // need to combine
    335                 multiset<int> result;
    336                 lift_intersection( solns.begin(), solns.end(), inserter( result, result.begin() ) );
    337                 if ( result.size() != 1 )
    338                         throw SemanticError("Ambiguous tuple expression");
    339                 ret.push_back(get_option( *(result.begin() )));
    340                 return ret;
     224                        std::list< ObjectDecl * > ltmp;
     225                        std::list< ObjectDecl * > rtmp;
     226                        std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), []( Expression * expr ){
     227                                return newObject( lhsNamer, new AddressExpr( expr ) );
     228                        });
     229                        std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), []( Expression * expr ){
     230                                return newObject( rhsNamer, expr );
     231                        });
     232                        zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), createAssgn );
     233                        tmpDecls.splice( tmpDecls.end(), ltmp );
     234                        tmpDecls.splice( tmpDecls.end(), rtmp );
     235                }
    341236        }
    342237
    343238        void TupleAssignSpotter::Options::print( std::ostream &ostr ) {
    344                 using namespace std;
    345 
    346                 for ( vector< vector < ResolvExpr::Cost > >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
    347                         for ( vector < ResolvExpr::Cost >::iterator j = i->begin(); j != i->end(); ++j )
    348                                 ostr << *j << " " ;
     239                for ( ResolvExpr::AltList & l : options ) {
     240                        for ( ResolvExpr::Alternative & alt : l ) {
     241                                alt.print( ostr );
     242                                ostr << " ";
     243                        }
    349244                        ostr << std::endl;
    350245                } // for
    351                 return;
    352         }
    353 
    354         ResolvExpr::Cost extract_cost( ResolvExpr::Alternative &alt ) {
    355                 return alt.cost;
    356         }
    357 
    358         template< typename InputIterator, typename OutputIterator >
    359         void TupleAssignSpotter::Options::findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
    360                 using namespace ResolvExpr;
    361                 std::list<int> alternatives;
    362 
    363                 // select the alternatives that have the minimum parameter cost
    364                 Cost minCost = Cost::infinity;
    365                 unsigned int index = 0;
    366                 for ( InputIterator i = begin; i != end; ++i, index++ ) {
    367                         if ( *i < minCost ) {
    368                                 minCost = *i;
    369                                 alternatives.clear();
    370                                 alternatives.push_back( index );
    371                         } else if ( *i == minCost ) {
    372                                 alternatives.push_back( index );
    373                         }
    374                 }
    375                 std::copy( alternatives.begin(), alternatives.end(), out );
    376         }
    377 
    378         template< class InputIterator, class OutputIterator >
    379         void TupleAssignSpotter::Options::lift_intersection( InputIterator begin, InputIterator end, OutputIterator out ) {
    380                 if ( begin == end ) return;
    381                 InputIterator test = begin;
    382 
    383                 if (++test == end)
    384                         { copy(begin->begin(), begin->end(), out); return; }
    385 
    386 
    387                 std::multiset<int> cur; // InputIterator::value_type::value_type
    388                 copy( begin->begin(), begin->end(), inserter( cur, cur.begin() ) );
    389 
    390                 while ( test != end ) {
    391                         std::multiset<int> temp;
    392                         set_intersection( cur.begin(), cur.end(), test->begin(), test->end(), inserter(temp,temp.begin()) );
    393                         cur.clear();
    394                         copy( temp.begin(), temp.end(), inserter(cur,cur.begin()));
    395                         ++test;
    396                 }
    397 
    398                 copy( cur.begin(), cur.end(), out );
    399                 return;
    400         }
    401 
    402         ResolvExpr::AltList TupleAssignSpotter::Options::get_option( std::list< ResolvExpr::AltList >::size_type index ) {
    403                 if ( index >= options.size() )
    404                         throw 0; // XXX
    405                 std::list< ResolvExpr::AltList >::iterator it = options.begin();
    406                 for ( std::list< ResolvExpr::AltList >::size_type i = 0; i < index; ++i, ++it );
    407                 return *it;
    408246        }
    409247} // namespace Tuples
  • src/Tuples/module.mk

    r1eba452 rfd782b2  
    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/main.cc

    r1eba452 rfd782b2  
    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 ) {
Note: See TracChangeset for help on using the changeset viewer.