Changes in / [d58a39a0:7756647]
- Location:
- src
- Files:
-
- 2 added
- 5 deleted
- 58 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rd58a39a0 r7756647 309 309 UntypedExpr * newExpr = new UntypedExpr( new NameExpr( "*?" ) ); 310 310 newExpr->get_args().push_back( *arg ); 311 assert( (*arg)->get_results().size() == 1 ); 312 Type * type = InitTweak::getPointerBase( (*arg)->get_results().front() ); 311 Type * type = InitTweak::getPointerBase( (*arg)->get_result() ); 313 312 assert( type ); 314 newExpr-> get_results().push_back( type->clone() );313 newExpr->set_result( type->clone() ); 315 314 *arg = newExpr; 316 315 } // if … … 527 526 extension( castExpr ); 528 527 output << "("; 529 if ( castExpr->get_result s().empty() ) {528 if ( castExpr->get_result()->isVoid() ) { 530 529 output << "(void)" ; 531 } else if ( ! castExpr->get_result s().front()->get_isLvalue() ) {530 } else if ( ! castExpr->get_result()->get_isLvalue() ) { 532 531 // at least one result type of cast, but not an lvalue 533 532 output << "("; 534 output << genType( castExpr->get_result s().front(), "" );533 output << genType( castExpr->get_result(), "" ); 535 534 output << ")"; 536 535 } else { … … 640 639 } 641 640 642 void CodeGenerator::visit( TupleExpr * tupleExpr ) { }641 void CodeGenerator::visit( TupleExpr * tupleExpr ) { assert( false ); } 643 642 644 643 void CodeGenerator::visit( TypeExpr * typeExpr ) {} … … 654 653 asmExpr->get_operand()->accept( *this ); 655 654 output << " )"; 655 } 656 657 void CodeGenerator::visit( CompoundLiteralExpr *compLitExpr ) { 658 assert( compLitExpr->get_type() && dynamic_cast< ListInit * > ( compLitExpr->get_initializer() ) ); 659 output << "(" << genType( compLitExpr->get_type(), "" ) << ")"; 660 compLitExpr->get_initializer()->accept( *this ); 661 } 662 663 void CodeGenerator::visit( StmtExpr * stmtExpr ) { 664 std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids(); 665 output << "({" << std::endl; 666 cur_indent += CodeGenerator::tabsize; 667 unsigned int numStmts = stmts.size(); 668 unsigned int i = 0; 669 for ( Statement * stmt : stmts ) { 670 output << indent << printLabels( stmt->get_labels() ); 671 if ( i+1 == numStmts ) { 672 // last statement in a statement expression needs to be handled specially - 673 // cannot cast to void, otherwise the expression statement has no value 674 if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( stmt ) ) { 675 exprStmt->get_expr()->accept( *this ); 676 output << ";" << endl; 677 ++i; 678 break; 679 } 680 } 681 stmt->accept( *this ); 682 output << endl; 683 if ( wantSpacing( stmt ) ) { 684 output << endl; 685 } // if 686 ++i; 687 } 688 cur_indent -= CodeGenerator::tabsize; 689 output << indent << "})"; 656 690 } 657 691 -
src/CodeGen/CodeGenerator.h
rd58a39a0 r7756647 70 70 virtual void visit( ConditionalExpr *conditionalExpr ); 71 71 virtual void visit( CommaExpr *commaExpr ); 72 virtual void visit( CompoundLiteralExpr *compLitExpr ); 72 73 virtual void visit( TupleExpr *tupleExpr ); 73 74 virtual void visit( TypeExpr *typeExpr ); 74 75 virtual void visit( AsmExpr * ); 76 virtual void visit( StmtExpr * ); 75 77 76 78 //*** Statements -
src/CodeGen/GenType.cc
rd58a39a0 r7756647 227 227 typeString = "_Atomic " + typeString; 228 228 } // if 229 if ( type->get_isAttribute() ) {230 typeString = "__attribute(( )) " + typeString;231 } // if232 229 } 233 230 } // namespace CodeGen -
src/Common/utility.h
rd58a39a0 r7756647 148 148 } 149 149 150 // replace element of list with all elements of another list 150 151 template< typename T > 151 152 void replace( std::list< T > &org, typename std::list< T >::iterator pos, std::list< T > &with ) { … … 158 159 159 160 return; 161 } 162 163 // replace range of a list with a single element 164 template< typename T > 165 void replace( std::list< T > &org, typename std::list< T >::iterator begin, typename std::list< T >::iterator end, const T & with ) { 166 org.insert( begin, with ); 167 org.erase( begin, end ); 160 168 } 161 169 -
src/ControlStruct/Mutate.cc
rd58a39a0 r7756647 23 23 #include "MLEMutator.h" 24 24 #include "ForExprMutator.h" 25 #include "LabelTypeChecker.h"26 25 //#include "ExceptMutator.h" 27 26 … … 41 40 42 41 //ExceptMutator exc; 43 // LabelTypeChecker lbl;44 42 45 43 mutateAll( translationUnit, formut ); 46 44 acceptAll( translationUnit, lfix ); 47 45 //mutateAll( translationUnit, exc ); 48 //acceptAll( translationUnit, lbl );49 46 } 50 47 } // namespace CodeGen -
src/ControlStruct/module.mk
rd58a39a0 r7756647 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## module.mk -- 8 ## module.mk -- 9 9 ## 10 10 ## Author : Richard C. Bilson … … 19 19 ControlStruct/MLEMutator.cc \ 20 20 ControlStruct/Mutate.cc \ 21 ControlStruct/ForExprMutator.cc \ 22 ControlStruct/LabelTypeChecker.cc 21 ControlStruct/ForExprMutator.cc 23 22 -
src/GenPoly/Box.cc
rd58a39a0 r7756647 110 110 void addInferredParams( ApplicationExpr *appExpr, FunctionType *functionType, std::list< Expression *>::iterator &arg, const TyVarMap &tyVars ); 111 111 /// Stores assignment operators from assertion list in local map of assignment operations 112 void findTypeOps( const std::list< TypeDecl *>&forall );112 void findTypeOps( const Type::ForallList &forall ); 113 113 void passAdapters( ApplicationExpr *appExpr, FunctionType *functionType, const TyVarMap &exprTyVars ); 114 114 FunctionDecl *makeAdapter( FunctionType *adaptee, FunctionType *realType, const std::string &mangleName, const TyVarMap &tyVars ); … … 612 612 } 613 613 614 void Pass1::findTypeOps( const std::list< TypeDecl *>&forall ) {614 void Pass1::findTypeOps( const Type::ForallList &forall ) { 615 615 // what if a nested function uses an assignment operator? 616 616 // assignOps.clear(); 617 for ( std::list< TypeDecl *>::const_iterator i = forall.begin(); i != forall.end(); ++i ) {617 for ( Type::ForallList::const_iterator i = forall.begin(); i != forall.end(); ++i ) { 618 618 for ( std::list< DeclarationWithType *>::const_iterator assert = (*i)->get_assertions().begin(); assert != (*i)->get_assertions().end(); ++assert ) { 619 619 std::string typeName; … … 680 680 std::list< DeclarationWithType *> ¶mList = functionType->get_parameters(); 681 681 std::list< FunctionType *> functions; 682 for ( std::list< TypeDecl *>::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {682 for ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) { 683 683 for ( std::list< DeclarationWithType *>::iterator assert = (*tyVar)->get_assertions().begin(); assert != (*tyVar)->get_assertions().end(); ++assert ) { 684 684 findFunction( (*assert)->get_type(), functions, scopeTyVars, needsAdapter ); … … 782 782 783 783 // add size/align for generic types to parameter list 784 if ( appExpr->get_function()->get_results().empty() ) return;785 FunctionType *funcType = getFunctionType( appExpr->get_function()->get_result s().front() );784 if ( ! appExpr->get_function()->has_result() ) return; 785 FunctionType *funcType = getFunctionType( appExpr->get_function()->get_result() ); 786 786 assert( funcType ); 787 787 … … 799 799 for ( ; fnParm != funcType->get_parameters().end() && fnArg != appExpr->get_args().end(); ++fnParm, ++fnArg ) { 800 800 VariableExpr *fnArgBase = getBaseVar( *fnArg ); 801 if ( ! fnArgBase || fnArgBase->get_results().empty() ) continue;802 passArgTypeVars( appExpr, (*fnParm)->get_type(), fnArgBase->get_result s().front(), arg, exprTyVars, seenTypes );801 if ( ! fnArgBase ) continue; // xxx - previously had check for non-empty fnArgBase results 802 passArgTypeVars( appExpr, (*fnParm)->get_type(), fnArgBase->get_result(), arg, exprTyVars, seenTypes ); 803 803 } 804 804 } … … 890 890 Type * adapteeType = new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ); 891 891 appExpr->get_args().push_front( new CastExpr( appExpr->get_function(), adapteeType ) ); 892 appExpr->set_function( new NameExpr( adapterName ) ); 892 appExpr->set_function( new NameExpr( adapterName ) ); // xxx - result is never set on NameExpr 893 893 894 894 return ret; … … 896 896 897 897 void Pass1::boxParam( Type *param, Expression *&arg, const TyVarMap &exprTyVars ) { 898 assert( ! arg->get_results().empty() );898 assert( arg->has_result() ); 899 899 if ( isPolyType( param, exprTyVars ) ) { 900 if ( isPolyType( arg->get_result s().front() ) ) {900 if ( isPolyType( arg->get_result() ) ) { 901 901 // if the argument's type is polymorphic, we don't need to box again! 902 902 return; 903 } else if ( arg->get_result s().front()->get_isLvalue() ) {903 } else if ( arg->get_result()->get_isLvalue() ) { 904 904 // VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue) 905 905 // xxx - need to test that this code is still reachable … … 946 946 void Pass1::addInferredParams( ApplicationExpr *appExpr, FunctionType *functionType, std::list< Expression *>::iterator &arg, const TyVarMap &tyVars ) { 947 947 std::list< Expression *>::iterator cur = arg; 948 for ( std::list< TypeDecl *>::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {948 for ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) { 949 949 for ( std::list< DeclarationWithType *>::iterator assert = (*tyVar)->get_assertions().begin(); assert != (*tyVar)->get_assertions().end(); ++assert ) { 950 950 InferredParams::const_iterator inferParam = appExpr->get_inferParams().find( (*assert)->get_uniqueId() ); … … 987 987 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 988 988 deref->get_args().push_back( new CastExpr( new VariableExpr( param ), new PointerType( Type::Qualifiers(), arg->get_type()->clone() ) ) ); 989 deref-> get_results().push_back( arg->get_type()->clone() );989 deref->set_result( arg->get_type()->clone() ); 990 990 return deref; 991 991 } // if … … 1013 1013 Statement *bodyStmt; 1014 1014 1015 std::list< TypeDecl *>::iterator tyArg = realType->get_forall().begin();1016 std::list< TypeDecl *>::iterator tyParam = adapterType->get_forall().begin();1017 std::list< TypeDecl *>::iterator realTyParam = adaptee->get_forall().begin();1015 Type::ForallList::iterator tyArg = realType->get_forall().begin(); 1016 Type::ForallList::iterator tyParam = adapterType->get_forall().begin(); 1017 Type::ForallList::iterator realTyParam = adaptee->get_forall().begin(); 1018 1018 for ( ; tyParam != adapterType->get_forall().end(); ++tyArg, ++tyParam, ++realTyParam ) { 1019 1019 assert( tyArg != realType->get_forall().end() ); … … 1064 1064 std::list< DeclarationWithType *> ¶mList = functionType->get_parameters(); 1065 1065 std::list< FunctionType *> functions; 1066 for ( std::list< TypeDecl *>::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {1066 for ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) { 1067 1067 for ( std::list< DeclarationWithType *>::iterator assert = (*tyVar)->get_assertions().begin(); assert != (*tyVar)->get_assertions().end(); ++assert ) { 1068 1068 findFunction( (*assert)->get_type(), functions, exprTyVars, needsAdapter ); … … 1124 1124 } // if 1125 1125 addAssign->get_args().push_back( new NameExpr( sizeofName( mangleType( polyType ) ) ) ); 1126 addAssign-> get_results().front() = appExpr->get_results().front()->clone();1126 addAssign->set_result( appExpr->get_result()->clone() ); 1127 1127 if ( appExpr->get_env() ) { 1128 1128 addAssign->set_env( appExpr->get_env() ); … … 1138 1138 if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic ) { 1139 1139 if ( varExpr->get_var()->get_name() == "?[?]" ) { 1140 assert( ! appExpr->get_results().empty() );1140 assert( appExpr->has_result() ); 1141 1141 assert( appExpr->get_args().size() == 2 ); 1142 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result s().front(), scopeTyVars, env );1143 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result s().front(), scopeTyVars, env );1142 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result(), scopeTyVars, env ); 1143 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result(), scopeTyVars, env ); 1144 1144 assert( ! baseType1 || ! baseType2 ); // the arguments cannot both be polymorphic pointers 1145 1145 UntypedExpr *ret = 0; … … 1161 1161 } // if 1162 1162 if ( baseType1 || baseType2 ) { 1163 ret-> get_results().push_front( appExpr->get_results().front()->clone() );1163 ret->set_result( appExpr->get_result()->clone() ); 1164 1164 if ( appExpr->get_env() ) { 1165 1165 ret->set_env( appExpr->get_env() ); … … 1171 1171 } // if 1172 1172 } else if ( varExpr->get_var()->get_name() == "*?" ) { 1173 assert( ! appExpr->get_results().empty() );1173 assert( appExpr->has_result() ); 1174 1174 assert( ! appExpr->get_args().empty() ); 1175 if ( isPolyType( appExpr->get_result s().front(), scopeTyVars, env ) ) {1175 if ( isPolyType( appExpr->get_result(), scopeTyVars, env ) ) { 1176 1176 Expression *ret = appExpr->get_args().front(); 1177 delete ret->get_result s().front();1178 ret-> get_results().front() = appExpr->get_results().front()->clone();1177 delete ret->get_result(); 1178 ret->set_result( appExpr->get_result()->clone() ); 1179 1179 if ( appExpr->get_env() ) { 1180 1180 ret->set_env( appExpr->get_env() ); … … 1186 1186 } // if 1187 1187 } else if ( varExpr->get_var()->get_name() == "?++" || varExpr->get_var()->get_name() == "?--" ) { 1188 assert( ! appExpr->get_results().empty() );1188 assert( appExpr->has_result() ); 1189 1189 assert( appExpr->get_args().size() == 1 ); 1190 if ( Type *baseType = isPolyPtr( appExpr->get_result s().front(), scopeTyVars, env ) ) {1191 Type *tempType = appExpr->get_result s().front()->clone();1190 if ( Type *baseType = isPolyPtr( appExpr->get_result(), scopeTyVars, env ) ) { 1191 Type *tempType = appExpr->get_result()->clone(); 1192 1192 if ( env ) { 1193 1193 env->apply( tempType ); … … 1206 1206 } // if 1207 1207 } else if ( varExpr->get_var()->get_name() == "++?" || varExpr->get_var()->get_name() == "--?" ) { 1208 assert( ! appExpr->get_results().empty() );1208 assert( appExpr->has_result() ); 1209 1209 assert( appExpr->get_args().size() == 1 ); 1210 if ( Type *baseType = isPolyPtr( appExpr->get_result s().front(), scopeTyVars, env ) ) {1210 if ( Type *baseType = isPolyPtr( appExpr->get_result(), scopeTyVars, env ) ) { 1211 1211 return makeIncrDecrExpr( appExpr, baseType, varExpr->get_var()->get_name() == "++?" ); 1212 1212 } // if 1213 1213 } else if ( varExpr->get_var()->get_name() == "?+?" || varExpr->get_var()->get_name() == "?-?" ) { 1214 assert( ! appExpr->get_results().empty() );1214 assert( appExpr->has_result() ); 1215 1215 assert( appExpr->get_args().size() == 2 ); 1216 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result s().front(), scopeTyVars, env );1217 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result s().front(), scopeTyVars, env );1216 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result(), scopeTyVars, env ); 1217 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result(), scopeTyVars, env ); 1218 1218 if ( baseType1 && baseType2 ) { 1219 1219 UntypedExpr *divide = new UntypedExpr( new NameExpr( "?/?" ) ); 1220 1220 divide->get_args().push_back( appExpr ); 1221 1221 divide->get_args().push_back( new SizeofExpr( baseType1->clone() ) ); 1222 divide-> get_results().push_front( appExpr->get_results().front()->clone() );1222 divide->set_result( appExpr->get_result()->clone() ); 1223 1223 if ( appExpr->get_env() ) { 1224 1224 divide->set_env( appExpr->get_env() ); … … 1238 1238 } // if 1239 1239 } else if ( varExpr->get_var()->get_name() == "?+=?" || varExpr->get_var()->get_name() == "?-=?" ) { 1240 assert( ! appExpr->get_results().empty() );1240 assert( appExpr->has_result() ); 1241 1241 assert( appExpr->get_args().size() == 2 ); 1242 Type *baseType = isPolyPtr( appExpr->get_result s().front(), scopeTyVars, env );1242 Type *baseType = isPolyPtr( appExpr->get_result(), scopeTyVars, env ); 1243 1243 if ( baseType ) { 1244 1244 UntypedExpr *multiply = new UntypedExpr( new NameExpr( "?*?" ) ); … … 1266 1266 useRetval = oldUseRetval; 1267 1267 1268 assert( ! appExpr->get_function()->get_results().empty() ); 1269 PointerType *pointer = dynamic_cast< PointerType *>( appExpr->get_function()->get_results().front() ); 1270 assert( pointer ); 1271 FunctionType *function = dynamic_cast< FunctionType *>( pointer->get_base() ); 1272 assert( function ); 1268 assert( appExpr->get_function()->has_result() ); 1269 PointerType *pointer = safe_dynamic_cast< PointerType *>( appExpr->get_function()->get_result() ); 1270 FunctionType *function = safe_dynamic_cast< FunctionType *>( pointer->get_base() ); 1273 1271 1274 1272 if ( Expression *newExpr = handleIntrinsics( appExpr ) ) { … … 1308 1306 1309 1307 Expression *Pass1::mutate( UntypedExpr *expr ) { 1310 if ( ! expr->get_results().empty() && isPolyType( expr->get_results().front(), scopeTyVars, env ) ) {1308 if ( expr->has_result() && isPolyType( expr->get_result(), scopeTyVars, env ) ) { 1311 1309 if ( NameExpr *name = dynamic_cast< NameExpr *>( expr->get_function() ) ) { 1312 1310 if ( name->get_name() == "*?" ) { … … 1322 1320 1323 1321 Expression *Pass1::mutate( AddressExpr *addrExpr ) { 1324 assert( ! addrExpr->get_arg()->get_results().empty() );1322 assert( addrExpr->get_arg()->has_result() && ! addrExpr->get_arg()->get_result()->isVoid() ); 1325 1323 1326 1324 bool needs = false; 1327 1325 if ( UntypedExpr *expr = dynamic_cast< UntypedExpr *>( addrExpr->get_arg() ) ) { 1328 if ( ! expr->get_results().empty() && isPolyType( expr->get_results().front(), scopeTyVars, env ) ) {1326 if ( expr->has_result() && isPolyType( expr->get_result(), scopeTyVars, env ) ) { 1329 1327 if ( NameExpr *name = dynamic_cast< NameExpr *>( expr->get_function() ) ) { 1330 1328 if ( name->get_name() == "*?" ) { 1331 1329 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr->get_args().front() ) ) { 1332 assert( ! appExpr->get_function()->get_results().empty() ); 1333 PointerType *pointer = dynamic_cast< PointerType *>( appExpr->get_function()->get_results().front() ); 1334 assert( pointer ); 1335 FunctionType *function = dynamic_cast< FunctionType *>( pointer->get_base() ); 1336 assert( function ); 1330 assert( appExpr->get_function()->has_result() ); 1331 PointerType *pointer = safe_dynamic_cast< PointerType *>( appExpr->get_function()->get_result() ); 1332 FunctionType *function = safe_dynamic_cast< FunctionType *>( pointer->get_base() ); 1337 1333 needs = needsAdapter( function, scopeTyVars ); 1338 1334 } // if … … 1343 1339 // isPolyType check needs to happen before mutating addrExpr arg, so pull it forward 1344 1340 // out of the if condition. 1345 bool polytype = isPolyType( addrExpr->get_arg()->get_result s().front(), scopeTyVars, env );1341 bool polytype = isPolyType( addrExpr->get_arg()->get_result(), scopeTyVars, env ); 1346 1342 addrExpr->set_arg( mutateExpression( addrExpr->get_arg() ) ); 1347 1343 if ( polytype || needs ) { 1348 1344 Expression *ret = addrExpr->get_arg(); 1349 delete ret->get_result s().front();1350 ret-> get_results().front() = addrExpr->get_results().front()->clone();1345 delete ret->get_result(); 1346 ret->set_result( addrExpr->get_result()->clone() ); 1351 1347 addrExpr->set_arg( 0 ); 1352 1348 delete addrExpr; … … 1386 1382 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 1387 1383 if ( retval && returnStmt->get_expr() ) { 1388 assert( ! returnStmt->get_expr()->get_results().empty() );1384 assert( returnStmt->get_expr()->has_result() && ! returnStmt->get_expr()->get_result()->isVoid() ); 1389 1385 // ***** Code Removal ***** After introducing a temporary variable for all return expressions, the following code appears superfluous. 1390 1386 // if ( returnStmt->get_expr()->get_results().front()->get_isLvalue() ) { … … 1420 1416 // find each of its needed secondary assignment operators 1421 1417 std::list< Expression* > &tyParams = refType->get_parameters(); 1422 std::list< TypeDecl* >&forallParams = functionDecl->get_type()->get_forall();1418 Type::ForallList &forallParams = functionDecl->get_type()->get_forall(); 1423 1419 std::list< Expression* >::const_iterator tyIt = tyParams.begin(); 1424 std::list< TypeDecl* >::const_iterator forallIt = forallParams.begin();1420 Type::ForallList::const_iterator forallIt = forallParams.begin(); 1425 1421 for ( ; tyIt != tyParams.end() && forallIt != forallParams.end(); ++tyIt, ++forallIt ) { 1426 1422 // Add appropriate mapping to assignment expression environment … … 1466 1462 // replace return statement with appropriate assignment to out parameter 1467 1463 Expression *retParm = new NameExpr( retval->get_name() ); 1468 retParm-> get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) );1464 retParm->set_result( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) ); 1469 1465 assignExpr->get_args().push_back( retParm ); 1470 1466 assignExpr->get_args().push_back( returnStmt->get_expr() ); … … 1596 1592 ObjectDecl newPtr( "", DeclarationNode::NoStorageClass, LinkageSpec::C, 0, 1597 1593 new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ), 0 ); 1598 for ( std::list< TypeDecl *>::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) {1594 for ( Type::ForallList::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) { 1599 1595 ObjectDecl *sizeParm, *alignParm; 1600 1596 // add all size and alignment parameters to parameter list -
src/GenPoly/CopyParams.cc
rd58a39a0 r7756647 54 54 std::map< std::string, DeclarationWithType* > assignOps; 55 55 // assume the assignment operator is the first assert param after any "type" parameter 56 for ( std::list< TypeDecl* >::const_iterator tyVar = funcDecl->get_functionType()->get_forall().begin(); tyVar != funcDecl->get_functionType()->get_forall().end(); ++tyVar ) {56 for ( Type::ForallList::const_iterator tyVar = funcDecl->get_functionType()->get_forall().begin(); tyVar != funcDecl->get_functionType()->get_forall().end(); ++tyVar ) { 57 57 if ( (*tyVar)->get_kind() == TypeDecl::Any ) { 58 58 assert( !(*tyVar)->get_assertions().empty() ); -
src/GenPoly/FindFunction.cc
rd58a39a0 r7756647 29 29 virtual Type *mutate( PointerType *pointerType ); 30 30 private: 31 void handleForall( const std::list< TypeDecl* >&forall );31 void handleForall( const Type::ForallList &forall ); 32 32 33 33 std::list< FunctionType* > &functions; … … 51 51 } 52 52 53 void FindFunction::handleForall( const std::list< TypeDecl* >&forall ) {54 for ( std::list< TypeDecl* >::const_iterator i = forall.begin(); i != forall.end(); ++i ) {53 void FindFunction::handleForall( const Type::ForallList &forall ) { 54 for ( Type::ForallList::const_iterator i = forall.begin(); i != forall.end(); ++i ) { 55 55 TyVarMap::iterator var = tyVars.find( (*i)->get_name() ); 56 56 if ( var != tyVars.end() ) { -
src/GenPoly/GenPoly.cc
rd58a39a0 r7756647 110 110 ReferenceToType *isDynRet( FunctionType *function, const TyVarMap &forallTypes ) { 111 111 if ( function->get_returnVals().empty() ) return 0; 112 112 113 113 return (ReferenceToType*)isDynType( function->get_returnVals().front()->get_type(), forallTypes ); 114 114 } … … 127 127 // } // if 128 128 if ( isDynRet( adaptee, tyVars ) ) return true; 129 129 130 130 for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) { 131 131 // if ( isPolyType( (*innerArg)->get_type(), tyVars ) ) { … … 228 228 229 229 void makeTyVarMap( Type *type, TyVarMap &tyVarMap ) { 230 for ( std::list< TypeDecl* >::const_iterator tyVar = type->get_forall().begin(); tyVar != type->get_forall().end(); ++tyVar ) {230 for ( Type::ForallList::const_iterator tyVar = type->get_forall().begin(); tyVar != type->get_forall().end(); ++tyVar ) { 231 231 assert( *tyVar ); 232 232 tyVarMap[ (*tyVar)->get_name() ] = (*tyVar)->get_kind(); -
src/GenPoly/Lvalue.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Lvalue.cc -- 7 // Lvalue.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 41 41 public: 42 42 Pass1(); 43 43 44 44 virtual Expression *mutate( ApplicationExpr *appExpr ); 45 45 virtual Statement *mutate( ReturnStmt *appExpr ); … … 99 99 appExpr->get_function()->acceptMutator( *this ); 100 100 mutateAll( appExpr->get_args(), *this ); 101 102 assert( ! appExpr->get_function()->get_results().empty() );103 101 104 PointerType *pointer = dynamic_cast< PointerType* >( appExpr->get_function()->get_results().front() ); 105 assert( pointer ); 106 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ); 107 assert( function ); 102 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 103 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 108 104 109 105 Type *funType = isLvalueRet( function ); 110 106 if ( funType && ! isIntrinsicApp( appExpr ) ) { 111 107 Expression *expr = appExpr; 112 Type *appType = appExpr->get_result s().front();108 Type *appType = appExpr->get_result(); 113 109 if ( isPolyType( funType ) && ! isPolyType( appType ) ) { 114 110 // make sure cast for polymorphic type is inside dereference … … 116 112 } 117 113 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 118 deref-> get_results().push_back( appType->clone() );119 appExpr-> get_results().front() = new PointerType( Type::Qualifiers(), appType);114 deref->set_result( appType->clone() ); 115 appExpr->set_result( new PointerType( Type::Qualifiers(), appType ) ); 120 116 deref->get_args().push_back( expr ); 121 117 return deref; … … 127 123 Statement * Pass1::mutate(ReturnStmt *retStmt) { 128 124 if ( retval && retStmt->get_expr() ) { 129 assert( ! retStmt->get_expr()->get_results().empty() ); 130 if ( retStmt->get_expr()->get_results().front()->get_isLvalue() ) { 125 if ( retStmt->get_expr()->get_result()->get_isLvalue() ) { 131 126 // ***** Code Removal ***** because casts may be stripped already 132 127 … … 155 150 retParm->set_type( new PointerType( Type::Qualifiers(), retParm->get_type() ) ); 156 151 } // if 157 152 158 153 Visitor::visit( funType ); 159 154 } -
src/GenPoly/Specialize.cc
rd58a39a0 r7756647 147 147 148 148 Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) { 149 assert( ! actual->get_results().empty() ); // using front, should have this assert150 if ( needsSpecialization( formalType, actual->get_result s().front(), env ) ) {149 assert( actual->has_result() ); 150 if ( needsSpecialization( formalType, actual->get_result(), env ) ) { 151 151 FunctionType *funType; 152 152 if ( ( funType = getFunctionType( formalType ) ) ) { … … 171 171 void Specialize::handleExplicitParams( ApplicationExpr *appExpr ) { 172 172 // create thunks for the explicit parameters 173 assert( ! appExpr->get_function()->get_results().empty() );174 FunctionType *function = getFunctionType( appExpr->get_function()->get_result s().front() );173 assert( appExpr->get_function()->has_result() ); 174 FunctionType *function = getFunctionType( appExpr->get_function()->get_result() ); 175 175 assert( function ); 176 176 std::list< DeclarationWithType* >::iterator formal; … … 200 200 Expression * Specialize::mutate( AddressExpr *addrExpr ) { 201 201 addrExpr->get_arg()->acceptMutator( *this ); 202 assert( ! addrExpr->get_results().empty() );203 addrExpr->set_arg( doSpecialization( addrExpr->get_result s().front(), addrExpr->get_arg() ) );202 assert( addrExpr->has_result() ); 203 addrExpr->set_arg( doSpecialization( addrExpr->get_result(), addrExpr->get_arg() ) ); 204 204 return addrExpr; 205 205 } … … 207 207 Expression * Specialize::mutate( CastExpr *castExpr ) { 208 208 castExpr->get_arg()->acceptMutator( *this ); 209 if ( castExpr->get_result s().empty() ) {209 if ( castExpr->get_result()->isVoid() ) { 210 210 // can't specialize if we don't have a return value 211 211 return castExpr; 212 212 } 213 Expression *specialized = doSpecialization( castExpr->get_result s().front(), castExpr->get_arg() );213 Expression *specialized = doSpecialization( castExpr->get_result(), castExpr->get_arg() ); 214 214 if ( specialized != castExpr->get_arg() ) { 215 215 // assume here that the specialization incorporates the cast -
src/InitTweak/FixInit.cc
rd58a39a0 r7756647 69 69 70 70 /// create and resolve ctor/dtor expression: fname(var, [cpArg]) 71 ApplicationExpr * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 71 Expression * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 72 Expression * makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL ); 72 73 /// true if type does not need to be copy constructed to ensure correctness 73 bool skipCopyConstruct( Type * ); 74 bool skipCopyConstruct( Type * type ); 75 void copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr * impCpCtorExpr ); 76 void destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ); 74 77 private: 75 78 TypeSubstitution * env; … … 357 360 } 358 361 359 ApplicationExpr* ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {362 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) { 360 363 assert( var ); 364 return makeCtorDtor( fname, new AddressExpr( new VariableExpr( var ) ), cpArg ); 365 } 366 367 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) { 368 assert( thisArg ); 361 369 UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) ); 362 untyped->get_args().push_back( new AddressExpr( new VariableExpr( var ) ));370 untyped->get_args().push_back( thisArg ); 363 371 if (cpArg) untyped->get_args().push_back( cpArg->clone() ); 364 372 … … 367 375 // (VariableExpr and already resolved expression) 368 376 CP_CTOR_PRINT( std::cerr << "ResolvingCtorDtor " << untyped << std::endl; ) 369 ApplicationExpr * resolved = dynamic_cast< ApplicationExpr * >( ResolvExpr::findVoidExpression( untyped, *this ) ); 377 Expression * resolved = ResolvExpr::findVoidExpression( untyped, *this ); 378 assert( resolved ); 370 379 if ( resolved->get_env() ) { 371 380 env->add( *resolved->get_env() ); 372 381 } // if 373 382 374 assert( resolved );375 383 delete untyped; 376 384 return resolved; 377 385 } 378 386 387 void ResolveCopyCtors::copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr * impCpCtorExpr ) { 388 static UniqueName tempNamer("_tmp_cp"); 389 CP_CTOR_PRINT( std::cerr << "Type Substitution: " << *impCpCtorExpr->get_env() << std::endl; ) 390 assert( arg->has_result() ); 391 Type * result = arg->get_result(); 392 if ( skipCopyConstruct( result ) ) return; // skip certain non-copyable types 393 394 // type may involve type variables, so apply type substitution to get temporary variable's actual type 395 result = result->clone(); 396 impCpCtorExpr->get_env()->apply( result ); 397 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result, 0 ); 398 tmp->get_type()->set_isConst( false ); 399 400 // create and resolve copy constructor 401 CP_CTOR_PRINT( std::cerr << "makeCtorDtor for an argument" << std::endl; ) 402 Expression * cpCtor = makeCtorDtor( "?{}", tmp, arg ); 403 404 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( cpCtor ) ) { 405 // if the chosen constructor is intrinsic, the copy is unnecessary, so 406 // don't create the temporary and don't call the copy constructor 407 VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() ); 408 assert( function ); 409 if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) return; 410 } 411 412 // replace argument to function call with temporary 413 arg = new CommaExpr( cpCtor, new VariableExpr( tmp ) ); 414 impCpCtorExpr->get_tempDecls().push_back( tmp ); 415 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) ); 416 } 417 418 void ResolveCopyCtors::destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) { 419 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( ret ) ) ); 420 } 421 379 422 void ResolveCopyCtors::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 380 static UniqueName tempNamer("_tmp_cp");381 static UniqueName retNamer("_tmp_cp_ret");382 383 423 CP_CTOR_PRINT( std::cerr << "ResolveCopyCtors: " << impCpCtorExpr << std::endl; ) 384 424 Visitor::visit( impCpCtorExpr ); … … 389 429 // take each argument and attempt to copy construct it. 390 430 for ( Expression * & arg : appExpr->get_args() ) { 391 CP_CTOR_PRINT( std::cerr << "Type Substitution: " << *impCpCtorExpr->get_env() << std::endl; ) 392 // xxx - need to handle tuple arguments 393 assert( ! arg->get_results().empty() ); 394 Type * result = arg->get_results().front(); 395 if ( skipCopyConstruct( result ) ) continue; // skip certain non-copyable types 396 // type may involve type variables, so apply type substitution to get temporary variable's actual type 397 result = result->clone(); 398 impCpCtorExpr->get_env()->apply( result ); 399 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result, 0 ); 400 tmp->get_type()->set_isConst( false ); 401 402 // create and resolve copy constructor 403 CP_CTOR_PRINT( std::cerr << "makeCtorDtor for an argument" << std::endl; ) 404 ApplicationExpr * cpCtor = makeCtorDtor( "?{}", tmp, arg ); 405 406 // if the chosen constructor is intrinsic, the copy is unnecessary, so 407 // don't create the temporary and don't call the copy constructor 408 VariableExpr * function = dynamic_cast< VariableExpr * >( cpCtor->get_function() ); 409 assert( function ); 410 if ( function->get_var()->get_linkage() != LinkageSpec::Intrinsic ) { 411 // replace argument to function call with temporary 412 arg = new CommaExpr( cpCtor, new VariableExpr( tmp ) ); 413 impCpCtorExpr->get_tempDecls().push_back( tmp ); 414 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) ); 415 } // if 431 copyConstructArg( arg, impCpCtorExpr ); 416 432 } // for 417 433 … … 423 439 // level. Trying to pass that environment along. 424 440 callExpr->set_env( impCpCtorExpr->get_env()->clone() ); 425 for ( Type * result : appExpr->get_results() ) { 441 Type * result = appExpr->get_result(); 442 if ( ! result->isVoid() ) { 443 static UniqueName retNamer("_tmp_cp_ret"); 426 444 result = result->clone(); 427 445 impCpCtorExpr->get_env()->apply( result ); … … 430 448 impCpCtorExpr->get_returnDecls().push_back( ret ); 431 449 CP_CTOR_PRINT( std::cerr << "makeCtorDtor for a return" << std::endl; ) 432 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ));450 destructRet( new VariableExpr( ret ) , impCpCtorExpr ); 433 451 } // for 434 452 CP_CTOR_PRINT( std::cerr << "after Resolving: " << impCpCtorExpr << std::endl; ) … … 479 497 // know the result type of the assignment is the type of the LHS (minus the pointer), so 480 498 // add that onto the assignment expression so that later steps have the necessary information 481 assign-> add_result( returnDecl->get_type()->clone() );499 assign->set_result( returnDecl->get_type()->clone() ); 482 500 483 501 Expression * retExpr = new CommaExpr( assign, new VariableExpr( returnDecl ) ); 484 if ( callExpr->get_result s().front()->get_isLvalue() ) {502 if ( callExpr->get_result()->get_isLvalue() ) { 485 503 // lvalue returning functions are funny. Lvalue.cc inserts a *? in front of any lvalue returning 486 504 // non-intrinsic function. Add an AddressExpr to the call to negate the derefence and change the … … 500 518 UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) ); 501 519 deref->get_args().push_back( retExpr ); 502 deref-> add_result( resultType );520 deref->set_result( resultType ); 503 521 retExpr = deref; 504 522 } // if … … 939 957 Expression * FixCtorExprs::mutate( ConstructorExpr * ctorExpr ) { 940 958 static UniqueName tempNamer( "_tmp_ctor_expr" ); 941 assert( ctorExpr-> get_results().size() == 1 );942 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_result s().front()->clone(), nullptr );959 assert( ctorExpr->has_result() && ctorExpr->get_result()->size() == 1 ); 960 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_result()->clone(), nullptr ); 943 961 addDeclaration( tmp ); 944 962 … … 952 970 assign->get_args().push_back( new VariableExpr( tmp ) ); 953 971 assign->get_args().push_back( firstArg ); 954 cloneAll( ctorExpr->get_results(), assign->get_results() );972 assign->set_result( ctorExpr->get_result()->clone() ); 955 973 firstArg = assign; 956 974 -
src/InitTweak/GenInit.cc
rd58a39a0 r7756647 29 29 #include "GenPoly/DeclMutator.h" 30 30 #include "GenPoly/ScopedSet.h" 31 #include "ResolvExpr/typeops.h" 31 32 32 33 namespace InitTweak { … … 50 51 51 52 protected: 52 std::list<DeclarationWithType*> returnVals;53 FunctionType * ftype; 53 54 UniqueName tempNamer; 54 55 std::string funcName; … … 86 87 87 88 bool isManaged( ObjectDecl * objDecl ) const ; // determine if object is managed 89 bool isManaged( Type * type ) const; // determine if type is managed 88 90 void handleDWT( DeclarationWithType * dwt ); // add type to managed if ctor/dtor 89 91 GenPoly::ScopedSet< std::string > managedTypes; … … 134 136 135 137 Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) { 136 // update for multiple return values138 std::list< DeclarationWithType * > & returnVals = ftype->get_returnVals(); 137 139 assert( returnVals.size() == 0 || returnVals.size() == 1 ); 138 140 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address … … 156 158 157 159 DeclarationWithType* ReturnFixer::mutate( FunctionDecl *functionDecl ) { 158 ValueGuard< std::list<DeclarationWithType*> > oldReturnVals( returnVals ); 160 // xxx - need to handle named return values - this pass may need to happen 161 // after resolution? the ordering is tricky because return statements must be 162 // constructed - the simplest way to do that (while also handling multiple 163 // returns) is to structure the returnVals into a tuple, as done here. 164 // however, if the tuple return value is structured before resolution, 165 // it's difficult to resolve named return values, since the name is lost 166 // in conversion to a tuple. this might be easiest to deal with 167 // after reference types are added, as it may then be possible to 168 // uniformly move named return values to the parameter list directly 169 ValueGuard< FunctionType * > oldFtype( ftype ); 159 170 ValueGuard< std::string > oldFuncName( funcName ); 160 171 161 FunctionType * type = functionDecl->get_functionType(); 162 returnVals = type->get_returnVals(); 172 ftype = functionDecl->get_functionType(); 173 std::list< DeclarationWithType * > & retVals = ftype->get_returnVals(); 174 if ( retVals.size() > 1 ) { 175 TupleType * tupleType = safe_dynamic_cast< TupleType * >( ResolvExpr::extractResultType( ftype ) ); 176 ObjectDecl * newRet = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, tupleType, new ListInit( std::list<Initializer*>(), noDesignators, false ) ); 177 retVals.clear(); 178 retVals.push_back( newRet ); 179 } 163 180 funcName = functionDecl->get_name(); 164 181 DeclarationWithType * decl = Mutator::mutate( functionDecl ); … … 220 237 } 221 238 239 bool CtorDtor::isManaged( Type * type ) const { 240 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( type ) ) { 241 // tuple is also managed if any of its components are managed 242 if ( std::any_of( tupleType->get_types().begin(), tupleType->get_types().end(), [&](Type * type) { return isManaged( type ); }) ) { 243 return true; 244 } 245 } 246 return managedTypes.find( SymTab::Mangler::mangle( type ) ) != managedTypes.end(); 247 } 248 222 249 bool CtorDtor::isManaged( ObjectDecl * objDecl ) const { 223 250 Type * type = objDecl->get_type(); … … 225 252 type = at->get_base(); 226 253 } 227 return managedTypes.find( SymTab::Mangler::mangle( type ) ) != managedTypes.end();254 return isManaged( type ); 228 255 } 229 256 … … 288 315 managedTypes.beginScope(); 289 316 // go through assertions and recursively add seen ctor/dtors 290 for ( TypeDecl *tyDecl : functionDecl->get_functionType()->get_forall() ) {317 for ( auto & tyDecl : functionDecl->get_functionType()->get_forall() ) { 291 318 for ( DeclarationWithType *& assertion : tyDecl->get_assertions() ) { 292 319 assertion = assertion->acceptMutator( *this ); -
src/InitTweak/InitTweak.cc
rd58a39a0 r7756647 340 340 return allofCtorDtor( stmt, []( Expression * callExpr ){ 341 341 if ( ApplicationExpr * appExpr = isIntrinsicCallExpr( callExpr ) ) { 342 assert( ! appExpr->get_function()->get_results().empty() ); 343 FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_results().front() ); 342 FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_result() ); 344 343 assert( funcType ); 345 344 return funcType->get_parameters().size() == 1; … … 388 387 return memberExpr->get_member()->get_name(); 389 388 } else if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * > ( func ) ) { 390 return memberExpr->get_member();389 return funcName( memberExpr->get_member() ); 391 390 } else { 392 391 assertf( false, "Unexpected expression type being called as a function in call expression" ); … … 451 450 // virtual void visit( LogicalExpr *logicalExpr ); 452 451 // virtual void visit( ConditionalExpr *conditionalExpr ); 453 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }454 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }455 452 virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; } 456 453 virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; } 457 454 virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; } 458 455 virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; } 456 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; } 457 virtual void visit( TupleAssignExpr *tupleExpr ) { isConstExpr = false; } 459 458 460 459 bool isConstExpr; -
src/Makefile.in
rd58a39a0 r7756647 105 105 ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) \ 106 106 ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT) \ 107 ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT) \108 107 GenPoly/driver_cfa_cpp-Box.$(OBJEXT) \ 109 108 GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT) \ … … 191 190 SynTree/driver_cfa_cpp-Attribute.$(OBJEXT) \ 192 191 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \ 193 Tuples/driver_cfa_cpp- NameMatcher.$(OBJEXT)192 Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT) 194 193 am_driver_cfa_cpp_OBJECTS = $(am__objects_1) 195 194 driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS) … … 364 363 ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \ 365 364 ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \ 366 ControlStruct/ForExprMutator.cc \ 367 ControlStruct/LabelTypeChecker.cc GenPoly/Box.cc \ 365 ControlStruct/ForExprMutator.cc GenPoly/Box.cc \ 368 366 GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \ 369 367 GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \ … … 405 403 SynTree/AddStmtVisitor.cc SynTree/TypeSubstitution.cc \ 406 404 SynTree/Attribute.cc Tuples/TupleAssignment.cc \ 407 Tuples/ NameMatcher.cc405 Tuples/TupleExpansion.cc 408 406 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \ 409 407 ${cfa_cpplib_PROGRAMS}} … … 540 538 ControlStruct/$(DEPDIR)/$(am__dirstamp) 541 539 ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT): \ 542 ControlStruct/$(am__dirstamp) \543 ControlStruct/$(DEPDIR)/$(am__dirstamp)544 ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT): \545 540 ControlStruct/$(am__dirstamp) \ 546 541 ControlStruct/$(DEPDIR)/$(am__dirstamp) … … 776 771 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT): \ 777 772 Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp) 778 Tuples/driver_cfa_cpp- NameMatcher.$(OBJEXT): Tuples/$(am__dirstamp)\779 Tuples/$( DEPDIR)/$(am__dirstamp)773 Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT): \ 774 Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp) 780 775 driver/$(am__dirstamp): 781 776 @$(MKDIR_P) driver … … 799 794 -rm -f ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) 800 795 -rm -f ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) 801 -rm -f ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT)802 796 -rm -f ControlStruct/driver_cfa_cpp-MLEMutator.$(OBJEXT) 803 797 -rm -f ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) … … 886 880 -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) 887 881 -rm -f SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT) 888 -rm -f Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT)889 882 -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) 883 -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT) 890 884 891 885 distclean-compile: … … 906 900 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@ 907 901 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelGenerator.Po@am__quote@ 908 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po@am__quote@909 902 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-MLEMutator.Po@am__quote@ 910 903 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-Mutate.Po@am__quote@ … … 993 986 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@ 994 987 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Po@am__quote@ 995 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po@am__quote@996 988 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@ 989 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@ 997 990 998 991 .cc.o: … … 1236 1229 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ForExprMutator.obj `if test -f 'ControlStruct/ForExprMutator.cc'; then $(CYGPATH_W) 'ControlStruct/ForExprMutator.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ForExprMutator.cc'; fi` 1237 1230 1238 ControlStruct/driver_cfa_cpp-LabelTypeChecker.o: ControlStruct/LabelTypeChecker.cc1239 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-LabelTypeChecker.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo -c -o ControlStruct/driver_cfa_cpp-LabelTypeChecker.o `test -f 'ControlStruct/LabelTypeChecker.cc' || echo '$(srcdir)/'`ControlStruct/LabelTypeChecker.cc1240 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po1241 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ControlStruct/LabelTypeChecker.cc' object='ControlStruct/driver_cfa_cpp-LabelTypeChecker.o' libtool=no @AMDEPBACKSLASH@1242 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@1243 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-LabelTypeChecker.o `test -f 'ControlStruct/LabelTypeChecker.cc' || echo '$(srcdir)/'`ControlStruct/LabelTypeChecker.cc1244 1245 ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj: ControlStruct/LabelTypeChecker.cc1246 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo -c -o ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj `if test -f 'ControlStruct/LabelTypeChecker.cc'; then $(CYGPATH_W) 'ControlStruct/LabelTypeChecker.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/LabelTypeChecker.cc'; fi`1247 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po1248 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ControlStruct/LabelTypeChecker.cc' object='ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj' libtool=no @AMDEPBACKSLASH@1249 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@1250 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj `if test -f 'ControlStruct/LabelTypeChecker.cc'; then $(CYGPATH_W) 'ControlStruct/LabelTypeChecker.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/LabelTypeChecker.cc'; fi`1251 1252 1231 GenPoly/driver_cfa_cpp-Box.o: GenPoly/Box.cc 1253 1232 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-Box.o -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-Box.Tpo -c -o GenPoly/driver_cfa_cpp-Box.o `test -f 'GenPoly/Box.cc' || echo '$(srcdir)/'`GenPoly/Box.cc … … 2440 2419 @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` 2441 2420 2442 Tuples/driver_cfa_cpp- NameMatcher.o: Tuples/NameMatcher.cc2443 @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.cc2444 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp- NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po2445 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/ NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.o' libtool=no @AMDEPBACKSLASH@2446 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2447 @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.cc2448 2449 Tuples/driver_cfa_cpp- NameMatcher.obj: Tuples/NameMatcher.cc2450 @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`2451 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp- NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po2452 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/ NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.obj' libtool=no @AMDEPBACKSLASH@2453 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2454 @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`2421 Tuples/driver_cfa_cpp-TupleExpansion.o: Tuples/TupleExpansion.cc 2422 @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 2423 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po 2424 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.o' libtool=no @AMDEPBACKSLASH@ 2425 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2426 @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 2427 2428 Tuples/driver_cfa_cpp-TupleExpansion.obj: Tuples/TupleExpansion.cc 2429 @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` 2430 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po 2431 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.obj' libtool=no @AMDEPBACKSLASH@ 2432 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2433 @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` 2455 2434 2456 2435 .ll.cc: -
src/Parser/ExpressionNode.cc
rd58a39a0 r7756647 198 198 } 199 199 200 Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member ) { 201 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeMoveBuild< Expression >(expr_node) ); 202 delete member; 203 return ret; 204 } 205 206 Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member ) { 200 Expression *build_fieldSel( ExpressionNode *expr_node, Expression *member ) { 201 UntypedMemberExpr *ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) ); 202 return ret; 203 } 204 205 Expression *build_pfieldSel( ExpressionNode *expr_node, Expression *member ) { 207 206 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 208 207 deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) ); 209 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref ); 210 delete member; 208 UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref ); 211 209 return ret; 212 210 } -
src/Parser/ParseNode.h
rd58a39a0 r7756647 160 160 161 161 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ); 162 Expression * build_fieldSel( ExpressionNode * expr_node, NameExpr* member );163 Expression * build_pfieldSel( ExpressionNode * expr_node, NameExpr* member );162 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ); 163 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member ); 164 164 Expression * build_addressOf( ExpressionNode * expr_node ); 165 165 Expression * build_sizeOfexpr( ExpressionNode * expr_node ); … … 383 383 //############################################################################## 384 384 385 template< typename SynTreeType, typename NodeType >386 void buildList( const NodeType * firstNode, std::list< SynTreeType *> &outputList ) {385 template< typename SynTreeType, typename NodeType, template< typename, typename...> class Container, typename... Args > 386 void buildList( const NodeType * firstNode, Container< SynTreeType *, Args... > &outputList ) { 387 387 SemanticError errors; 388 std::back_insert_iterator< std::list< SynTreeType *> > out( outputList );388 std::back_insert_iterator< Container< SynTreeType *, Args... > > out( outputList ); 389 389 const NodeType * cur = firstNode; 390 390 -
src/Parser/TypeData.cc
rd58a39a0 r7756647 385 385 } // TypeData::print 386 386 387 void buildForall( const DeclarationNode * firstNode, list< TypeDecl* > &outputList ) { 387 template< typename ForallList > 388 void buildForall( const DeclarationNode * firstNode, ForallList &outputList ) { 388 389 buildList( firstNode, outputList ); 389 for ( list< TypeDecl* >::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 390 if ( (*i)->get_kind() == TypeDecl::Any ) { 390 for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 391 TypeDecl * td = static_cast<TypeDecl*>(*i); 392 if ( td->get_kind() == TypeDecl::Any ) { 391 393 // add assertion parameters to `type' tyvars in reverse order 392 394 // add dtor: void ^?{}(T *) 393 395 FunctionType * dtorType = new FunctionType( Type::Qualifiers(), false ); 394 dtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), nullptr ) );395 (*i)->get_assertions().push_front( new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, dtorType, nullptr, false, false ) );396 dtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 397 td->get_assertions().push_front( new FunctionDecl( "^?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, dtorType, nullptr, false, false ) ); 396 398 397 399 // add copy ctor: void ?{}(T *, T) 398 400 FunctionType * copyCtorType = new FunctionType( Type::Qualifiers(), false ); 399 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), nullptr ) );400 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), nullptr ) );401 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, copyCtorType, nullptr, false, false ) );401 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 402 copyCtorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) ); 403 td->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, copyCtorType, nullptr, false, false ) ); 402 404 403 405 // add default ctor: void ?{}(T *) 404 406 FunctionType * ctorType = new FunctionType( Type::Qualifiers(), false ); 405 ctorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), nullptr ) );406 (*i)->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, ctorType, nullptr, false, false ) );407 ctorType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 408 td->get_assertions().push_front( new FunctionDecl( "?{}", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, ctorType, nullptr, false, false ) ); 407 409 408 410 // add assignment operator: T * ?=?(T *, T) 409 411 FunctionType * assignType = new FunctionType( Type::Qualifiers(), false ); 410 assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ) ), nullptr ) );411 assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), nullptr ) );412 assignType->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), (*i)->get_name(), *i ), nullptr ) );413 (*i)->get_assertions().push_front( new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignType, nullptr, false, false ) );412 assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), new TypeInstType( Type::Qualifiers(), td->get_name(), *i ) ), nullptr ) ); 413 assignType->get_parameters().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) ); 414 assignType->get_returnVals().push_back( new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, new TypeInstType( Type::Qualifiers(), td->get_name(), *i ), nullptr ) ); 415 td->get_assertions().push_front( new FunctionDecl( "?=?", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, assignType, nullptr, false, false ) ); 414 416 } // if 415 417 } // for … … 515 517 // character types. The implementation shall define char to have the same range, representation, and behavior as 516 518 // either signed char or unsigned char. 517 static BasicType::Kind chartype[] = { BasicType::SignedChar, BasicType::UnsignedChar, BasicType::Char }; 519 static BasicType::Kind chartype[] = { BasicType::SignedChar, BasicType::UnsignedChar, BasicType::Char }; 518 520 519 521 if ( td->length != DeclarationNode::NoLength ) { -
src/Parser/parser.cc
rd58a39a0 r7756647 1025 1025 0, 302, 302, 306, 313, 314, 315, 319, 320, 321, 1026 1026 325, 326, 330, 331, 335, 336, 340, 344, 345, 356, 1027 358, 360, 362, 367, 368, 374, 378, 380, 38 1, 382,1028 38 4, 385, 387, 389, 391, 400, 401, 407, 408, 412,1029 41 3, 417, 421, 423, 425, 427, 432, 433, 437, 440,1030 44 2, 444, 449, 462, 464, 466, 468, 470, 472, 474,1031 47 6, 478, 480, 482, 489, 490, 496, 497, 498, 499,1032 50 3, 504, 506, 511, 512, 514, 516, 521, 522, 524,1033 5 29, 530, 532, 537, 538, 540, 542, 544, 549, 550,1034 55 2, 557, 558, 563, 564, 569, 570, 575, 576, 581,1035 58 2, 587, 588, 591, 593, 598, 603, 604, 606, 612,1036 61 3, 617, 618, 619, 620, 621, 622, 623, 624, 625,1037 62 6, 627, 628, 634, 636, 638, 640, 645, 646, 651,1038 65 2, 658, 659, 665, 666, 667, 668, 669, 670, 671,1039 67 2, 673, 683, 690, 692, 702, 703, 708, 710, 716,1040 7 18, 722, 723, 728, 733, 736, 738, 740, 750, 752,1041 76 3, 764, 766, 770, 772, 776, 777, 782, 783, 787,1042 79 2, 793, 797, 799, 805, 806, 810, 812, 814, 816,1043 82 2, 823, 827, 829, 834, 836, 838, 843, 845, 850,1044 85 2, 856, 859, 863, 866, 870, 872, 874, 876, 881,1045 88 3, 885, 890, 892, 894, 896, 898, 903, 905, 907,1046 9 09, 914, 926, 927, 932, 934, 939, 943, 945, 947,1047 9 49, 951, 957, 958, 964, 965, 969, 970, 975, 977,1048 98 3, 984, 986, 991, 996, 1006, 1008, 1012, 1013, 1018,1049 102 0, 1024, 1025, 1029, 1031, 1035, 1036, 1040, 1041, 1045,1050 104 6, 1061, 1062, 1063, 1064, 1065, 1069, 1074, 1081, 1091,1051 109 6, 1101, 1109, 1114, 1119, 1124, 1129, 1137, 1159, 1164,1052 117 1, 1173, 1180, 1185, 1190, 1201, 1206, 1211, 1216, 1221,1053 123 0, 1235, 1243, 1244, 1245, 1246, 1252, 1257, 1265, 1266,1054 12 67, 1268, 1272, 1273, 1274, 1275, 1280, 1281, 1290, 1291,1055 129 6, 1297, 1302, 1304, 1306, 1308, 1310, 1313, 1312, 1324,1056 132 5, 1327, 1337, 1338, 1343, 1345, 1347, 1349, 1351, 1354,1057 135 6, 1359, 1364, 1366, 1368, 1370, 1372, 1374, 1376, 1378,1058 138 0, 1382, 1384, 1386, 1388, 1394, 1395, 1397, 1399, 1401,1059 140 6, 1407, 1413, 1414, 1416, 1418, 1423, 1425, 1427, 1429,1060 143 4, 1435, 1437, 1439, 1444, 1445, 1447, 1452, 1453, 1455,1061 14 57, 1462, 1464, 1466, 1471, 1472, 1476, 1478, 1484, 1483,1062 14 87, 1489, 1494, 1496, 1502, 1503, 1508, 1509, 1511, 1512,1063 152 1, 1522, 1524, 1526, 1531, 1533, 1539, 1540, 1542, 1545,1064 15 48, 1553, 1554, 1559, 1564, 1568, 1570, 1576, 1575, 1582,1065 158 4, 1590, 1591, 1599, 1600, 1604, 1605, 1606, 1608, 1610,1066 16 17, 1618, 1620, 1622, 1627, 1628, 1634, 1635, 1639, 1640,1067 164 5, 1646, 1647, 1649, 1657, 1658, 1660, 1663, 1665, 1669,1068 167 0, 1671, 1673, 1675, 1679, 1684, 1692, 1693, 1702, 1704,1069 17 09, 1710, 1711, 1715, 1716, 1717, 1721, 1722, 1723, 1727,1070 17 28, 1729, 1734, 1735, 1736, 1737, 1743, 1744, 1746, 1751,1071 175 2, 1757, 1758, 1759, 1760, 1761, 1776, 1777, 1782, 1783,1072 17 89, 1791, 1794, 1796, 1798, 1821, 1822, 1824, 1826, 1831,1073 183 2, 1834, 1839, 1844, 1845, 1851, 1850, 1854, 1858, 1860,1074 186 2, 1868, 1869, 1874, 1879, 1881, 1886, 1888, 1889, 1891,1075 189 6, 1898, 1900, 1905, 1907, 1912, 1917, 1925, 1931, 1930,1076 194 4, 1945, 1950, 1951, 1955, 1960, 1965, 1973, 1978, 1989,1077 199 0, 1995, 1996, 2002, 2003, 2007, 2008, 2009, 2012, 2011,1078 202 2, 2031, 2037, 2043, 2052, 2058, 2064, 2070, 2076, 2084,1079 209 0, 2098, 2104, 2113, 2114, 2115, 2119, 2123, 2125, 2130,1080 213 1, 2135, 2136, 2141, 2147, 2148, 2151, 2153, 2154, 2158,1081 21 59, 2160, 2161, 2195, 2197, 2198, 2200, 2205, 2210, 2215,1082 22 17, 2219, 2224, 2226, 2228, 2230, 2235, 2237, 2246, 2248,1083 22 49, 2254, 2256, 2258, 2263, 2265, 2267, 2272, 2274, 2276,1084 228 5, 2286, 2287, 2291, 2293, 2295, 2300, 2302, 2304, 2309,1085 231 1, 2313, 2328, 2330, 2331, 2333, 2338, 2339, 2344, 2346,1086 23 48, 2353, 2355, 2357, 2359, 2364, 2366, 2368, 2378, 2380,1087 238 1, 2383, 2388, 2390, 2392, 2397, 2399, 2401, 2403, 2408,1088 241 0, 2412, 2443, 2445, 2446, 2448, 2453, 2458, 2466, 2468,1089 247 0, 2475, 2477, 2482, 2484, 2498, 2499, 2501, 2506, 2508,1090 251 0, 2512, 2514, 2519, 2520, 2522, 2524, 2529, 2531, 2533,1091 25 39, 2541, 2543, 2547, 2549, 2551, 2553, 2567, 2568, 2570,1092 257 5, 2577, 2579, 2581, 2583, 2588, 2589, 2591, 2593, 2598,1093 260 0, 2602, 2608, 2609, 2611, 2620, 2623, 2625, 2628, 2630,1094 263 2, 2645, 2646, 2648, 2653, 2655, 2657, 2659, 2661, 2666,1095 26 67, 2669, 2671, 2676, 2678, 2686, 2687, 2688, 2693, 2694,1096 2 698, 2700, 2702, 2704, 2706, 2708, 2715, 2717, 2719, 2721,1097 272 3, 2725, 2727, 2729, 2731, 2733, 2738, 2740, 2742, 2747,1098 277 3, 2774, 2776, 2780, 2781, 2785, 2787, 2789, 2791, 2793,1099 279 5, 2802, 2804, 2806, 2808, 2810, 2812, 2817, 2822, 2824,1100 282 6, 2844, 2846, 2851, 28521027 358, 360, 362, 367, 368, 374, 378, 380, 382, 384, 1028 386, 388, 390, 392, 394, 403, 404, 410, 411, 415, 1029 416, 420, 424, 426, 428, 430, 435, 436, 440, 443, 1030 445, 447, 452, 465, 467, 469, 471, 473, 475, 477, 1031 479, 481, 483, 485, 492, 493, 499, 500, 501, 502, 1032 506, 507, 509, 514, 515, 517, 519, 524, 525, 527, 1033 532, 533, 535, 540, 541, 543, 545, 547, 552, 553, 1034 555, 560, 561, 566, 567, 572, 573, 578, 579, 584, 1035 585, 590, 591, 594, 596, 601, 606, 607, 609, 615, 1036 616, 620, 621, 622, 623, 624, 625, 626, 627, 628, 1037 629, 630, 631, 637, 639, 641, 643, 648, 649, 654, 1038 655, 661, 662, 668, 669, 670, 671, 672, 673, 674, 1039 675, 676, 686, 693, 695, 705, 706, 711, 713, 719, 1040 721, 725, 726, 731, 736, 739, 741, 743, 753, 755, 1041 766, 767, 769, 773, 775, 779, 780, 785, 786, 790, 1042 795, 796, 800, 802, 808, 809, 813, 815, 817, 819, 1043 825, 826, 830, 832, 837, 839, 841, 846, 848, 853, 1044 855, 859, 862, 866, 869, 873, 875, 877, 879, 884, 1045 886, 888, 893, 895, 897, 899, 901, 906, 908, 910, 1046 912, 917, 929, 930, 935, 937, 942, 946, 948, 950, 1047 952, 954, 960, 961, 967, 968, 972, 973, 978, 980, 1048 986, 987, 989, 994, 999, 1009, 1011, 1015, 1016, 1021, 1049 1023, 1027, 1028, 1032, 1034, 1038, 1039, 1043, 1044, 1048, 1050 1049, 1064, 1065, 1066, 1067, 1068, 1072, 1077, 1084, 1094, 1051 1099, 1104, 1112, 1117, 1122, 1127, 1132, 1140, 1162, 1167, 1052 1174, 1176, 1183, 1188, 1193, 1204, 1209, 1214, 1219, 1224, 1053 1233, 1238, 1246, 1247, 1248, 1249, 1255, 1260, 1268, 1269, 1054 1270, 1271, 1275, 1276, 1277, 1278, 1283, 1284, 1293, 1294, 1055 1299, 1300, 1305, 1307, 1309, 1311, 1313, 1316, 1315, 1327, 1056 1328, 1330, 1340, 1341, 1346, 1348, 1350, 1352, 1354, 1357, 1057 1359, 1362, 1367, 1369, 1371, 1373, 1375, 1377, 1379, 1381, 1058 1383, 1385, 1387, 1389, 1391, 1397, 1398, 1400, 1402, 1404, 1059 1409, 1410, 1416, 1417, 1419, 1421, 1426, 1428, 1430, 1432, 1060 1437, 1438, 1440, 1442, 1447, 1448, 1450, 1455, 1456, 1458, 1061 1460, 1465, 1467, 1469, 1474, 1475, 1479, 1481, 1487, 1486, 1062 1490, 1492, 1497, 1499, 1505, 1506, 1511, 1512, 1514, 1515, 1063 1524, 1525, 1527, 1529, 1534, 1536, 1542, 1543, 1545, 1548, 1064 1551, 1556, 1557, 1562, 1567, 1571, 1573, 1579, 1578, 1585, 1065 1587, 1593, 1594, 1602, 1603, 1607, 1608, 1609, 1611, 1613, 1066 1620, 1621, 1623, 1625, 1630, 1631, 1637, 1638, 1642, 1643, 1067 1648, 1649, 1650, 1652, 1660, 1661, 1663, 1666, 1668, 1672, 1068 1673, 1674, 1676, 1678, 1682, 1687, 1695, 1696, 1705, 1707, 1069 1712, 1713, 1714, 1718, 1719, 1720, 1724, 1725, 1726, 1730, 1070 1731, 1732, 1737, 1738, 1739, 1740, 1746, 1747, 1749, 1754, 1071 1755, 1760, 1761, 1762, 1763, 1764, 1779, 1780, 1785, 1786, 1072 1792, 1794, 1797, 1799, 1801, 1824, 1825, 1827, 1829, 1834, 1073 1835, 1837, 1842, 1847, 1848, 1854, 1853, 1857, 1861, 1863, 1074 1865, 1871, 1872, 1877, 1882, 1884, 1889, 1891, 1892, 1894, 1075 1899, 1901, 1903, 1908, 1910, 1915, 1920, 1928, 1934, 1933, 1076 1947, 1948, 1953, 1954, 1958, 1963, 1968, 1976, 1981, 1992, 1077 1993, 1998, 1999, 2005, 2006, 2010, 2011, 2012, 2015, 2014, 1078 2025, 2034, 2040, 2046, 2055, 2061, 2067, 2073, 2079, 2087, 1079 2093, 2101, 2107, 2116, 2117, 2118, 2122, 2126, 2128, 2133, 1080 2134, 2138, 2139, 2144, 2150, 2151, 2154, 2156, 2157, 2161, 1081 2162, 2163, 2164, 2198, 2200, 2201, 2203, 2208, 2213, 2218, 1082 2220, 2222, 2227, 2229, 2231, 2233, 2238, 2240, 2249, 2251, 1083 2252, 2257, 2259, 2261, 2266, 2268, 2270, 2275, 2277, 2279, 1084 2288, 2289, 2290, 2294, 2296, 2298, 2303, 2305, 2307, 2312, 1085 2314, 2316, 2331, 2333, 2334, 2336, 2341, 2342, 2347, 2349, 1086 2351, 2356, 2358, 2360, 2362, 2367, 2369, 2371, 2381, 2383, 1087 2384, 2386, 2391, 2393, 2395, 2400, 2402, 2404, 2406, 2411, 1088 2413, 2415, 2446, 2448, 2449, 2451, 2456, 2461, 2469, 2471, 1089 2473, 2478, 2480, 2485, 2487, 2501, 2502, 2504, 2509, 2511, 1090 2513, 2515, 2517, 2522, 2523, 2525, 2527, 2532, 2534, 2536, 1091 2542, 2544, 2546, 2550, 2552, 2554, 2556, 2570, 2571, 2573, 1092 2578, 2580, 2582, 2584, 2586, 2591, 2592, 2594, 2596, 2601, 1093 2603, 2605, 2611, 2612, 2614, 2623, 2626, 2628, 2631, 2633, 1094 2635, 2648, 2649, 2651, 2656, 2658, 2660, 2662, 2664, 2669, 1095 2670, 2672, 2674, 2679, 2681, 2689, 2690, 2691, 2696, 2697, 1096 2701, 2703, 2705, 2707, 2709, 2711, 2718, 2720, 2722, 2724, 1097 2726, 2728, 2730, 2732, 2734, 2736, 2741, 2743, 2745, 2750, 1098 2776, 2777, 2779, 2783, 2784, 2788, 2790, 2792, 2794, 2796, 1099 2798, 2805, 2807, 2809, 2811, 2813, 2815, 2820, 2825, 2827, 1100 2829, 2847, 2849, 2854, 2855 1101 1101 }; 1102 1102 #endif … … 5083 5083 break; 5084 5084 5085 case 27: 5086 5087 /* Line 1806 of yacc.c */ 5088 #line 381 "parser.yy" 5089 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5090 break; 5091 5092 case 28: 5093 5094 /* Line 1806 of yacc.c */ 5095 #line 383 "parser.yy" 5096 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_constantInteger( *(yyvsp[(3) - (3)].tok) ) ) ); } 5097 break; 5098 5085 5099 case 29: 5086 5100 5087 5101 /* Line 1806 of yacc.c */ 5088 #line 38 3"parser.yy"5102 #line 385 "parser.yy" 5089 5103 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 5090 5104 break; 5091 5105 5106 case 30: 5107 5108 /* Line 1806 of yacc.c */ 5109 #line 387 "parser.yy" 5110 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5111 break; 5112 5092 5113 case 31: 5093 5114 5094 5115 /* Line 1806 of yacc.c */ 5095 #line 38 6"parser.yy"5116 #line 389 "parser.yy" 5096 5117 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); } 5097 5118 break; … … 5100 5121 5101 5122 /* Line 1806 of yacc.c */ 5102 #line 3 88"parser.yy"5123 #line 391 "parser.yy" 5103 5124 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); } 5104 5125 break; … … 5107 5128 5108 5129 /* Line 1806 of yacc.c */ 5109 #line 39 0"parser.yy"5130 #line 393 "parser.yy" 5110 5131 { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); } 5111 5132 break; … … 5114 5135 5115 5136 /* Line 1806 of yacc.c */ 5116 #line 39 2"parser.yy"5137 #line 395 "parser.yy" 5117 5138 { 5118 5139 Token fn; … … 5125 5146 5126 5147 /* Line 1806 of yacc.c */ 5127 #line 40 2"parser.yy"5148 #line 405 "parser.yy" 5128 5149 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 5129 5150 break; … … 5132 5153 5133 5154 /* Line 1806 of yacc.c */ 5134 #line 4 07"parser.yy"5155 #line 410 "parser.yy" 5135 5156 { (yyval.en) = 0; } 5136 5157 break; … … 5139 5160 5140 5161 /* Line 1806 of yacc.c */ 5141 #line 41 3"parser.yy"5162 #line 416 "parser.yy" 5142 5163 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5143 5164 break; … … 5146 5167 5147 5168 /* Line 1806 of yacc.c */ 5148 #line 42 0"parser.yy"5169 #line 423 "parser.yy" 5149 5170 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5150 5171 break; … … 5153 5174 5154 5175 /* Line 1806 of yacc.c */ 5155 #line 42 2"parser.yy"5176 #line 425 "parser.yy" 5156 5177 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5157 5178 break; … … 5160 5181 5161 5182 /* Line 1806 of yacc.c */ 5162 #line 42 4"parser.yy"5183 #line 427 "parser.yy" 5163 5184 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5164 5185 break; … … 5167 5188 5168 5189 /* Line 1806 of yacc.c */ 5169 #line 42 6"parser.yy"5190 #line 429 "parser.yy" 5170 5191 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5171 5192 break; … … 5174 5195 5175 5196 /* Line 1806 of yacc.c */ 5176 #line 4 28"parser.yy"5197 #line 431 "parser.yy" 5177 5198 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5178 5199 break; … … 5181 5202 5182 5203 /* Line 1806 of yacc.c */ 5183 #line 44 1"parser.yy"5204 #line 444 "parser.yy" 5184 5205 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5185 5206 break; … … 5188 5209 5189 5210 /* Line 1806 of yacc.c */ 5190 #line 44 3"parser.yy"5211 #line 446 "parser.yy" 5191 5212 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 5192 5213 break; … … 5195 5216 5196 5217 /* Line 1806 of yacc.c */ 5197 #line 44 5"parser.yy"5218 #line 448 "parser.yy" 5198 5219 { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); } 5199 5220 break; … … 5202 5223 5203 5224 /* Line 1806 of yacc.c */ 5204 #line 45 0"parser.yy"5225 #line 453 "parser.yy" 5205 5226 { 5206 5227 switch ( (yyvsp[(1) - (2)].op) ) { … … 5220 5241 5221 5242 /* Line 1806 of yacc.c */ 5222 #line 46 3"parser.yy"5243 #line 466 "parser.yy" 5223 5244 { (yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) ); } 5224 5245 break; … … 5227 5248 5228 5249 /* Line 1806 of yacc.c */ 5229 #line 46 5"parser.yy"5250 #line 468 "parser.yy" 5230 5251 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Incr, (yyvsp[(2) - (2)].en) ) ); } 5231 5252 break; … … 5234 5255 5235 5256 /* Line 1806 of yacc.c */ 5236 #line 4 67"parser.yy"5257 #line 470 "parser.yy" 5237 5258 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Decr, (yyvsp[(2) - (2)].en) ) ); } 5238 5259 break; … … 5241 5262 5242 5263 /* Line 1806 of yacc.c */ 5243 #line 4 69"parser.yy"5264 #line 472 "parser.yy" 5244 5265 { (yyval.en) = new ExpressionNode( build_sizeOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5245 5266 break; … … 5248 5269 5249 5270 /* Line 1806 of yacc.c */ 5250 #line 47 1"parser.yy"5271 #line 474 "parser.yy" 5251 5272 { (yyval.en) = new ExpressionNode( build_sizeOftype( (yyvsp[(3) - (4)].decl) ) ); } 5252 5273 break; … … 5255 5276 5256 5277 /* Line 1806 of yacc.c */ 5257 #line 47 3"parser.yy"5278 #line 476 "parser.yy" 5258 5279 { (yyval.en) = new ExpressionNode( build_alignOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5259 5280 break; … … 5262 5283 5263 5284 /* Line 1806 of yacc.c */ 5264 #line 47 5"parser.yy"5285 #line 478 "parser.yy" 5265 5286 { (yyval.en) = new ExpressionNode( build_alignOftype( (yyvsp[(3) - (4)].decl) ) ); } 5266 5287 break; … … 5269 5290 5270 5291 /* Line 1806 of yacc.c */ 5271 #line 4 77"parser.yy"5292 #line 480 "parser.yy" 5272 5293 { (yyval.en) = new ExpressionNode( build_offsetOf( (yyvsp[(3) - (6)].decl), build_varref( (yyvsp[(5) - (6)].tok) ) ) ); } 5273 5294 break; … … 5276 5297 5277 5298 /* Line 1806 of yacc.c */ 5278 #line 4 79"parser.yy"5299 #line 482 "parser.yy" 5279 5300 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (1)].tok) ), nullptr ) ); } 5280 5301 break; … … 5283 5304 5284 5305 /* Line 1806 of yacc.c */ 5285 #line 48 1"parser.yy"5306 #line 484 "parser.yy" 5286 5307 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ) ); } 5287 5308 break; … … 5290 5311 5291 5312 /* Line 1806 of yacc.c */ 5292 #line 48 3"parser.yy"5313 #line 486 "parser.yy" 5293 5314 { (yyval.en) = new ExpressionNode( build_attrtype( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].decl) ) ); } 5294 5315 break; … … 5297 5318 5298 5319 /* Line 1806 of yacc.c */ 5299 #line 4 89"parser.yy"5320 #line 492 "parser.yy" 5300 5321 { (yyval.op) = OperKinds::PointTo; } 5301 5322 break; … … 5304 5325 5305 5326 /* Line 1806 of yacc.c */ 5306 #line 49 0"parser.yy"5327 #line 493 "parser.yy" 5307 5328 { (yyval.op) = OperKinds::AddressOf; } 5308 5329 break; … … 5311 5332 5312 5333 /* Line 1806 of yacc.c */ 5313 #line 49 6"parser.yy"5334 #line 499 "parser.yy" 5314 5335 { (yyval.op) = OperKinds::UnPlus; } 5315 5336 break; … … 5318 5339 5319 5340 /* Line 1806 of yacc.c */ 5320 #line 497"parser.yy"5341 #line 500 "parser.yy" 5321 5342 { (yyval.op) = OperKinds::UnMinus; } 5322 5343 break; … … 5325 5346 5326 5347 /* Line 1806 of yacc.c */ 5327 #line 498"parser.yy"5348 #line 501 "parser.yy" 5328 5349 { (yyval.op) = OperKinds::Neg; } 5329 5350 break; … … 5332 5353 5333 5354 /* Line 1806 of yacc.c */ 5334 #line 499"parser.yy"5355 #line 502 "parser.yy" 5335 5356 { (yyval.op) = OperKinds::BitNeg; } 5336 5357 break; … … 5339 5360 5340 5361 /* Line 1806 of yacc.c */ 5341 #line 50 5"parser.yy"5362 #line 508 "parser.yy" 5342 5363 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5343 5364 break; … … 5346 5367 5347 5368 /* Line 1806 of yacc.c */ 5348 #line 5 07"parser.yy"5369 #line 510 "parser.yy" 5349 5370 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5350 5371 break; … … 5353 5374 5354 5375 /* Line 1806 of yacc.c */ 5355 #line 51 3"parser.yy"5376 #line 516 "parser.yy" 5356 5377 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5357 5378 break; … … 5360 5381 5361 5382 /* Line 1806 of yacc.c */ 5362 #line 51 5"parser.yy"5383 #line 518 "parser.yy" 5363 5384 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5364 5385 break; … … 5367 5388 5368 5389 /* Line 1806 of yacc.c */ 5369 #line 5 17"parser.yy"5390 #line 520 "parser.yy" 5370 5391 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5371 5392 break; … … 5374 5395 5375 5396 /* Line 1806 of yacc.c */ 5376 #line 52 3"parser.yy"5397 #line 526 "parser.yy" 5377 5398 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5378 5399 break; … … 5381 5402 5382 5403 /* Line 1806 of yacc.c */ 5383 #line 52 5"parser.yy"5404 #line 528 "parser.yy" 5384 5405 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5385 5406 break; … … 5388 5409 5389 5410 /* Line 1806 of yacc.c */ 5390 #line 53 1"parser.yy"5411 #line 534 "parser.yy" 5391 5412 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5392 5413 break; … … 5395 5416 5396 5417 /* Line 1806 of yacc.c */ 5397 #line 53 3"parser.yy"5418 #line 536 "parser.yy" 5398 5419 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5399 5420 break; … … 5402 5423 5403 5424 /* Line 1806 of yacc.c */ 5404 #line 5 39"parser.yy"5425 #line 542 "parser.yy" 5405 5426 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5406 5427 break; … … 5409 5430 5410 5431 /* Line 1806 of yacc.c */ 5411 #line 54 1"parser.yy"5432 #line 544 "parser.yy" 5412 5433 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5413 5434 break; … … 5416 5437 5417 5438 /* Line 1806 of yacc.c */ 5418 #line 54 3"parser.yy"5439 #line 546 "parser.yy" 5419 5440 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5420 5441 break; … … 5423 5444 5424 5445 /* Line 1806 of yacc.c */ 5425 #line 54 5"parser.yy"5446 #line 548 "parser.yy" 5426 5447 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5427 5448 break; … … 5430 5451 5431 5452 /* Line 1806 of yacc.c */ 5432 #line 55 1"parser.yy"5453 #line 554 "parser.yy" 5433 5454 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5434 5455 break; … … 5437 5458 5438 5459 /* Line 1806 of yacc.c */ 5439 #line 55 3"parser.yy"5460 #line 556 "parser.yy" 5440 5461 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5441 5462 break; … … 5444 5465 5445 5466 /* Line 1806 of yacc.c */ 5446 #line 5 59"parser.yy"5467 #line 562 "parser.yy" 5447 5468 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5448 5469 break; … … 5451 5472 5452 5473 /* Line 1806 of yacc.c */ 5453 #line 56 5"parser.yy"5474 #line 568 "parser.yy" 5454 5475 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5455 5476 break; … … 5458 5479 5459 5480 /* Line 1806 of yacc.c */ 5460 #line 57 1"parser.yy"5481 #line 574 "parser.yy" 5461 5482 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5462 5483 break; … … 5465 5486 5466 5487 /* Line 1806 of yacc.c */ 5467 #line 5 77"parser.yy"5488 #line 580 "parser.yy" 5468 5489 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); } 5469 5490 break; … … 5472 5493 5473 5494 /* Line 1806 of yacc.c */ 5474 #line 58 3"parser.yy"5495 #line 586 "parser.yy" 5475 5496 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); } 5476 5497 break; … … 5479 5500 5480 5501 /* Line 1806 of yacc.c */ 5481 #line 5 89"parser.yy"5502 #line 592 "parser.yy" 5482 5503 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5483 5504 break; … … 5486 5507 5487 5508 /* Line 1806 of yacc.c */ 5488 #line 59 2"parser.yy"5509 #line 595 "parser.yy" 5489 5510 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); } 5490 5511 break; … … 5493 5514 5494 5515 /* Line 1806 of yacc.c */ 5495 #line 59 4"parser.yy"5516 #line 597 "parser.yy" 5496 5517 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5497 5518 break; … … 5500 5521 5501 5522 /* Line 1806 of yacc.c */ 5502 #line 60 5"parser.yy"5523 #line 608 "parser.yy" 5503 5524 { (yyval.en) = new ExpressionNode( build_binary_ptr( (yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5504 5525 break; … … 5507 5528 5508 5529 /* Line 1806 of yacc.c */ 5509 #line 6 07"parser.yy"5530 #line 610 "parser.yy" 5510 5531 { (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) ) ); } 5511 5532 break; … … 5514 5535 5515 5536 /* Line 1806 of yacc.c */ 5516 #line 61 2"parser.yy"5537 #line 615 "parser.yy" 5517 5538 { (yyval.en) = nullptr; } 5518 5539 break; … … 5521 5542 5522 5543 /* Line 1806 of yacc.c */ 5523 #line 6 17"parser.yy"5544 #line 620 "parser.yy" 5524 5545 { (yyval.op) = OperKinds::Assign; } 5525 5546 break; … … 5528 5549 5529 5550 /* Line 1806 of yacc.c */ 5530 #line 6 18"parser.yy"5551 #line 621 "parser.yy" 5531 5552 { (yyval.op) = OperKinds::AtAssn; } 5532 5553 break; … … 5535 5556 5536 5557 /* Line 1806 of yacc.c */ 5537 #line 6 19"parser.yy"5558 #line 622 "parser.yy" 5538 5559 { (yyval.op) = OperKinds::MulAssn; } 5539 5560 break; … … 5542 5563 5543 5564 /* Line 1806 of yacc.c */ 5544 #line 62 0"parser.yy"5565 #line 623 "parser.yy" 5545 5566 { (yyval.op) = OperKinds::DivAssn; } 5546 5567 break; … … 5549 5570 5550 5571 /* Line 1806 of yacc.c */ 5551 #line 62 1"parser.yy"5572 #line 624 "parser.yy" 5552 5573 { (yyval.op) = OperKinds::ModAssn; } 5553 5574 break; … … 5556 5577 5557 5578 /* Line 1806 of yacc.c */ 5558 #line 62 2"parser.yy"5579 #line 625 "parser.yy" 5559 5580 { (yyval.op) = OperKinds::PlusAssn; } 5560 5581 break; … … 5563 5584 5564 5585 /* Line 1806 of yacc.c */ 5565 #line 62 3"parser.yy"5586 #line 626 "parser.yy" 5566 5587 { (yyval.op) = OperKinds::MinusAssn; } 5567 5588 break; … … 5570 5591 5571 5592 /* Line 1806 of yacc.c */ 5572 #line 62 4"parser.yy"5593 #line 627 "parser.yy" 5573 5594 { (yyval.op) = OperKinds::LSAssn; } 5574 5595 break; … … 5577 5598 5578 5599 /* Line 1806 of yacc.c */ 5579 #line 62 5"parser.yy"5600 #line 628 "parser.yy" 5580 5601 { (yyval.op) = OperKinds::RSAssn; } 5581 5602 break; … … 5584 5605 5585 5606 /* Line 1806 of yacc.c */ 5586 #line 62 6"parser.yy"5607 #line 629 "parser.yy" 5587 5608 { (yyval.op) = OperKinds::AndAssn; } 5588 5609 break; … … 5591 5612 5592 5613 /* Line 1806 of yacc.c */ 5593 #line 6 27"parser.yy"5614 #line 630 "parser.yy" 5594 5615 { (yyval.op) = OperKinds::ERAssn; } 5595 5616 break; … … 5598 5619 5599 5620 /* Line 1806 of yacc.c */ 5600 #line 6 28"parser.yy"5621 #line 631 "parser.yy" 5601 5622 { (yyval.op) = OperKinds::OrAssn; } 5602 5623 break; … … 5605 5626 5606 5627 /* Line 1806 of yacc.c */ 5607 #line 63 5"parser.yy"5628 #line 638 "parser.yy" 5608 5629 { (yyval.en) = new ExpressionNode( build_tuple() ); } 5609 5630 break; … … 5612 5633 5613 5634 /* Line 1806 of yacc.c */ 5614 #line 6 37"parser.yy"5635 #line 640 "parser.yy" 5615 5636 { (yyval.en) = new ExpressionNode( build_tuple( (yyvsp[(3) - (5)].en) ) ); } 5616 5637 break; … … 5619 5640 5620 5641 /* Line 1806 of yacc.c */ 5621 #line 6 39"parser.yy"5642 #line 642 "parser.yy" 5622 5643 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( (yyvsp[(4) - (6)].en) ) ) ); } 5623 5644 break; … … 5626 5647 5627 5648 /* Line 1806 of yacc.c */ 5628 #line 64 1"parser.yy"5649 #line 644 "parser.yy" 5629 5650 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_last( (yyvsp[(5) - (7)].en) ) ) ); } 5630 5651 break; … … 5633 5654 5634 5655 /* Line 1806 of yacc.c */ 5635 #line 6 47"parser.yy"5656 #line 650 "parser.yy" 5636 5657 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5637 5658 break; … … 5640 5661 5641 5662 /* Line 1806 of yacc.c */ 5642 #line 65 3"parser.yy"5663 #line 656 "parser.yy" 5643 5664 { (yyval.en) = new ExpressionNode( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5644 5665 break; … … 5647 5668 5648 5669 /* Line 1806 of yacc.c */ 5649 #line 6 58"parser.yy"5670 #line 661 "parser.yy" 5650 5671 { (yyval.en) = 0; } 5651 5672 break; … … 5654 5675 5655 5676 /* Line 1806 of yacc.c */ 5656 #line 6 67"parser.yy"5677 #line 670 "parser.yy" 5657 5678 { (yyval.sn) = (yyvsp[(1) - (1)].sn); } 5658 5679 break; … … 5661 5682 5662 5683 /* Line 1806 of yacc.c */ 5663 #line 67 4"parser.yy"5684 #line 677 "parser.yy" 5664 5685 { 5665 5686 Token fn; … … 5672 5693 5673 5694 /* Line 1806 of yacc.c */ 5674 #line 68 4"parser.yy"5695 #line 687 "parser.yy" 5675 5696 { 5676 5697 (yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) ); … … 5681 5702 5682 5703 /* Line 1806 of yacc.c */ 5683 #line 69 1"parser.yy"5704 #line 694 "parser.yy" 5684 5705 { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); } 5685 5706 break; … … 5688 5709 5689 5710 /* Line 1806 of yacc.c */ 5690 #line 698"parser.yy"5711 #line 701 "parser.yy" 5691 5712 { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); } 5692 5713 break; … … 5695 5716 5696 5717 /* Line 1806 of yacc.c */ 5697 #line 70 4"parser.yy"5718 #line 707 "parser.yy" 5698 5719 { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } } 5699 5720 break; … … 5702 5723 5703 5724 /* Line 1806 of yacc.c */ 5704 #line 7 09"parser.yy"5725 #line 712 "parser.yy" 5705 5726 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5706 5727 break; … … 5709 5730 5710 5731 /* Line 1806 of yacc.c */ 5711 #line 71 1"parser.yy"5732 #line 714 "parser.yy" 5712 5733 { // mark all fields in list 5713 5734 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 5720 5741 5721 5742 /* Line 1806 of yacc.c */ 5722 #line 7 17"parser.yy"5743 #line 720 "parser.yy" 5723 5744 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5724 5745 break; … … 5727 5748 5728 5749 /* Line 1806 of yacc.c */ 5729 #line 72 4"parser.yy"5750 #line 727 "parser.yy" 5730 5751 { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } } 5731 5752 break; … … 5734 5755 5735 5756 /* Line 1806 of yacc.c */ 5736 #line 7 29"parser.yy"5757 #line 732 "parser.yy" 5737 5758 { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); } 5738 5759 break; … … 5741 5762 5742 5763 /* Line 1806 of yacc.c */ 5743 #line 73 5"parser.yy"5764 #line 738 "parser.yy" 5744 5765 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); } 5745 5766 break; … … 5748 5769 5749 5770 /* Line 1806 of yacc.c */ 5750 #line 7 37"parser.yy"5771 #line 740 "parser.yy" 5751 5772 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); } 5752 5773 break; … … 5755 5776 5756 5777 /* Line 1806 of yacc.c */ 5757 #line 7 39"parser.yy"5778 #line 742 "parser.yy" 5758 5779 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5759 5780 break; … … 5762 5783 5763 5784 /* Line 1806 of yacc.c */ 5764 #line 74 1"parser.yy"5785 #line 744 "parser.yy" 5765 5786 { 5766 5787 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5777 5798 5778 5799 /* Line 1806 of yacc.c */ 5779 #line 75 1"parser.yy"5800 #line 754 "parser.yy" 5780 5801 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5781 5802 break; … … 5784 5805 5785 5806 /* Line 1806 of yacc.c */ 5786 #line 75 3"parser.yy"5807 #line 756 "parser.yy" 5787 5808 { 5788 5809 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5794 5815 5795 5816 /* Line 1806 of yacc.c */ 5796 #line 76 3"parser.yy"5817 #line 766 "parser.yy" 5797 5818 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5798 5819 break; … … 5801 5822 5802 5823 /* Line 1806 of yacc.c */ 5803 #line 76 5"parser.yy"5824 #line 768 "parser.yy" 5804 5825 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5805 5826 break; … … 5808 5829 5809 5830 /* Line 1806 of yacc.c */ 5810 #line 77 0"parser.yy"5831 #line 773 "parser.yy" 5811 5832 { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); } 5812 5833 break; … … 5815 5836 5816 5837 /* Line 1806 of yacc.c */ 5817 #line 77 2"parser.yy"5838 #line 775 "parser.yy" 5818 5839 { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); } 5819 5840 break; … … 5822 5843 5823 5844 /* Line 1806 of yacc.c */ 5824 #line 77 6"parser.yy"5845 #line 779 "parser.yy" 5825 5846 { (yyval.sn) = (yyvsp[(2) - (3)].sn); } 5826 5847 break; … … 5829 5850 5830 5851 /* Line 1806 of yacc.c */ 5831 #line 7 77"parser.yy"5852 #line 780 "parser.yy" 5832 5853 { (yyval.sn) = new StatementNode( build_default() ); } 5833 5854 break; … … 5836 5857 5837 5858 /* Line 1806 of yacc.c */ 5838 #line 78 3"parser.yy"5859 #line 786 "parser.yy" 5839 5860 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) )); } 5840 5861 break; … … 5843 5864 5844 5865 /* Line 1806 of yacc.c */ 5845 #line 7 87"parser.yy"5866 #line 790 "parser.yy" 5846 5867 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5847 5868 break; … … 5850 5871 5851 5872 /* Line 1806 of yacc.c */ 5852 #line 79 2"parser.yy"5873 #line 795 "parser.yy" 5853 5874 { (yyval.sn) = 0; } 5854 5875 break; … … 5857 5878 5858 5879 /* Line 1806 of yacc.c */ 5859 #line 798"parser.yy"5880 #line 801 "parser.yy" 5860 5881 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5861 5882 break; … … 5864 5885 5865 5886 /* Line 1806 of yacc.c */ 5866 #line 80 0"parser.yy"5887 #line 803 "parser.yy" 5867 5888 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); } 5868 5889 break; … … 5871 5892 5872 5893 /* Line 1806 of yacc.c */ 5873 #line 80 5"parser.yy"5894 #line 808 "parser.yy" 5874 5895 { (yyval.sn) = 0; } 5875 5896 break; … … 5878 5899 5879 5900 /* Line 1806 of yacc.c */ 5880 #line 81 1"parser.yy"5901 #line 814 "parser.yy" 5881 5902 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); } 5882 5903 break; … … 5885 5906 5886 5907 /* Line 1806 of yacc.c */ 5887 #line 81 3"parser.yy"5908 #line 816 "parser.yy" 5888 5909 { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); } 5889 5910 break; … … 5892 5913 5893 5914 /* Line 1806 of yacc.c */ 5894 #line 81 5"parser.yy"5915 #line 818 "parser.yy" 5895 5916 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); } 5896 5917 break; … … 5899 5920 5900 5921 /* Line 1806 of yacc.c */ 5901 #line 8 17"parser.yy"5922 #line 820 "parser.yy" 5902 5923 { (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) ) ) ) ) ) ); } 5903 5924 break; … … 5906 5927 5907 5928 /* Line 1806 of yacc.c */ 5908 #line 82 2"parser.yy"5929 #line 825 "parser.yy" 5909 5930 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 5910 5931 break; … … 5913 5934 5914 5935 /* Line 1806 of yacc.c */ 5915 #line 8 28"parser.yy"5936 #line 831 "parser.yy" 5916 5937 { (yyval.sn) = 0; } 5917 5938 break; … … 5920 5941 5921 5942 /* Line 1806 of yacc.c */ 5922 #line 83 0"parser.yy"5943 #line 833 "parser.yy" 5923 5944 { (yyval.sn) = 0; } 5924 5945 break; … … 5927 5948 5928 5949 /* Line 1806 of yacc.c */ 5929 #line 83 5"parser.yy"5950 #line 838 "parser.yy" 5930 5951 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5931 5952 break; … … 5934 5955 5935 5956 /* Line 1806 of yacc.c */ 5936 #line 8 37"parser.yy"5957 #line 840 "parser.yy" 5937 5958 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn), true ) ); } 5938 5959 break; … … 5941 5962 5942 5963 /* Line 1806 of yacc.c */ 5943 #line 8 39"parser.yy"5964 #line 842 "parser.yy" 5944 5965 { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); } 5945 5966 break; … … 5948 5969 5949 5970 /* Line 1806 of yacc.c */ 5950 #line 84 4"parser.yy"5971 #line 847 "parser.yy" 5951 5972 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); } 5952 5973 break; … … 5955 5976 5956 5977 /* Line 1806 of yacc.c */ 5957 #line 84 6"parser.yy"5978 #line 849 "parser.yy" 5958 5979 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); } 5959 5980 break; … … 5962 5983 5963 5984 /* Line 1806 of yacc.c */ 5964 #line 85 1"parser.yy"5985 #line 854 "parser.yy" 5965 5986 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); } 5966 5987 break; … … 5969 5990 5970 5991 /* Line 1806 of yacc.c */ 5971 #line 85 5"parser.yy"5992 #line 858 "parser.yy" 5972 5993 { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); } 5973 5994 break; … … 5976 5997 5977 5998 /* Line 1806 of yacc.c */ 5978 #line 8 58"parser.yy"5999 #line 861 "parser.yy" 5979 6000 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Continue ) ); } 5980 6001 break; … … 5983 6004 5984 6005 /* Line 1806 of yacc.c */ 5985 #line 86 2"parser.yy"6006 #line 865 "parser.yy" 5986 6007 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); } 5987 6008 break; … … 5990 6011 5991 6012 /* Line 1806 of yacc.c */ 5992 #line 86 5"parser.yy"6013 #line 868 "parser.yy" 5993 6014 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 5994 6015 break; … … 5997 6018 5998 6019 /* Line 1806 of yacc.c */ 5999 #line 8 69"parser.yy"6020 #line 872 "parser.yy" 6000 6021 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); } 6001 6022 break; … … 6004 6025 6005 6026 /* Line 1806 of yacc.c */ 6006 #line 87 1"parser.yy"6027 #line 874 "parser.yy" 6007 6028 { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); } 6008 6029 break; … … 6011 6032 6012 6033 /* Line 1806 of yacc.c */ 6013 #line 87 3"parser.yy"6034 #line 876 "parser.yy" 6014 6035 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 6015 6036 break; … … 6018 6039 6019 6040 /* Line 1806 of yacc.c */ 6020 #line 87 5"parser.yy"6041 #line 878 "parser.yy" 6021 6042 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 6022 6043 break; … … 6025 6046 6026 6047 /* Line 1806 of yacc.c */ 6027 #line 8 77"parser.yy"6048 #line 880 "parser.yy" 6028 6049 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); } 6029 6050 break; … … 6032 6053 6033 6054 /* Line 1806 of yacc.c */ 6034 #line 88 2"parser.yy"6055 #line 885 "parser.yy" 6035 6056 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); } 6036 6057 break; … … 6039 6060 6040 6061 /* Line 1806 of yacc.c */ 6041 #line 88 4"parser.yy"6062 #line 887 "parser.yy" 6042 6063 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); } 6043 6064 break; … … 6046 6067 6047 6068 /* Line 1806 of yacc.c */ 6048 #line 88 6"parser.yy"6069 #line 889 "parser.yy" 6049 6070 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); } 6050 6071 break; … … 6053 6074 6054 6075 /* Line 1806 of yacc.c */ 6055 #line 89 3"parser.yy"6076 #line 896 "parser.yy" 6056 6077 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 6057 6078 break; … … 6060 6081 6061 6082 /* Line 1806 of yacc.c */ 6062 #line 89 5"parser.yy"6083 #line 898 "parser.yy" 6063 6084 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 6064 6085 break; … … 6067 6088 6068 6089 /* Line 1806 of yacc.c */ 6069 #line 897"parser.yy"6090 #line 900 "parser.yy" 6070 6091 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 6071 6092 break; … … 6074 6095 6075 6096 /* Line 1806 of yacc.c */ 6076 #line 899"parser.yy"6097 #line 902 "parser.yy" 6077 6098 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 6078 6099 break; … … 6081 6102 6082 6103 /* Line 1806 of yacc.c */ 6083 #line 90 4"parser.yy"6104 #line 907 "parser.yy" 6084 6105 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6085 6106 break; … … 6088 6109 6089 6110 /* Line 1806 of yacc.c */ 6090 #line 90 6"parser.yy"6111 #line 909 "parser.yy" 6091 6112 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6092 6113 break; … … 6095 6116 6096 6117 /* Line 1806 of yacc.c */ 6097 #line 9 08"parser.yy"6118 #line 911 "parser.yy" 6098 6119 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6099 6120 break; … … 6102 6123 6103 6124 /* Line 1806 of yacc.c */ 6104 #line 91 0"parser.yy"6125 #line 913 "parser.yy" 6105 6126 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6106 6127 break; … … 6109 6130 6110 6131 /* Line 1806 of yacc.c */ 6111 #line 91 5"parser.yy"6132 #line 918 "parser.yy" 6112 6133 { 6113 6134 (yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) ); … … 6118 6139 6119 6140 /* Line 1806 of yacc.c */ 6120 #line 9 28"parser.yy"6141 #line 931 "parser.yy" 6121 6142 { 6122 6143 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6128 6149 6129 6150 /* Line 1806 of yacc.c */ 6130 #line 93 3"parser.yy"6151 #line 936 "parser.yy" 6131 6152 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 6132 6153 break; … … 6135 6156 6136 6157 /* Line 1806 of yacc.c */ 6137 #line 93 5"parser.yy"6158 #line 938 "parser.yy" 6138 6159 { 6139 6160 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6145 6166 6146 6167 /* Line 1806 of yacc.c */ 6147 #line 94 4"parser.yy"6168 #line 947 "parser.yy" 6148 6169 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); } 6149 6170 break; … … 6152 6173 6153 6174 /* Line 1806 of yacc.c */ 6154 #line 94 6"parser.yy"6175 #line 949 "parser.yy" 6155 6176 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); } 6156 6177 break; … … 6159 6180 6160 6181 /* Line 1806 of yacc.c */ 6161 #line 9 48"parser.yy"6182 #line 951 "parser.yy" 6162 6183 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); } 6163 6184 break; … … 6166 6187 6167 6188 /* Line 1806 of yacc.c */ 6168 #line 95 0"parser.yy"6189 #line 953 "parser.yy" 6169 6190 { (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) ) ); } 6170 6191 break; … … 6173 6194 6174 6195 /* Line 1806 of yacc.c */ 6175 #line 95 2"parser.yy"6196 #line 955 "parser.yy" 6176 6197 { (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) ) ); } 6177 6198 break; … … 6180 6201 6181 6202 /* Line 1806 of yacc.c */ 6182 #line 9 57"parser.yy"6203 #line 960 "parser.yy" 6183 6204 { (yyval.flag) = false; } 6184 6205 break; … … 6187 6208 6188 6209 /* Line 1806 of yacc.c */ 6189 #line 9 59"parser.yy"6210 #line 962 "parser.yy" 6190 6211 { (yyval.flag) = true; } 6191 6212 break; … … 6194 6215 6195 6216 /* Line 1806 of yacc.c */ 6196 #line 96 4"parser.yy"6217 #line 967 "parser.yy" 6197 6218 { (yyval.en) = 0; } 6198 6219 break; … … 6201 6222 6202 6223 /* Line 1806 of yacc.c */ 6203 #line 97 1"parser.yy"6224 #line 974 "parser.yy" 6204 6225 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 6205 6226 break; … … 6208 6229 6209 6230 /* Line 1806 of yacc.c */ 6210 #line 97 6"parser.yy"6231 #line 979 "parser.yy" 6211 6232 { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); } 6212 6233 break; … … 6215 6236 6216 6237 /* Line 1806 of yacc.c */ 6217 #line 9 78"parser.yy"6238 #line 981 "parser.yy" 6218 6239 { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); } 6219 6240 break; … … 6222 6243 6223 6244 /* Line 1806 of yacc.c */ 6224 #line 98 3"parser.yy"6245 #line 986 "parser.yy" 6225 6246 { (yyval.en) = 0; } 6226 6247 break; … … 6229 6250 6230 6251 /* Line 1806 of yacc.c */ 6231 #line 98 5"parser.yy"6252 #line 988 "parser.yy" 6232 6253 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 6233 6254 break; … … 6236 6257 6237 6258 /* Line 1806 of yacc.c */ 6238 #line 9 87"parser.yy"6259 #line 990 "parser.yy" 6239 6260 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( (yyvsp[(3) - (3)].constant) ) ); } 6240 6261 break; … … 6243 6264 6244 6265 /* Line 1806 of yacc.c */ 6245 #line 99 2"parser.yy"6266 #line 995 "parser.yy" 6246 6267 { 6247 6268 (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) ); … … 6253 6274 6254 6275 /* Line 1806 of yacc.c */ 6255 #line 997"parser.yy"6276 #line 1000 "parser.yy" 6256 6277 { 6257 6278 (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) ); … … 6263 6284 6264 6285 /* Line 1806 of yacc.c */ 6265 #line 10 07"parser.yy"6286 #line 1010 "parser.yy" 6266 6287 { (yyval.decl) = 0; } 6267 6288 break; … … 6270 6291 6271 6292 /* Line 1806 of yacc.c */ 6272 #line 101 4"parser.yy"6293 #line 1017 "parser.yy" 6273 6294 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6274 6295 break; … … 6277 6298 6278 6299 /* Line 1806 of yacc.c */ 6279 #line 10 19"parser.yy"6300 #line 1022 "parser.yy" 6280 6301 { (yyval.decl) = 0; } 6281 6302 break; … … 6284 6305 6285 6306 /* Line 1806 of yacc.c */ 6286 #line 102 6"parser.yy"6307 #line 1029 "parser.yy" 6287 6308 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6288 6309 break; … … 6291 6312 6292 6313 /* Line 1806 of yacc.c */ 6293 #line 104 0"parser.yy"6314 #line 1043 "parser.yy" 6294 6315 {} 6295 6316 break; … … 6298 6319 6299 6320 /* Line 1806 of yacc.c */ 6300 #line 104 1"parser.yy"6321 #line 1044 "parser.yy" 6301 6322 {} 6302 6323 break; … … 6305 6326 6306 6327 /* Line 1806 of yacc.c */ 6307 #line 107 0"parser.yy"6328 #line 1073 "parser.yy" 6308 6329 { 6309 6330 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6315 6336 6316 6337 /* Line 1806 of yacc.c */ 6317 #line 10 77"parser.yy"6338 #line 1080 "parser.yy" 6318 6339 { 6319 6340 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6325 6346 6326 6347 /* Line 1806 of yacc.c */ 6327 #line 108 2"parser.yy"6348 #line 1085 "parser.yy" 6328 6349 { 6329 6350 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID ); … … 6335 6356 6336 6357 /* Line 1806 of yacc.c */ 6337 #line 109 2"parser.yy"6358 #line 1095 "parser.yy" 6338 6359 { 6339 6360 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6345 6366 6346 6367 /* Line 1806 of yacc.c */ 6347 #line 1 097"parser.yy"6368 #line 1100 "parser.yy" 6348 6369 { 6349 6370 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6355 6376 6356 6377 /* Line 1806 of yacc.c */ 6357 #line 110 2"parser.yy"6378 #line 1105 "parser.yy" 6358 6379 { 6359 6380 typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) ); … … 6365 6386 6366 6387 /* Line 1806 of yacc.c */ 6367 #line 111 0"parser.yy"6388 #line 1113 "parser.yy" 6368 6389 { 6369 6390 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6375 6396 6376 6397 /* Line 1806 of yacc.c */ 6377 #line 111 5"parser.yy"6398 #line 1118 "parser.yy" 6378 6399 { 6379 6400 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6385 6406 6386 6407 /* Line 1806 of yacc.c */ 6387 #line 112 0"parser.yy"6408 #line 1123 "parser.yy" 6388 6409 { 6389 6410 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6395 6416 6396 6417 /* Line 1806 of yacc.c */ 6397 #line 112 5"parser.yy"6418 #line 1128 "parser.yy" 6398 6419 { 6399 6420 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6405 6426 6406 6427 /* Line 1806 of yacc.c */ 6407 #line 113 0"parser.yy"6428 #line 1133 "parser.yy" 6408 6429 { 6409 6430 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 6415 6436 6416 6437 /* Line 1806 of yacc.c */ 6417 #line 11 38"parser.yy"6438 #line 1141 "parser.yy" 6418 6439 { 6419 6440 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true ); … … 6424 6445 6425 6446 /* Line 1806 of yacc.c */ 6426 #line 116 1"parser.yy"6447 #line 1164 "parser.yy" 6427 6448 { 6428 6449 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6433 6454 6434 6455 /* Line 1806 of yacc.c */ 6435 #line 116 5"parser.yy"6456 #line 1168 "parser.yy" 6436 6457 { 6437 6458 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6442 6463 6443 6464 /* Line 1806 of yacc.c */ 6444 #line 117 2"parser.yy"6465 #line 1175 "parser.yy" 6445 6466 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 6446 6467 break; … … 6449 6470 6450 6471 /* Line 1806 of yacc.c */ 6451 #line 117 6"parser.yy"6472 #line 1179 "parser.yy" 6452 6473 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); } 6453 6474 break; … … 6456 6477 6457 6478 /* Line 1806 of yacc.c */ 6458 #line 118 1"parser.yy"6479 #line 1184 "parser.yy" 6459 6480 { 6460 6481 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6466 6487 6467 6488 /* Line 1806 of yacc.c */ 6468 #line 118 6"parser.yy"6489 #line 1189 "parser.yy" 6469 6490 { 6470 6491 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6476 6497 6477 6498 /* Line 1806 of yacc.c */ 6478 #line 119 1"parser.yy"6499 #line 1194 "parser.yy" 6479 6500 { 6480 6501 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD ); … … 6486 6507 6487 6508 /* Line 1806 of yacc.c */ 6488 #line 120 2"parser.yy"6509 #line 1205 "parser.yy" 6489 6510 { 6490 6511 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6496 6517 6497 6518 /* Line 1806 of yacc.c */ 6498 #line 12 07"parser.yy"6519 #line 1210 "parser.yy" 6499 6520 { 6500 6521 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6506 6527 6507 6528 /* Line 1806 of yacc.c */ 6508 #line 121 2"parser.yy"6529 #line 1215 "parser.yy" 6509 6530 { 6510 6531 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6516 6537 6517 6538 /* Line 1806 of yacc.c */ 6518 #line 12 17"parser.yy"6539 #line 1220 "parser.yy" 6519 6540 { 6520 6541 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6526 6547 6527 6548 /* Line 1806 of yacc.c */ 6528 #line 122 2"parser.yy"6549 #line 1225 "parser.yy" 6529 6550 { 6530 6551 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6536 6557 6537 6558 /* Line 1806 of yacc.c */ 6538 #line 123 1"parser.yy"6559 #line 1234 "parser.yy" 6539 6560 { 6540 6561 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD ); … … 6546 6567 6547 6568 /* Line 1806 of yacc.c */ 6548 #line 123 6"parser.yy"6569 #line 1239 "parser.yy" 6549 6570 { 6550 6571 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD ); … … 6556 6577 6557 6578 /* Line 1806 of yacc.c */ 6558 #line 125 3"parser.yy"6579 #line 1256 "parser.yy" 6559 6580 { 6560 6581 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6566 6587 6567 6588 /* Line 1806 of yacc.c */ 6568 #line 12 58"parser.yy"6589 #line 1261 "parser.yy" 6569 6590 { 6570 6591 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6576 6597 6577 6598 /* Line 1806 of yacc.c */ 6578 #line 128 0"parser.yy"6599 #line 1283 "parser.yy" 6579 6600 { (yyval.decl) = 0; } 6580 6601 break; … … 6583 6604 6584 6605 /* Line 1806 of yacc.c */ 6585 #line 129 2"parser.yy"6606 #line 1295 "parser.yy" 6586 6607 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6587 6608 break; … … 6590 6611 6591 6612 /* Line 1806 of yacc.c */ 6592 #line 130 3"parser.yy"6613 #line 1306 "parser.yy" 6593 6614 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); } 6594 6615 break; … … 6597 6618 6598 6619 /* Line 1806 of yacc.c */ 6599 #line 130 5"parser.yy"6620 #line 1308 "parser.yy" 6600 6621 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); } 6601 6622 break; … … 6604 6625 6605 6626 /* Line 1806 of yacc.c */ 6606 #line 13 07"parser.yy"6627 #line 1310 "parser.yy" 6607 6628 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); } 6608 6629 break; … … 6611 6632 6612 6633 /* Line 1806 of yacc.c */ 6613 #line 13 09"parser.yy"6634 #line 1312 "parser.yy" 6614 6635 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); } 6615 6636 break; … … 6618 6639 6619 6640 /* Line 1806 of yacc.c */ 6620 #line 131 1"parser.yy"6641 #line 1314 "parser.yy" 6621 6642 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); } 6622 6643 break; … … 6625 6646 6626 6647 /* Line 1806 of yacc.c */ 6627 #line 131 3"parser.yy"6648 #line 1316 "parser.yy" 6628 6649 { 6629 6650 typedefTable.enterScope(); … … 6634 6655 6635 6656 /* Line 1806 of yacc.c */ 6636 #line 13 17"parser.yy"6657 #line 1320 "parser.yy" 6637 6658 { 6638 6659 typedefTable.leaveScope(); … … 6644 6665 6645 6666 /* Line 1806 of yacc.c */ 6646 #line 132 6"parser.yy"6667 #line 1329 "parser.yy" 6647 6668 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6648 6669 break; … … 6651 6672 6652 6673 /* Line 1806 of yacc.c */ 6653 #line 13 28"parser.yy"6674 #line 1331 "parser.yy" 6654 6675 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6655 6676 break; … … 6658 6679 6659 6680 /* Line 1806 of yacc.c */ 6660 #line 13 39"parser.yy"6681 #line 1342 "parser.yy" 6661 6682 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6662 6683 break; … … 6665 6686 6666 6687 /* Line 1806 of yacc.c */ 6667 #line 134 4"parser.yy"6688 #line 1347 "parser.yy" 6668 6689 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); } 6669 6690 break; … … 6672 6693 6673 6694 /* Line 1806 of yacc.c */ 6674 #line 134 6"parser.yy"6695 #line 1349 "parser.yy" 6675 6696 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); } 6676 6697 break; … … 6679 6700 6680 6701 /* Line 1806 of yacc.c */ 6681 #line 13 48"parser.yy"6702 #line 1351 "parser.yy" 6682 6703 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); } 6683 6704 break; … … 6686 6707 6687 6708 /* Line 1806 of yacc.c */ 6688 #line 135 0"parser.yy"6709 #line 1353 "parser.yy" 6689 6710 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); } 6690 6711 break; … … 6693 6714 6694 6715 /* Line 1806 of yacc.c */ 6695 #line 135 3"parser.yy"6716 #line 1356 "parser.yy" 6696 6717 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isInline = true; } 6697 6718 break; … … 6700 6721 6701 6722 /* Line 1806 of yacc.c */ 6702 #line 135 5"parser.yy"6723 #line 1358 "parser.yy" 6703 6724 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); } 6704 6725 break; … … 6707 6728 6708 6729 /* Line 1806 of yacc.c */ 6709 #line 13 58"parser.yy"6730 #line 1361 "parser.yy" 6710 6731 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isNoreturn = true; } 6711 6732 break; … … 6714 6735 6715 6736 /* Line 1806 of yacc.c */ 6716 #line 136 0"parser.yy"6737 #line 1363 "parser.yy" 6717 6738 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); } 6718 6739 break; … … 6721 6742 6722 6743 /* Line 1806 of yacc.c */ 6723 #line 136 5"parser.yy"6744 #line 1368 "parser.yy" 6724 6745 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); } 6725 6746 break; … … 6728 6749 6729 6750 /* Line 1806 of yacc.c */ 6730 #line 13 67"parser.yy"6751 #line 1370 "parser.yy" 6731 6752 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); } 6732 6753 break; … … 6735 6756 6736 6757 /* Line 1806 of yacc.c */ 6737 #line 13 69"parser.yy"6758 #line 1372 "parser.yy" 6738 6759 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); } 6739 6760 break; … … 6742 6763 6743 6764 /* Line 1806 of yacc.c */ 6744 #line 137 1"parser.yy"6765 #line 1374 "parser.yy" 6745 6766 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); } 6746 6767 break; … … 6749 6770 6750 6771 /* Line 1806 of yacc.c */ 6751 #line 137 3"parser.yy"6772 #line 1376 "parser.yy" 6752 6773 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Long ); } 6753 6774 break; … … 6756 6777 6757 6778 /* Line 1806 of yacc.c */ 6758 #line 137 5"parser.yy"6779 #line 1378 "parser.yy" 6759 6780 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Short ); } 6760 6781 break; … … 6763 6784 6764 6785 /* Line 1806 of yacc.c */ 6765 #line 13 77"parser.yy"6786 #line 1380 "parser.yy" 6766 6787 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Signed ); } 6767 6788 break; … … 6770 6791 6771 6792 /* Line 1806 of yacc.c */ 6772 #line 13 79"parser.yy"6793 #line 1382 "parser.yy" 6773 6794 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Unsigned ); } 6774 6795 break; … … 6777 6798 6778 6799 /* Line 1806 of yacc.c */ 6779 #line 138 1"parser.yy"6800 #line 1384 "parser.yy" 6780 6801 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); } 6781 6802 break; … … 6784 6805 6785 6806 /* Line 1806 of yacc.c */ 6786 #line 138 3"parser.yy"6807 #line 1386 "parser.yy" 6787 6808 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); } 6788 6809 break; … … 6791 6812 6792 6813 /* Line 1806 of yacc.c */ 6793 #line 138 5"parser.yy"6814 #line 1388 "parser.yy" 6794 6815 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Complex ); } 6795 6816 break; … … 6798 6819 6799 6820 /* Line 1806 of yacc.c */ 6800 #line 13 87"parser.yy"6821 #line 1390 "parser.yy" 6801 6822 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); } 6802 6823 break; … … 6805 6826 6806 6827 /* Line 1806 of yacc.c */ 6807 #line 13 89"parser.yy"6828 #line 1392 "parser.yy" 6808 6829 { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); } 6809 6830 break; … … 6812 6833 6813 6834 /* Line 1806 of yacc.c */ 6814 #line 139 6"parser.yy"6835 #line 1399 "parser.yy" 6815 6836 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6816 6837 break; … … 6819 6840 6820 6841 /* Line 1806 of yacc.c */ 6821 #line 1 398"parser.yy"6842 #line 1401 "parser.yy" 6822 6843 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6823 6844 break; … … 6826 6847 6827 6848 /* Line 1806 of yacc.c */ 6828 #line 140 0"parser.yy"6849 #line 1403 "parser.yy" 6829 6850 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6830 6851 break; … … 6833 6854 6834 6855 /* Line 1806 of yacc.c */ 6835 #line 140 2"parser.yy"6856 #line 1405 "parser.yy" 6836 6857 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); } 6837 6858 break; … … 6840 6861 6841 6862 /* Line 1806 of yacc.c */ 6842 #line 14 08"parser.yy"6863 #line 1411 "parser.yy" 6843 6864 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6844 6865 break; … … 6847 6868 6848 6869 /* Line 1806 of yacc.c */ 6849 #line 141 5"parser.yy"6870 #line 1418 "parser.yy" 6850 6871 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6851 6872 break; … … 6854 6875 6855 6876 /* Line 1806 of yacc.c */ 6856 #line 14 17"parser.yy"6877 #line 1420 "parser.yy" 6857 6878 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6858 6879 break; … … 6861 6882 6862 6883 /* Line 1806 of yacc.c */ 6863 #line 14 19"parser.yy"6884 #line 1422 "parser.yy" 6864 6885 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); } 6865 6886 break; … … 6868 6889 6869 6890 /* Line 1806 of yacc.c */ 6870 #line 142 4"parser.yy"6891 #line 1427 "parser.yy" 6871 6892 { (yyval.decl) = (yyvsp[(3) - (4)].decl); } 6872 6893 break; … … 6875 6896 6876 6897 /* Line 1806 of yacc.c */ 6877 #line 142 6"parser.yy"6898 #line 1429 "parser.yy" 6878 6899 { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); } 6879 6900 break; … … 6882 6903 6883 6904 /* Line 1806 of yacc.c */ 6884 #line 14 28"parser.yy"6905 #line 1431 "parser.yy" 6885 6906 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); } 6886 6907 break; … … 6889 6910 6890 6911 /* Line 1806 of yacc.c */ 6891 #line 143 0"parser.yy"6912 #line 1433 "parser.yy" 6892 6913 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 6893 6914 break; … … 6896 6917 6897 6918 /* Line 1806 of yacc.c */ 6898 #line 143 6"parser.yy"6919 #line 1439 "parser.yy" 6899 6920 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6900 6921 break; … … 6903 6924 6904 6925 /* Line 1806 of yacc.c */ 6905 #line 14 38"parser.yy"6926 #line 1441 "parser.yy" 6906 6927 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6907 6928 break; … … 6910 6931 6911 6932 /* Line 1806 of yacc.c */ 6912 #line 144 0"parser.yy"6933 #line 1443 "parser.yy" 6913 6934 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6914 6935 break; … … 6917 6938 6918 6939 /* Line 1806 of yacc.c */ 6919 #line 144 6"parser.yy"6940 #line 1449 "parser.yy" 6920 6941 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6921 6942 break; … … 6924 6945 6925 6946 /* Line 1806 of yacc.c */ 6926 #line 14 48"parser.yy"6947 #line 1451 "parser.yy" 6927 6948 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6928 6949 break; … … 6931 6952 6932 6953 /* Line 1806 of yacc.c */ 6933 #line 145 4"parser.yy"6954 #line 1457 "parser.yy" 6934 6955 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6935 6956 break; … … 6938 6959 6939 6960 /* Line 1806 of yacc.c */ 6940 #line 145 6"parser.yy"6961 #line 1459 "parser.yy" 6941 6962 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6942 6963 break; … … 6945 6966 6946 6967 /* Line 1806 of yacc.c */ 6947 #line 14 58"parser.yy"6968 #line 1461 "parser.yy" 6948 6969 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6949 6970 break; … … 6952 6973 6953 6974 /* Line 1806 of yacc.c */ 6954 #line 146 3"parser.yy"6975 #line 1466 "parser.yy" 6955 6976 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); } 6956 6977 break; … … 6959 6980 6960 6981 /* Line 1806 of yacc.c */ 6961 #line 146 5"parser.yy"6982 #line 1468 "parser.yy" 6962 6983 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6963 6984 break; … … 6966 6987 6967 6988 /* Line 1806 of yacc.c */ 6968 #line 14 67"parser.yy"6989 #line 1470 "parser.yy" 6969 6990 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6970 6991 break; … … 6973 6994 6974 6995 /* Line 1806 of yacc.c */ 6975 #line 14 77"parser.yy"6996 #line 1480 "parser.yy" 6976 6997 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), nullptr, nullptr, (yyvsp[(3) - (4)].decl), true ); } 6977 6998 break; … … 6980 7001 6981 7002 /* Line 1806 of yacc.c */ 6982 #line 14 79"parser.yy"7003 #line 1482 "parser.yy" 6983 7004 { 6984 7005 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 6990 7011 6991 7012 /* Line 1806 of yacc.c */ 6992 #line 148 4"parser.yy"7013 #line 1487 "parser.yy" 6993 7014 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 6994 7015 break; … … 6997 7018 6998 7019 /* Line 1806 of yacc.c */ 6999 #line 148 6"parser.yy"7020 #line 1489 "parser.yy" 7000 7021 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), nullptr, (yyvsp[(5) - (6)].decl), true ); } 7001 7022 break; … … 7004 7025 7005 7026 /* Line 1806 of yacc.c */ 7006 #line 14 88"parser.yy"7027 #line 1491 "parser.yy" 7007 7028 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), nullptr, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); } 7008 7029 break; … … 7011 7032 7012 7033 /* Line 1806 of yacc.c */ 7013 #line 149 0"parser.yy"7034 #line 1493 "parser.yy" 7014 7035 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7015 7036 break; … … 7018 7039 7019 7040 /* Line 1806 of yacc.c */ 7020 #line 149 5"parser.yy"7041 #line 1498 "parser.yy" 7021 7042 { (yyval.aggKey) = DeclarationNode::Struct; } 7022 7043 break; … … 7025 7046 7026 7047 /* Line 1806 of yacc.c */ 7027 #line 1 497"parser.yy"7048 #line 1500 "parser.yy" 7028 7049 { (yyval.aggKey) = DeclarationNode::Union; } 7029 7050 break; … … 7032 7053 7033 7054 /* Line 1806 of yacc.c */ 7034 #line 150 2"parser.yy"7055 #line 1505 "parser.yy" 7035 7056 { (yyval.decl) = 0; } 7036 7057 break; … … 7039 7060 7040 7061 /* Line 1806 of yacc.c */ 7041 #line 150 4"parser.yy"7062 #line 1507 "parser.yy" 7042 7063 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7043 7064 break; … … 7046 7067 7047 7068 /* Line 1806 of yacc.c */ 7048 #line 151 0"parser.yy"7069 #line 1513 "parser.yy" 7049 7070 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); } 7050 7071 break; … … 7053 7074 7054 7075 /* Line 1806 of yacc.c */ 7055 #line 151 3"parser.yy"7076 #line 1516 "parser.yy" 7056 7077 { // mark all fields in list 7057 7078 for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7064 7085 7065 7086 /* Line 1806 of yacc.c */ 7066 #line 152 3"parser.yy"7087 #line 1526 "parser.yy" 7067 7088 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); } 7068 7089 break; … … 7071 7092 7072 7093 /* Line 1806 of yacc.c */ 7073 #line 152 5"parser.yy"7094 #line 1528 "parser.yy" 7074 7095 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); } 7075 7096 break; … … 7078 7099 7079 7100 /* Line 1806 of yacc.c */ 7080 #line 15 27"parser.yy"7101 #line 1530 "parser.yy" 7081 7102 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); } 7082 7103 break; … … 7085 7106 7086 7107 /* Line 1806 of yacc.c */ 7087 #line 153 2"parser.yy"7108 #line 1535 "parser.yy" 7088 7109 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7089 7110 break; … … 7092 7113 7093 7114 /* Line 1806 of yacc.c */ 7094 #line 153 4"parser.yy"7115 #line 1537 "parser.yy" 7095 7116 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); } 7096 7117 break; … … 7099 7120 7100 7121 /* Line 1806 of yacc.c */ 7101 #line 15 39"parser.yy"7122 #line 1542 "parser.yy" 7102 7123 { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ } 7103 7124 break; … … 7106 7127 7107 7128 /* Line 1806 of yacc.c */ 7108 #line 154 1"parser.yy"7129 #line 1544 "parser.yy" 7109 7130 { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); } 7110 7131 break; 7111 7132 7112 7133 case 388: 7113 7114 /* Line 1806 of yacc.c */7115 #line 1544 "parser.yy"7116 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }7117 break;7118 7119 case 389:7120 7134 7121 7135 /* Line 1806 of yacc.c */ … … 7124 7138 break; 7125 7139 7140 case 389: 7141 7142 /* Line 1806 of yacc.c */ 7143 #line 1550 "parser.yy" 7144 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); } 7145 break; 7146 7126 7147 case 391: 7127 7148 7128 7149 /* Line 1806 of yacc.c */ 7129 #line 155 3"parser.yy"7150 #line 1556 "parser.yy" 7130 7151 { (yyval.en) = 0; } 7131 7152 break; … … 7134 7155 7135 7156 /* Line 1806 of yacc.c */ 7136 #line 155 5"parser.yy"7157 #line 1558 "parser.yy" 7137 7158 { (yyval.en) = (yyvsp[(1) - (1)].en); } 7138 7159 break; … … 7141 7162 7142 7163 /* Line 1806 of yacc.c */ 7143 #line 156 0"parser.yy"7164 #line 1563 "parser.yy" 7144 7165 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7145 7166 break; … … 7148 7169 7149 7170 /* Line 1806 of yacc.c */ 7150 #line 15 69"parser.yy"7171 #line 1572 "parser.yy" 7151 7172 { (yyval.decl) = DeclarationNode::newEnum( nullptr, (yyvsp[(3) - (5)].decl) ); } 7152 7173 break; … … 7155 7176 7156 7177 /* Line 1806 of yacc.c */ 7157 #line 157 1"parser.yy"7178 #line 1574 "parser.yy" 7158 7179 { 7159 7180 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 7165 7186 7166 7187 /* Line 1806 of yacc.c */ 7167 #line 157 6"parser.yy"7188 #line 1579 "parser.yy" 7168 7189 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 7169 7190 break; … … 7172 7193 7173 7194 /* Line 1806 of yacc.c */ 7174 #line 15 78"parser.yy"7195 #line 1581 "parser.yy" 7175 7196 { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); } 7176 7197 break; … … 7179 7200 7180 7201 /* Line 1806 of yacc.c */ 7181 #line 158 3"parser.yy"7202 #line 1586 "parser.yy" 7182 7203 { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); } 7183 7204 break; … … 7186 7207 7187 7208 /* Line 1806 of yacc.c */ 7188 #line 158 5"parser.yy"7209 #line 1588 "parser.yy" 7189 7210 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); } 7190 7211 break; … … 7193 7214 7194 7215 /* Line 1806 of yacc.c */ 7195 #line 159 0"parser.yy"7216 #line 1593 "parser.yy" 7196 7217 { (yyval.en) = 0; } 7197 7218 break; … … 7200 7221 7201 7222 /* Line 1806 of yacc.c */ 7202 #line 159 2"parser.yy"7223 #line 1595 "parser.yy" 7203 7224 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7204 7225 break; … … 7207 7228 7208 7229 /* Line 1806 of yacc.c */ 7209 #line 1 599"parser.yy"7230 #line 1602 "parser.yy" 7210 7231 { (yyval.decl) = 0; } 7211 7232 break; … … 7214 7235 7215 7236 /* Line 1806 of yacc.c */ 7216 #line 16 07"parser.yy"7237 #line 1610 "parser.yy" 7217 7238 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7218 7239 break; … … 7221 7242 7222 7243 /* Line 1806 of yacc.c */ 7223 #line 16 09"parser.yy"7244 #line 1612 "parser.yy" 7224 7245 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7225 7246 break; … … 7228 7249 7229 7250 /* Line 1806 of yacc.c */ 7230 #line 161 1"parser.yy"7251 #line 1614 "parser.yy" 7231 7252 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7232 7253 break; … … 7235 7256 7236 7257 /* Line 1806 of yacc.c */ 7237 #line 16 19"parser.yy"7258 #line 1622 "parser.yy" 7238 7259 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7239 7260 break; … … 7242 7263 7243 7264 /* Line 1806 of yacc.c */ 7244 #line 162 1"parser.yy"7265 #line 1624 "parser.yy" 7245 7266 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7246 7267 break; … … 7249 7270 7250 7271 /* Line 1806 of yacc.c */ 7251 #line 162 3"parser.yy"7272 #line 1626 "parser.yy" 7252 7273 { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); } 7253 7274 break; … … 7256 7277 7257 7278 /* Line 1806 of yacc.c */ 7258 #line 16 29"parser.yy"7279 #line 1632 "parser.yy" 7259 7280 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7260 7281 break; … … 7263 7284 7264 7285 /* Line 1806 of yacc.c */ 7265 #line 163 4"parser.yy"7286 #line 1637 "parser.yy" 7266 7287 { (yyval.decl) = 0; } 7267 7288 break; … … 7270 7291 7271 7292 /* Line 1806 of yacc.c */ 7272 #line 164 1"parser.yy"7293 #line 1644 "parser.yy" 7273 7294 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7274 7295 break; … … 7277 7298 7278 7299 /* Line 1806 of yacc.c */ 7279 #line 16 48"parser.yy"7300 #line 1651 "parser.yy" 7280 7301 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7281 7302 break; … … 7284 7305 7285 7306 /* Line 1806 of yacc.c */ 7286 #line 165 0"parser.yy"7307 #line 1653 "parser.yy" 7287 7308 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7288 7309 break; 7289 7310 7290 7311 case 425: 7291 7292 /* Line 1806 of yacc.c */7293 #line 1659 "parser.yy"7294 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }7295 break;7296 7297 case 426:7298 7312 7299 7313 /* Line 1806 of yacc.c */ … … 7302 7316 break; 7303 7317 7318 case 426: 7319 7320 /* Line 1806 of yacc.c */ 7321 #line 1665 "parser.yy" 7322 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); } 7323 break; 7324 7304 7325 case 427: 7305 7326 7306 7327 /* Line 1806 of yacc.c */ 7307 #line 166 4"parser.yy"7328 #line 1667 "parser.yy" 7308 7329 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); } 7309 7330 break; … … 7312 7333 7313 7334 /* Line 1806 of yacc.c */ 7314 #line 167 4"parser.yy"7335 #line 1677 "parser.yy" 7315 7336 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7316 7337 break; … … 7319 7340 7320 7341 /* Line 1806 of yacc.c */ 7321 #line 168 0"parser.yy"7342 #line 1683 "parser.yy" 7322 7343 { 7323 7344 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7329 7350 7330 7351 /* Line 1806 of yacc.c */ 7331 #line 168 5"parser.yy"7352 #line 1688 "parser.yy" 7332 7353 { 7333 7354 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7339 7360 7340 7361 /* Line 1806 of yacc.c */ 7341 #line 169 4"parser.yy"7362 #line 1697 "parser.yy" 7342 7363 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7343 7364 break; … … 7346 7367 7347 7368 /* Line 1806 of yacc.c */ 7348 #line 170 3"parser.yy"7369 #line 1706 "parser.yy" 7349 7370 { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); } 7350 7371 break; … … 7353 7374 7354 7375 /* Line 1806 of yacc.c */ 7355 #line 170 5"parser.yy"7376 #line 1708 "parser.yy" 7356 7377 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); } 7357 7378 break; … … 7360 7381 7361 7382 /* Line 1806 of yacc.c */ 7362 #line 173 0"parser.yy"7383 #line 1733 "parser.yy" 7363 7384 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7364 7385 break; … … 7367 7388 7368 7389 /* Line 1806 of yacc.c */ 7369 #line 17 38"parser.yy"7390 #line 1741 "parser.yy" 7370 7391 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7371 7392 break; … … 7374 7395 7375 7396 /* Line 1806 of yacc.c */ 7376 #line 174 3"parser.yy"7397 #line 1746 "parser.yy" 7377 7398 { (yyval.in) = 0; } 7378 7399 break; … … 7381 7402 7382 7403 /* Line 1806 of yacc.c */ 7383 #line 174 5"parser.yy"7404 #line 1748 "parser.yy" 7384 7405 { (yyval.in) = (yyvsp[(2) - (2)].in); } 7385 7406 break; … … 7388 7409 7389 7410 /* Line 1806 of yacc.c */ 7390 #line 17 47"parser.yy"7411 #line 1750 "parser.yy" 7391 7412 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); } 7392 7413 break; … … 7395 7416 7396 7417 /* Line 1806 of yacc.c */ 7397 #line 175 1"parser.yy"7418 #line 1754 "parser.yy" 7398 7419 { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); } 7399 7420 break; … … 7402 7423 7403 7424 /* Line 1806 of yacc.c */ 7404 #line 175 2"parser.yy"7425 #line 1755 "parser.yy" 7405 7426 { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); } 7406 7427 break; … … 7409 7430 7410 7431 /* Line 1806 of yacc.c */ 7411 #line 17 57"parser.yy"7432 #line 1760 "parser.yy" 7412 7433 { (yyval.in) = 0; } 7413 7434 break; … … 7416 7437 7417 7438 /* Line 1806 of yacc.c */ 7418 #line 17 59"parser.yy"7439 #line 1762 "parser.yy" 7419 7440 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); } 7420 7441 break; … … 7423 7444 7424 7445 /* Line 1806 of yacc.c */ 7425 #line 176 0"parser.yy"7446 #line 1763 "parser.yy" 7426 7447 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); } 7427 7448 break; … … 7430 7451 7431 7452 /* Line 1806 of yacc.c */ 7432 #line 176 2"parser.yy"7453 #line 1765 "parser.yy" 7433 7454 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_last( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); } 7434 7455 break; … … 7437 7458 7438 7459 /* Line 1806 of yacc.c */ 7439 #line 17 78"parser.yy"7460 #line 1781 "parser.yy" 7440 7461 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) ) ); } 7441 7462 break; … … 7444 7465 7445 7466 /* Line 1806 of yacc.c */ 7446 #line 178 4"parser.yy"7467 #line 1787 "parser.yy" 7447 7468 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_last( (yyvsp[(2) - (2)].en) ) ); } 7448 7469 break; … … 7451 7472 7452 7473 /* Line 1806 of yacc.c */ 7453 #line 179 0"parser.yy"7474 #line 1793 "parser.yy" 7454 7475 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); } 7455 7476 break; … … 7458 7479 7459 7480 /* Line 1806 of yacc.c */ 7460 #line 179 3"parser.yy"7481 #line 1796 "parser.yy" 7461 7482 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7462 7483 break; … … 7465 7486 7466 7487 /* Line 1806 of yacc.c */ 7467 #line 179 5"parser.yy"7488 #line 1798 "parser.yy" 7468 7489 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7469 7490 break; … … 7472 7493 7473 7494 /* Line 1806 of yacc.c */ 7474 #line 1 797"parser.yy"7495 #line 1800 "parser.yy" 7475 7496 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ); } 7476 7497 break; … … 7479 7500 7480 7501 /* Line 1806 of yacc.c */ 7481 #line 1 799"parser.yy"7502 #line 1802 "parser.yy" 7482 7503 { (yyval.en) = (yyvsp[(4) - (6)].en); } 7483 7504 break; … … 7486 7507 7487 7508 /* Line 1806 of yacc.c */ 7488 #line 182 3"parser.yy"7509 #line 1826 "parser.yy" 7489 7510 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7490 7511 break; … … 7493 7514 7494 7515 /* Line 1806 of yacc.c */ 7495 #line 182 5"parser.yy"7516 #line 1828 "parser.yy" 7496 7517 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7497 7518 break; … … 7500 7521 7501 7522 /* Line 1806 of yacc.c */ 7502 #line 18 27"parser.yy"7523 #line 1830 "parser.yy" 7503 7524 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 7504 7525 break; … … 7507 7528 7508 7529 /* Line 1806 of yacc.c */ 7509 #line 183 3"parser.yy"7530 #line 1836 "parser.yy" 7510 7531 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7511 7532 break; … … 7514 7535 7515 7536 /* Line 1806 of yacc.c */ 7516 #line 183 5"parser.yy"7537 #line 1838 "parser.yy" 7517 7538 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7518 7539 break; … … 7521 7542 7522 7543 /* Line 1806 of yacc.c */ 7523 #line 184 0"parser.yy"7544 #line 1843 "parser.yy" 7524 7545 { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 7525 7546 break; … … 7528 7549 7529 7550 /* Line 1806 of yacc.c */ 7530 #line 184 6"parser.yy"7551 #line 1849 "parser.yy" 7531 7552 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); } 7532 7553 break; … … 7535 7556 7536 7557 /* Line 1806 of yacc.c */ 7537 #line 185 1"parser.yy"7558 #line 1854 "parser.yy" 7538 7559 { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); } 7539 7560 break; … … 7542 7563 7543 7564 /* Line 1806 of yacc.c */ 7544 #line 185 3"parser.yy"7565 #line 1856 "parser.yy" 7545 7566 { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); } 7546 7567 break; … … 7549 7570 7550 7571 /* Line 1806 of yacc.c */ 7551 #line 18 59"parser.yy"7572 #line 1862 "parser.yy" 7552 7573 { (yyval.tclass) = DeclarationNode::Otype; } 7553 7574 break; … … 7556 7577 7557 7578 /* Line 1806 of yacc.c */ 7558 #line 186 1"parser.yy"7579 #line 1864 "parser.yy" 7559 7580 { (yyval.tclass) = DeclarationNode::Ftype; } 7560 7581 break; … … 7563 7584 7564 7585 /* Line 1806 of yacc.c */ 7565 #line 186 3"parser.yy"7586 #line 1866 "parser.yy" 7566 7587 { (yyval.tclass) = DeclarationNode::Dtype; } 7567 7588 break; … … 7570 7591 7571 7592 /* Line 1806 of yacc.c */ 7572 #line 18 68"parser.yy"7593 #line 1871 "parser.yy" 7573 7594 { (yyval.decl) = 0; } 7574 7595 break; … … 7577 7598 7578 7599 /* Line 1806 of yacc.c */ 7579 #line 187 0"parser.yy"7600 #line 1873 "parser.yy" 7580 7601 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7581 7602 break; … … 7584 7605 7585 7606 /* Line 1806 of yacc.c */ 7586 #line 187 5"parser.yy"7607 #line 1878 "parser.yy" 7587 7608 { 7588 7609 typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) ); … … 7594 7615 7595 7616 /* Line 1806 of yacc.c */ 7596 #line 188 0"parser.yy"7617 #line 1883 "parser.yy" 7597 7618 { (yyval.decl) = (yyvsp[(4) - (5)].decl); } 7598 7619 break; … … 7601 7622 7602 7623 /* Line 1806 of yacc.c */ 7603 #line 188 2"parser.yy"7624 #line 1885 "parser.yy" 7604 7625 { (yyval.decl) = 0; } 7605 7626 break; … … 7608 7629 7609 7630 /* Line 1806 of yacc.c */ 7610 #line 18 87"parser.yy"7631 #line 1890 "parser.yy" 7611 7632 { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); } 7612 7633 break; … … 7615 7636 7616 7637 /* Line 1806 of yacc.c */ 7617 #line 189 0"parser.yy"7638 #line 1893 "parser.yy" 7618 7639 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( build_typevalue( (yyvsp[(3) - (3)].decl) ) ) ) ); } 7619 7640 break; … … 7622 7643 7623 7644 /* Line 1806 of yacc.c */ 7624 #line 189 2"parser.yy"7645 #line 1895 "parser.yy" 7625 7646 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 7626 7647 break; … … 7629 7650 7630 7651 /* Line 1806 of yacc.c */ 7631 #line 1 897"parser.yy"7652 #line 1900 "parser.yy" 7632 7653 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7633 7654 break; … … 7636 7657 7637 7658 /* Line 1806 of yacc.c */ 7638 #line 1 899"parser.yy"7659 #line 1902 "parser.yy" 7639 7660 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); } 7640 7661 break; … … 7643 7664 7644 7665 /* Line 1806 of yacc.c */ 7645 #line 190 1"parser.yy"7666 #line 1904 "parser.yy" 7646 7667 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); } 7647 7668 break; … … 7650 7671 7651 7672 /* Line 1806 of yacc.c */ 7652 #line 190 6"parser.yy"7673 #line 1909 "parser.yy" 7653 7674 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); } 7654 7675 break; … … 7657 7678 7658 7679 /* Line 1806 of yacc.c */ 7659 #line 19 08"parser.yy"7680 #line 1911 "parser.yy" 7660 7681 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); } 7661 7682 break; … … 7664 7685 7665 7686 /* Line 1806 of yacc.c */ 7666 #line 191 3"parser.yy"7687 #line 1916 "parser.yy" 7667 7688 { 7668 7689 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD ); … … 7674 7695 7675 7696 /* Line 1806 of yacc.c */ 7676 #line 19 18"parser.yy"7697 #line 1921 "parser.yy" 7677 7698 { 7678 7699 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG ); … … 7684 7705 7685 7706 /* Line 1806 of yacc.c */ 7686 #line 192 6"parser.yy"7707 #line 1929 "parser.yy" 7687 7708 { 7688 7709 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID ); … … 7694 7715 7695 7716 /* Line 1806 of yacc.c */ 7696 #line 193 1"parser.yy"7717 #line 1934 "parser.yy" 7697 7718 { 7698 7719 typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) ); … … 7704 7725 7705 7726 /* Line 1806 of yacc.c */ 7706 #line 193 6"parser.yy"7727 #line 1939 "parser.yy" 7707 7728 { 7708 7729 typedefTable.leaveTrait(); … … 7715 7736 7716 7737 /* Line 1806 of yacc.c */ 7717 #line 194 6"parser.yy"7738 #line 1949 "parser.yy" 7718 7739 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 7719 7740 break; … … 7722 7743 7723 7744 /* Line 1806 of yacc.c */ 7724 #line 195 6"parser.yy"7745 #line 1959 "parser.yy" 7725 7746 { 7726 7747 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7732 7753 7733 7754 /* Line 1806 of yacc.c */ 7734 #line 196 1"parser.yy"7755 #line 1964 "parser.yy" 7735 7756 { 7736 7757 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7742 7763 7743 7764 /* Line 1806 of yacc.c */ 7744 #line 196 6"parser.yy"7765 #line 1969 "parser.yy" 7745 7766 { 7746 7767 typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 7752 7773 7753 7774 /* Line 1806 of yacc.c */ 7754 #line 197 4"parser.yy"7775 #line 1977 "parser.yy" 7755 7776 { 7756 7777 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7762 7783 7763 7784 /* Line 1806 of yacc.c */ 7764 #line 19 79"parser.yy"7785 #line 1982 "parser.yy" 7765 7786 { 7766 7787 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7772 7793 7773 7794 /* Line 1806 of yacc.c */ 7774 #line 19 89"parser.yy"7795 #line 1992 "parser.yy" 7775 7796 {} 7776 7797 break; … … 7779 7800 7780 7801 /* Line 1806 of yacc.c */ 7781 #line 199 1"parser.yy"7802 #line 1994 "parser.yy" 7782 7803 { parseTree = parseTree != nullptr ? parseTree->appendList( (yyvsp[(1) - (1)].decl) ) : (yyvsp[(1) - (1)].decl); } 7783 7804 break; … … 7786 7807 7787 7808 /* Line 1806 of yacc.c */ 7788 #line 1997"parser.yy"7809 #line 2000 "parser.yy" 7789 7810 { (yyval.decl) = (yyvsp[(1) - (3)].decl) != nullptr ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); } 7790 7811 break; … … 7793 7814 7794 7815 /* Line 1806 of yacc.c */ 7795 #line 200 2"parser.yy"7816 #line 2005 "parser.yy" 7796 7817 { (yyval.decl) = 0; } 7797 7818 break; … … 7800 7821 7801 7822 /* Line 1806 of yacc.c */ 7802 #line 201 0"parser.yy"7823 #line 2013 "parser.yy" 7803 7824 {} 7804 7825 break; … … 7807 7828 7808 7829 /* Line 1806 of yacc.c */ 7809 #line 201 2"parser.yy"7830 #line 2015 "parser.yy" 7810 7831 { 7811 7832 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" … … 7817 7838 7818 7839 /* Line 1806 of yacc.c */ 7819 #line 20 17"parser.yy"7840 #line 2020 "parser.yy" 7820 7841 { 7821 7842 linkage = linkageStack.top(); … … 7828 7849 7829 7850 /* Line 1806 of yacc.c */ 7830 #line 202 3"parser.yy"7851 #line 2026 "parser.yy" 7831 7852 { // mark all fields in list 7832 7853 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7839 7860 7840 7861 /* Line 1806 of yacc.c */ 7841 #line 20 38"parser.yy"7862 #line 2041 "parser.yy" 7842 7863 { 7843 7864 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7850 7871 7851 7872 /* Line 1806 of yacc.c */ 7852 #line 204 4"parser.yy"7873 #line 2047 "parser.yy" 7853 7874 { 7854 7875 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7861 7882 7862 7883 /* Line 1806 of yacc.c */ 7863 #line 205 3"parser.yy"7884 #line 2056 "parser.yy" 7864 7885 { 7865 7886 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7872 7893 7873 7894 /* Line 1806 of yacc.c */ 7874 #line 20 59"parser.yy"7895 #line 2062 "parser.yy" 7875 7896 { 7876 7897 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7883 7904 7884 7905 /* Line 1806 of yacc.c */ 7885 #line 206 5"parser.yy"7906 #line 2068 "parser.yy" 7886 7907 { 7887 7908 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7894 7915 7895 7916 /* Line 1806 of yacc.c */ 7896 #line 207 1"parser.yy"7917 #line 2074 "parser.yy" 7897 7918 { 7898 7919 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7905 7926 7906 7927 /* Line 1806 of yacc.c */ 7907 #line 20 77"parser.yy"7928 #line 2080 "parser.yy" 7908 7929 { 7909 7930 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7916 7937 7917 7938 /* Line 1806 of yacc.c */ 7918 #line 208 5"parser.yy"7939 #line 2088 "parser.yy" 7919 7940 { 7920 7941 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7927 7948 7928 7949 /* Line 1806 of yacc.c */ 7929 #line 209 1"parser.yy"7950 #line 2094 "parser.yy" 7930 7951 { 7931 7952 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7938 7959 7939 7960 /* Line 1806 of yacc.c */ 7940 #line 2 099"parser.yy"7961 #line 2102 "parser.yy" 7941 7962 { 7942 7963 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7949 7970 7950 7971 /* Line 1806 of yacc.c */ 7951 #line 210 5"parser.yy"7972 #line 2108 "parser.yy" 7952 7973 { 7953 7974 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7960 7981 7961 7982 /* Line 1806 of yacc.c */ 7962 #line 212 0"parser.yy"7983 #line 2123 "parser.yy" 7963 7984 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 7964 7985 break; … … 7967 7988 7968 7989 /* Line 1806 of yacc.c */ 7969 #line 212 5"parser.yy"7990 #line 2128 "parser.yy" 7970 7991 { delete (yyvsp[(3) - (5)].str); } 7971 7992 break; … … 7974 7995 7975 7996 /* Line 1806 of yacc.c */ 7976 #line 213 0"parser.yy"7997 #line 2133 "parser.yy" 7977 7998 { (yyval.decl) = 0; } 7978 7999 break; … … 7981 8002 7982 8003 /* Line 1806 of yacc.c */ 7983 #line 21 37"parser.yy"8004 #line 2140 "parser.yy" 7984 8005 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7985 8006 break; … … 7988 8009 7989 8010 /* Line 1806 of yacc.c */ 7990 #line 214 3"parser.yy"8011 #line 2146 "parser.yy" 7991 8012 { (yyval.decl) = 0; } 7992 8013 break; … … 7995 8016 7996 8017 /* Line 1806 of yacc.c */ 7997 #line 215 4"parser.yy"8018 #line 2157 "parser.yy" 7998 8019 { delete (yyvsp[(3) - (4)].en); } 7999 8020 break; … … 8002 8023 8003 8024 /* Line 1806 of yacc.c */ 8004 #line 21 58"parser.yy"8025 #line 2161 "parser.yy" 8005 8026 { delete (yyvsp[(1) - (1)].tok); } 8006 8027 break; … … 8009 8030 8010 8031 /* Line 1806 of yacc.c */ 8011 #line 21 59"parser.yy"8032 #line 2162 "parser.yy" 8012 8033 { delete (yyvsp[(1) - (1)].decl); } 8013 8034 break; … … 8016 8037 8017 8038 /* Line 1806 of yacc.c */ 8018 #line 216 0"parser.yy"8039 #line 2163 "parser.yy" 8019 8040 { delete (yyvsp[(1) - (1)].decl); } 8020 8041 break; … … 8023 8044 8024 8045 /* Line 1806 of yacc.c */ 8025 #line 216 1"parser.yy"8046 #line 2164 "parser.yy" 8026 8047 { delete (yyvsp[(1) - (1)].decl); } 8027 8048 break; 8028 8049 8029 8050 case 563: 8030 8031 /* Line 1806 of yacc.c */8032 #line 2196 "parser.yy"8033 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8034 break;8035 8036 case 565:8037 8051 8038 8052 /* Line 1806 of yacc.c */ … … 8041 8055 break; 8042 8056 8057 case 565: 8058 8059 /* Line 1806 of yacc.c */ 8060 #line 2202 "parser.yy" 8061 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8062 break; 8063 8043 8064 case 566: 8044 8065 8045 8066 /* Line 1806 of yacc.c */ 8046 #line 220 1"parser.yy"8067 #line 2204 "parser.yy" 8047 8068 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8048 8069 break; … … 8051 8072 8052 8073 /* Line 1806 of yacc.c */ 8053 #line 220 6"parser.yy"8074 #line 2209 "parser.yy" 8054 8075 { 8055 8076 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8061 8082 8062 8083 /* Line 1806 of yacc.c */ 8063 #line 221 1"parser.yy"8084 #line 2214 "parser.yy" 8064 8085 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8065 8086 break; … … 8068 8089 8069 8090 /* Line 1806 of yacc.c */ 8070 #line 221 6"parser.yy"8091 #line 2219 "parser.yy" 8071 8092 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8072 8093 break; … … 8075 8096 8076 8097 /* Line 1806 of yacc.c */ 8077 #line 22 18"parser.yy"8098 #line 2221 "parser.yy" 8078 8099 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8079 8100 break; … … 8082 8103 8083 8104 /* Line 1806 of yacc.c */ 8084 #line 222 0"parser.yy"8105 #line 2223 "parser.yy" 8085 8106 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8086 8107 break; … … 8089 8110 8090 8111 /* Line 1806 of yacc.c */ 8091 #line 222 5"parser.yy"8112 #line 2228 "parser.yy" 8092 8113 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8093 8114 break; … … 8096 8117 8097 8118 /* Line 1806 of yacc.c */ 8098 #line 22 27"parser.yy"8119 #line 2230 "parser.yy" 8099 8120 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8100 8121 break; … … 8103 8124 8104 8125 /* Line 1806 of yacc.c */ 8105 #line 22 29"parser.yy"8126 #line 2232 "parser.yy" 8106 8127 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8107 8128 break; … … 8110 8131 8111 8132 /* Line 1806 of yacc.c */ 8112 #line 223 1"parser.yy"8133 #line 2234 "parser.yy" 8113 8134 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8114 8135 break; … … 8117 8138 8118 8139 /* Line 1806 of yacc.c */ 8119 #line 223 6"parser.yy"8140 #line 2239 "parser.yy" 8120 8141 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8121 8142 break; … … 8124 8145 8125 8146 /* Line 1806 of yacc.c */ 8126 #line 22 38"parser.yy"8147 #line 2241 "parser.yy" 8127 8148 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8128 8149 break; 8129 8150 8130 8151 case 578: 8131 8132 /* Line 1806 of yacc.c */8133 #line 2247 "parser.yy"8134 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8135 break;8136 8137 case 580:8138 8152 8139 8153 /* Line 1806 of yacc.c */ … … 8142 8156 break; 8143 8157 8158 case 580: 8159 8160 /* Line 1806 of yacc.c */ 8161 #line 2253 "parser.yy" 8162 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8163 break; 8164 8144 8165 case 581: 8145 8166 8146 8167 /* Line 1806 of yacc.c */ 8147 #line 225 5"parser.yy"8168 #line 2258 "parser.yy" 8148 8169 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8149 8170 break; … … 8152 8173 8153 8174 /* Line 1806 of yacc.c */ 8154 #line 22 57"parser.yy"8175 #line 2260 "parser.yy" 8155 8176 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8156 8177 break; … … 8159 8180 8160 8181 /* Line 1806 of yacc.c */ 8161 #line 22 59"parser.yy"8182 #line 2262 "parser.yy" 8162 8183 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8163 8184 break; … … 8166 8187 8167 8188 /* Line 1806 of yacc.c */ 8168 #line 226 4"parser.yy"8189 #line 2267 "parser.yy" 8169 8190 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8170 8191 break; … … 8173 8194 8174 8195 /* Line 1806 of yacc.c */ 8175 #line 226 6"parser.yy"8196 #line 2269 "parser.yy" 8176 8197 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8177 8198 break; … … 8180 8201 8181 8202 /* Line 1806 of yacc.c */ 8182 #line 22 68"parser.yy"8203 #line 2271 "parser.yy" 8183 8204 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8184 8205 break; … … 8187 8208 8188 8209 /* Line 1806 of yacc.c */ 8189 #line 227 3"parser.yy"8210 #line 2276 "parser.yy" 8190 8211 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8191 8212 break; … … 8194 8215 8195 8216 /* Line 1806 of yacc.c */ 8196 #line 227 5"parser.yy"8217 #line 2278 "parser.yy" 8197 8218 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8198 8219 break; … … 8201 8222 8202 8223 /* Line 1806 of yacc.c */ 8203 #line 22 77"parser.yy"8224 #line 2280 "parser.yy" 8204 8225 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8205 8226 break; … … 8208 8229 8209 8230 /* Line 1806 of yacc.c */ 8210 #line 229 2"parser.yy"8231 #line 2295 "parser.yy" 8211 8232 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); } 8212 8233 break; … … 8215 8236 8216 8237 /* Line 1806 of yacc.c */ 8217 #line 229 4"parser.yy"8238 #line 2297 "parser.yy" 8218 8239 { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); } 8219 8240 break; … … 8222 8243 8223 8244 /* Line 1806 of yacc.c */ 8224 #line 229 6"parser.yy"8245 #line 2299 "parser.yy" 8225 8246 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8226 8247 break; … … 8229 8250 8230 8251 /* Line 1806 of yacc.c */ 8231 #line 230 1"parser.yy"8252 #line 2304 "parser.yy" 8232 8253 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8233 8254 break; … … 8236 8257 8237 8258 /* Line 1806 of yacc.c */ 8238 #line 230 3"parser.yy"8259 #line 2306 "parser.yy" 8239 8260 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8240 8261 break; … … 8243 8264 8244 8265 /* Line 1806 of yacc.c */ 8245 #line 230 5"parser.yy"8266 #line 2308 "parser.yy" 8246 8267 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8247 8268 break; … … 8250 8271 8251 8272 /* Line 1806 of yacc.c */ 8252 #line 231 0"parser.yy"8273 #line 2313 "parser.yy" 8253 8274 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8254 8275 break; … … 8257 8278 8258 8279 /* Line 1806 of yacc.c */ 8259 #line 231 2"parser.yy"8280 #line 2315 "parser.yy" 8260 8281 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8261 8282 break; … … 8264 8285 8265 8286 /* Line 1806 of yacc.c */ 8266 #line 231 4"parser.yy"8287 #line 2317 "parser.yy" 8267 8288 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8268 8289 break; 8269 8290 8270 8291 case 602: 8271 8272 /* Line 1806 of yacc.c */8273 #line 2329 "parser.yy"8274 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8275 break;8276 8277 case 604:8278 8292 8279 8293 /* Line 1806 of yacc.c */ … … 8282 8296 break; 8283 8297 8298 case 604: 8299 8300 /* Line 1806 of yacc.c */ 8301 #line 2335 "parser.yy" 8302 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8303 break; 8304 8284 8305 case 605: 8285 8306 8286 8307 /* Line 1806 of yacc.c */ 8287 #line 233 4"parser.yy"8308 #line 2337 "parser.yy" 8288 8309 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8289 8310 break; … … 8292 8313 8293 8314 /* Line 1806 of yacc.c */ 8294 #line 234 0"parser.yy"8315 #line 2343 "parser.yy" 8295 8316 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8296 8317 break; … … 8299 8320 8300 8321 /* Line 1806 of yacc.c */ 8301 #line 234 5"parser.yy"8322 #line 2348 "parser.yy" 8302 8323 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8303 8324 break; … … 8306 8327 8307 8328 /* Line 1806 of yacc.c */ 8308 #line 23 47"parser.yy"8329 #line 2350 "parser.yy" 8309 8330 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8310 8331 break; … … 8313 8334 8314 8335 /* Line 1806 of yacc.c */ 8315 #line 23 49"parser.yy"8336 #line 2352 "parser.yy" 8316 8337 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8317 8338 break; … … 8320 8341 8321 8342 /* Line 1806 of yacc.c */ 8322 #line 235 4"parser.yy"8343 #line 2357 "parser.yy" 8323 8344 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8324 8345 break; … … 8327 8348 8328 8349 /* Line 1806 of yacc.c */ 8329 #line 235 6"parser.yy"8350 #line 2359 "parser.yy" 8330 8351 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8331 8352 break; … … 8334 8355 8335 8356 /* Line 1806 of yacc.c */ 8336 #line 23 58"parser.yy"8357 #line 2361 "parser.yy" 8337 8358 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8338 8359 break; … … 8341 8362 8342 8363 /* Line 1806 of yacc.c */ 8343 #line 236 0"parser.yy"8364 #line 2363 "parser.yy" 8344 8365 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8345 8366 break; … … 8348 8369 8349 8370 /* Line 1806 of yacc.c */ 8350 #line 236 5"parser.yy"8371 #line 2368 "parser.yy" 8351 8372 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8352 8373 break; … … 8355 8376 8356 8377 /* Line 1806 of yacc.c */ 8357 #line 23 67"parser.yy"8378 #line 2370 "parser.yy" 8358 8379 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8359 8380 break; … … 8362 8383 8363 8384 /* Line 1806 of yacc.c */ 8364 #line 23 69"parser.yy"8385 #line 2372 "parser.yy" 8365 8386 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8366 8387 break; 8367 8388 8368 8389 case 618: 8369 8370 /* Line 1806 of yacc.c */8371 #line 2379 "parser.yy"8372 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8373 break;8374 8375 case 620:8376 8390 8377 8391 /* Line 1806 of yacc.c */ … … 8380 8394 break; 8381 8395 8396 case 620: 8397 8398 /* Line 1806 of yacc.c */ 8399 #line 2385 "parser.yy" 8400 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8401 break; 8402 8382 8403 case 621: 8383 8404 8384 8405 /* Line 1806 of yacc.c */ 8385 #line 238 4"parser.yy"8406 #line 2387 "parser.yy" 8386 8407 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8387 8408 break; … … 8390 8411 8391 8412 /* Line 1806 of yacc.c */ 8392 #line 23 89"parser.yy"8413 #line 2392 "parser.yy" 8393 8414 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8394 8415 break; … … 8397 8418 8398 8419 /* Line 1806 of yacc.c */ 8399 #line 239 1"parser.yy"8420 #line 2394 "parser.yy" 8400 8421 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8401 8422 break; … … 8404 8425 8405 8426 /* Line 1806 of yacc.c */ 8406 #line 239 3"parser.yy"8427 #line 2396 "parser.yy" 8407 8428 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8408 8429 break; … … 8411 8432 8412 8433 /* Line 1806 of yacc.c */ 8413 #line 2 398"parser.yy"8434 #line 2401 "parser.yy" 8414 8435 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8415 8436 break; … … 8418 8439 8419 8440 /* Line 1806 of yacc.c */ 8420 #line 240 0"parser.yy"8441 #line 2403 "parser.yy" 8421 8442 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8422 8443 break; … … 8425 8446 8426 8447 /* Line 1806 of yacc.c */ 8427 #line 240 2"parser.yy"8448 #line 2405 "parser.yy" 8428 8449 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8429 8450 break; … … 8432 8453 8433 8454 /* Line 1806 of yacc.c */ 8434 #line 240 4"parser.yy"8455 #line 2407 "parser.yy" 8435 8456 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8436 8457 break; … … 8439 8460 8440 8461 /* Line 1806 of yacc.c */ 8441 #line 24 09"parser.yy"8462 #line 2412 "parser.yy" 8442 8463 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8443 8464 break; … … 8446 8467 8447 8468 /* Line 1806 of yacc.c */ 8448 #line 241 1"parser.yy"8469 #line 2414 "parser.yy" 8449 8470 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8450 8471 break; … … 8453 8474 8454 8475 /* Line 1806 of yacc.c */ 8455 #line 241 3"parser.yy"8476 #line 2416 "parser.yy" 8456 8477 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8457 8478 break; 8458 8479 8459 8480 case 632: 8460 8461 /* Line 1806 of yacc.c */8462 #line 2444 "parser.yy"8463 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8464 break;8465 8466 case 634:8467 8481 8468 8482 /* Line 1806 of yacc.c */ … … 8471 8485 break; 8472 8486 8487 case 634: 8488 8489 /* Line 1806 of yacc.c */ 8490 #line 2450 "parser.yy" 8491 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8492 break; 8493 8473 8494 case 635: 8474 8495 8475 8496 /* Line 1806 of yacc.c */ 8476 #line 24 49"parser.yy"8497 #line 2452 "parser.yy" 8477 8498 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8478 8499 break; … … 8481 8502 8482 8503 /* Line 1806 of yacc.c */ 8483 #line 245 4"parser.yy"8504 #line 2457 "parser.yy" 8484 8505 { 8485 8506 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8491 8512 8492 8513 /* Line 1806 of yacc.c */ 8493 #line 24 59"parser.yy"8514 #line 2462 "parser.yy" 8494 8515 { 8495 8516 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8501 8522 8502 8523 /* Line 1806 of yacc.c */ 8503 #line 24 67"parser.yy"8524 #line 2470 "parser.yy" 8504 8525 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8505 8526 break; … … 8508 8529 8509 8530 /* Line 1806 of yacc.c */ 8510 #line 24 69"parser.yy"8531 #line 2472 "parser.yy" 8511 8532 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8512 8533 break; … … 8515 8536 8516 8537 /* Line 1806 of yacc.c */ 8517 #line 247 1"parser.yy"8538 #line 2474 "parser.yy" 8518 8539 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8519 8540 break; … … 8522 8543 8523 8544 /* Line 1806 of yacc.c */ 8524 #line 247 6"parser.yy"8545 #line 2479 "parser.yy" 8525 8546 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8526 8547 break; … … 8529 8550 8530 8551 /* Line 1806 of yacc.c */ 8531 #line 24 78"parser.yy"8552 #line 2481 "parser.yy" 8532 8553 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8533 8554 break; … … 8536 8557 8537 8558 /* Line 1806 of yacc.c */ 8538 #line 248 3"parser.yy"8559 #line 2486 "parser.yy" 8539 8560 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8540 8561 break; … … 8543 8564 8544 8565 /* Line 1806 of yacc.c */ 8545 #line 248 5"parser.yy"8566 #line 2488 "parser.yy" 8546 8567 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8547 8568 break; … … 8550 8571 8551 8572 /* Line 1806 of yacc.c */ 8552 #line 250 0"parser.yy"8573 #line 2503 "parser.yy" 8553 8574 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8554 8575 break; … … 8557 8578 8558 8579 /* Line 1806 of yacc.c */ 8559 #line 250 2"parser.yy"8580 #line 2505 "parser.yy" 8560 8581 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8561 8582 break; … … 8564 8585 8565 8586 /* Line 1806 of yacc.c */ 8566 #line 25 07"parser.yy"8587 #line 2510 "parser.yy" 8567 8588 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8568 8589 break; … … 8571 8592 8572 8593 /* Line 1806 of yacc.c */ 8573 #line 25 09"parser.yy"8594 #line 2512 "parser.yy" 8574 8595 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8575 8596 break; … … 8578 8599 8579 8600 /* Line 1806 of yacc.c */ 8580 #line 251 1"parser.yy"8601 #line 2514 "parser.yy" 8581 8602 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8582 8603 break; … … 8585 8606 8586 8607 /* Line 1806 of yacc.c */ 8587 #line 251 3"parser.yy"8608 #line 2516 "parser.yy" 8588 8609 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8589 8610 break; … … 8592 8613 8593 8614 /* Line 1806 of yacc.c */ 8594 #line 251 5"parser.yy"8615 #line 2518 "parser.yy" 8595 8616 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8596 8617 break; … … 8599 8620 8600 8621 /* Line 1806 of yacc.c */ 8601 #line 252 1"parser.yy"8622 #line 2524 "parser.yy" 8602 8623 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8603 8624 break; … … 8606 8627 8607 8628 /* Line 1806 of yacc.c */ 8608 #line 252 3"parser.yy"8629 #line 2526 "parser.yy" 8609 8630 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8610 8631 break; … … 8613 8634 8614 8635 /* Line 1806 of yacc.c */ 8615 #line 252 5"parser.yy"8636 #line 2528 "parser.yy" 8616 8637 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8617 8638 break; … … 8620 8641 8621 8642 /* Line 1806 of yacc.c */ 8622 #line 253 0"parser.yy"8643 #line 2533 "parser.yy" 8623 8644 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8624 8645 break; … … 8627 8648 8628 8649 /* Line 1806 of yacc.c */ 8629 #line 253 2"parser.yy"8650 #line 2535 "parser.yy" 8630 8651 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8631 8652 break; … … 8634 8655 8635 8656 /* Line 1806 of yacc.c */ 8636 #line 253 4"parser.yy"8657 #line 2537 "parser.yy" 8637 8658 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8638 8659 break; … … 8641 8662 8642 8663 /* Line 1806 of yacc.c */ 8643 #line 254 0"parser.yy"8664 #line 2543 "parser.yy" 8644 8665 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8645 8666 break; … … 8648 8669 8649 8670 /* Line 1806 of yacc.c */ 8650 #line 254 2"parser.yy"8671 #line 2545 "parser.yy" 8651 8672 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); } 8652 8673 break; … … 8655 8676 8656 8677 /* Line 1806 of yacc.c */ 8657 #line 25 48"parser.yy"8678 #line 2551 "parser.yy" 8658 8679 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); } 8659 8680 break; … … 8662 8683 8663 8684 /* Line 1806 of yacc.c */ 8664 #line 255 0"parser.yy"8685 #line 2553 "parser.yy" 8665 8686 { (yyval.decl) = DeclarationNode::newVarArray( 0 ); } 8666 8687 break; … … 8669 8690 8670 8691 /* Line 1806 of yacc.c */ 8671 #line 255 2"parser.yy"8692 #line 2555 "parser.yy" 8672 8693 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); } 8673 8694 break; … … 8676 8697 8677 8698 /* Line 1806 of yacc.c */ 8678 #line 255 4"parser.yy"8699 #line 2557 "parser.yy" 8679 8700 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); } 8680 8701 break; … … 8683 8704 8684 8705 /* Line 1806 of yacc.c */ 8685 #line 25 69"parser.yy"8706 #line 2572 "parser.yy" 8686 8707 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8687 8708 break; … … 8690 8711 8691 8712 /* Line 1806 of yacc.c */ 8692 #line 257 1"parser.yy"8713 #line 2574 "parser.yy" 8693 8714 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8694 8715 break; … … 8697 8718 8698 8719 /* Line 1806 of yacc.c */ 8699 #line 257 6"parser.yy"8720 #line 2579 "parser.yy" 8700 8721 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8701 8722 break; … … 8704 8725 8705 8726 /* Line 1806 of yacc.c */ 8706 #line 25 78"parser.yy"8727 #line 2581 "parser.yy" 8707 8728 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8708 8729 break; … … 8711 8732 8712 8733 /* Line 1806 of yacc.c */ 8713 #line 258 0"parser.yy"8734 #line 2583 "parser.yy" 8714 8735 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8715 8736 break; … … 8718 8739 8719 8740 /* Line 1806 of yacc.c */ 8720 #line 258 2"parser.yy"8741 #line 2585 "parser.yy" 8721 8742 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8722 8743 break; … … 8725 8746 8726 8747 /* Line 1806 of yacc.c */ 8727 #line 258 4"parser.yy"8748 #line 2587 "parser.yy" 8728 8749 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8729 8750 break; … … 8732 8753 8733 8754 /* Line 1806 of yacc.c */ 8734 #line 259 0"parser.yy"8755 #line 2593 "parser.yy" 8735 8756 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8736 8757 break; … … 8739 8760 8740 8761 /* Line 1806 of yacc.c */ 8741 #line 259 2"parser.yy"8762 #line 2595 "parser.yy" 8742 8763 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8743 8764 break; … … 8746 8767 8747 8768 /* Line 1806 of yacc.c */ 8748 #line 259 4"parser.yy"8769 #line 2597 "parser.yy" 8749 8770 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8750 8771 break; … … 8753 8774 8754 8775 /* Line 1806 of yacc.c */ 8755 #line 2 599"parser.yy"8776 #line 2602 "parser.yy" 8756 8777 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8757 8778 break; … … 8760 8781 8761 8782 /* Line 1806 of yacc.c */ 8762 #line 260 1"parser.yy"8783 #line 2604 "parser.yy" 8763 8784 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8764 8785 break; … … 8767 8788 8768 8789 /* Line 1806 of yacc.c */ 8769 #line 260 3"parser.yy"8790 #line 2606 "parser.yy" 8770 8791 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8771 8792 break; … … 8774 8795 8775 8796 /* Line 1806 of yacc.c */ 8776 #line 261 0"parser.yy"8797 #line 2613 "parser.yy" 8777 8798 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8778 8799 break; … … 8781 8802 8782 8803 /* Line 1806 of yacc.c */ 8783 #line 262 1"parser.yy"8804 #line 2624 "parser.yy" 8784 8805 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8785 8806 break; … … 8788 8809 8789 8810 /* Line 1806 of yacc.c */ 8790 #line 262 4"parser.yy"8811 #line 2627 "parser.yy" 8791 8812 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 8792 8813 break; … … 8795 8816 8796 8817 /* Line 1806 of yacc.c */ 8797 #line 262 6"parser.yy"8818 #line 2629 "parser.yy" 8798 8819 { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); } 8799 8820 break; … … 8802 8823 8803 8824 /* Line 1806 of yacc.c */ 8804 #line 26 29"parser.yy"8825 #line 2632 "parser.yy" 8805 8826 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 8806 8827 break; … … 8809 8830 8810 8831 /* Line 1806 of yacc.c */ 8811 #line 263 1"parser.yy"8832 #line 2634 "parser.yy" 8812 8833 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); } 8813 8834 break; … … 8816 8837 8817 8838 /* Line 1806 of yacc.c */ 8818 #line 263 3"parser.yy"8839 #line 2636 "parser.yy" 8819 8840 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); } 8820 8841 break; … … 8823 8844 8824 8845 /* Line 1806 of yacc.c */ 8825 #line 26 47"parser.yy"8846 #line 2650 "parser.yy" 8826 8847 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8827 8848 break; … … 8830 8851 8831 8852 /* Line 1806 of yacc.c */ 8832 #line 26 49"parser.yy"8853 #line 2652 "parser.yy" 8833 8854 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8834 8855 break; … … 8837 8858 8838 8859 /* Line 1806 of yacc.c */ 8839 #line 265 4"parser.yy"8860 #line 2657 "parser.yy" 8840 8861 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8841 8862 break; … … 8844 8865 8845 8866 /* Line 1806 of yacc.c */ 8846 #line 265 6"parser.yy"8867 #line 2659 "parser.yy" 8847 8868 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8848 8869 break; … … 8851 8872 8852 8873 /* Line 1806 of yacc.c */ 8853 #line 26 58"parser.yy"8874 #line 2661 "parser.yy" 8854 8875 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8855 8876 break; … … 8858 8879 8859 8880 /* Line 1806 of yacc.c */ 8860 #line 266 0"parser.yy"8881 #line 2663 "parser.yy" 8861 8882 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8862 8883 break; … … 8865 8886 8866 8887 /* Line 1806 of yacc.c */ 8867 #line 266 2"parser.yy"8888 #line 2665 "parser.yy" 8868 8889 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8869 8890 break; … … 8872 8893 8873 8894 /* Line 1806 of yacc.c */ 8874 #line 26 68"parser.yy"8895 #line 2671 "parser.yy" 8875 8896 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8876 8897 break; … … 8879 8900 8880 8901 /* Line 1806 of yacc.c */ 8881 #line 267 0"parser.yy"8902 #line 2673 "parser.yy" 8882 8903 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8883 8904 break; … … 8886 8907 8887 8908 /* Line 1806 of yacc.c */ 8888 #line 267 2"parser.yy"8909 #line 2675 "parser.yy" 8889 8910 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8890 8911 break; … … 8893 8914 8894 8915 /* Line 1806 of yacc.c */ 8895 #line 26 77"parser.yy"8916 #line 2680 "parser.yy" 8896 8917 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8897 8918 break; … … 8900 8921 8901 8922 /* Line 1806 of yacc.c */ 8902 #line 26 79"parser.yy"8923 #line 2682 "parser.yy" 8903 8924 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8904 8925 break; … … 8907 8928 8908 8929 /* Line 1806 of yacc.c */ 8909 #line 26 89"parser.yy"8930 #line 2692 "parser.yy" 8910 8931 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8911 8932 break; … … 8914 8935 8915 8936 /* Line 1806 of yacc.c */ 8916 #line 2 699"parser.yy"8937 #line 2702 "parser.yy" 8917 8938 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8918 8939 break; … … 8921 8942 8922 8943 /* Line 1806 of yacc.c */ 8923 #line 270 1"parser.yy"8944 #line 2704 "parser.yy" 8924 8945 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8925 8946 break; … … 8928 8949 8929 8950 /* Line 1806 of yacc.c */ 8930 #line 270 3"parser.yy"8951 #line 2706 "parser.yy" 8931 8952 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8932 8953 break; … … 8935 8956 8936 8957 /* Line 1806 of yacc.c */ 8937 #line 270 5"parser.yy"8958 #line 2708 "parser.yy" 8938 8959 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8939 8960 break; … … 8942 8963 8943 8964 /* Line 1806 of yacc.c */ 8944 #line 27 07"parser.yy"8965 #line 2710 "parser.yy" 8945 8966 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8946 8967 break; … … 8949 8970 8950 8971 /* Line 1806 of yacc.c */ 8951 #line 27 09"parser.yy"8972 #line 2712 "parser.yy" 8952 8973 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8953 8974 break; … … 8956 8977 8957 8978 /* Line 1806 of yacc.c */ 8958 #line 271 6"parser.yy"8979 #line 2719 "parser.yy" 8959 8980 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8960 8981 break; … … 8963 8984 8964 8985 /* Line 1806 of yacc.c */ 8965 #line 27 18"parser.yy"8986 #line 2721 "parser.yy" 8966 8987 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8967 8988 break; … … 8970 8991 8971 8992 /* Line 1806 of yacc.c */ 8972 #line 272 0"parser.yy"8993 #line 2723 "parser.yy" 8973 8994 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8974 8995 break; … … 8977 8998 8978 8999 /* Line 1806 of yacc.c */ 8979 #line 272 2"parser.yy"9000 #line 2725 "parser.yy" 8980 9001 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 8981 9002 break; … … 8984 9005 8985 9006 /* Line 1806 of yacc.c */ 8986 #line 272 4"parser.yy"9007 #line 2727 "parser.yy" 8987 9008 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8988 9009 break; … … 8991 9012 8992 9013 /* Line 1806 of yacc.c */ 8993 #line 272 6"parser.yy"9014 #line 2729 "parser.yy" 8994 9015 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8995 9016 break; … … 8998 9019 8999 9020 /* Line 1806 of yacc.c */ 9000 #line 27 28"parser.yy"9021 #line 2731 "parser.yy" 9001 9022 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9002 9023 break; … … 9005 9026 9006 9027 /* Line 1806 of yacc.c */ 9007 #line 273 0"parser.yy"9028 #line 2733 "parser.yy" 9008 9029 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9009 9030 break; … … 9012 9033 9013 9034 /* Line 1806 of yacc.c */ 9014 #line 273 2"parser.yy"9035 #line 2735 "parser.yy" 9015 9036 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9016 9037 break; … … 9019 9040 9020 9041 /* Line 1806 of yacc.c */ 9021 #line 273 4"parser.yy"9042 #line 2737 "parser.yy" 9022 9043 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9023 9044 break; … … 9026 9047 9027 9048 /* Line 1806 of yacc.c */ 9028 #line 27 39"parser.yy"9049 #line 2742 "parser.yy" 9029 9050 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 9030 9051 break; … … 9033 9054 9034 9055 /* Line 1806 of yacc.c */ 9035 #line 274 1"parser.yy"9056 #line 2744 "parser.yy" 9036 9057 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 9037 9058 break; … … 9040 9061 9041 9062 /* Line 1806 of yacc.c */ 9042 #line 274 6"parser.yy"9063 #line 2749 "parser.yy" 9043 9064 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); } 9044 9065 break; … … 9047 9068 9048 9069 /* Line 1806 of yacc.c */ 9049 #line 27 48"parser.yy"9070 #line 2751 "parser.yy" 9050 9071 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); } 9051 9072 break; … … 9054 9075 9055 9076 /* Line 1806 of yacc.c */ 9056 #line 277 5"parser.yy"9077 #line 2778 "parser.yy" 9057 9078 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 9058 9079 break; … … 9061 9082 9062 9083 /* Line 1806 of yacc.c */ 9063 #line 278 6"parser.yy"9084 #line 2789 "parser.yy" 9064 9085 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9065 9086 break; … … 9068 9089 9069 9090 /* Line 1806 of yacc.c */ 9070 #line 27 88"parser.yy"9091 #line 2791 "parser.yy" 9071 9092 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9072 9093 break; … … 9075 9096 9076 9097 /* Line 1806 of yacc.c */ 9077 #line 279 0"parser.yy"9098 #line 2793 "parser.yy" 9078 9099 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9079 9100 break; … … 9082 9103 9083 9104 /* Line 1806 of yacc.c */ 9084 #line 279 2"parser.yy"9105 #line 2795 "parser.yy" 9085 9106 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9086 9107 break; … … 9089 9110 9090 9111 /* Line 1806 of yacc.c */ 9091 #line 279 4"parser.yy"9112 #line 2797 "parser.yy" 9092 9113 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9093 9114 break; … … 9096 9117 9097 9118 /* Line 1806 of yacc.c */ 9098 #line 279 6"parser.yy"9119 #line 2799 "parser.yy" 9099 9120 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9100 9121 break; … … 9103 9124 9104 9125 /* Line 1806 of yacc.c */ 9105 #line 280 3"parser.yy"9126 #line 2806 "parser.yy" 9106 9127 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9107 9128 break; … … 9110 9131 9111 9132 /* Line 1806 of yacc.c */ 9112 #line 280 5"parser.yy"9133 #line 2808 "parser.yy" 9113 9134 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9114 9135 break; … … 9117 9138 9118 9139 /* Line 1806 of yacc.c */ 9119 #line 28 07"parser.yy"9140 #line 2810 "parser.yy" 9120 9141 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9121 9142 break; … … 9124 9145 9125 9146 /* Line 1806 of yacc.c */ 9126 #line 28 09"parser.yy"9147 #line 2812 "parser.yy" 9127 9148 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9128 9149 break; … … 9131 9152 9132 9153 /* Line 1806 of yacc.c */ 9133 #line 281 1"parser.yy"9154 #line 2814 "parser.yy" 9134 9155 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9135 9156 break; … … 9138 9159 9139 9160 /* Line 1806 of yacc.c */ 9140 #line 281 3"parser.yy"9161 #line 2816 "parser.yy" 9141 9162 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9142 9163 break; … … 9145 9166 9146 9167 /* Line 1806 of yacc.c */ 9147 #line 28 18"parser.yy"9168 #line 2821 "parser.yy" 9148 9169 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 9149 9170 break; … … 9152 9173 9153 9174 /* Line 1806 of yacc.c */ 9154 #line 282 3"parser.yy"9175 #line 2826 "parser.yy" 9155 9176 { (yyval.decl) = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), (yyvsp[(4) - (5)].decl), nullptr ); } 9156 9177 break; … … 9159 9180 9160 9181 /* Line 1806 of yacc.c */ 9161 #line 282 5"parser.yy"9182 #line 2828 "parser.yy" 9162 9183 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9163 9184 break; … … 9166 9187 9167 9188 /* Line 1806 of yacc.c */ 9168 #line 28 27"parser.yy"9189 #line 2830 "parser.yy" 9169 9190 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9170 9191 break; … … 9173 9194 9174 9195 /* Line 1806 of yacc.c */ 9175 #line 285 1"parser.yy"9196 #line 2854 "parser.yy" 9176 9197 { (yyval.en) = 0; } 9177 9198 break; … … 9180 9201 9181 9202 /* Line 1806 of yacc.c */ 9182 #line 285 3"parser.yy"9203 #line 2856 "parser.yy" 9183 9204 { (yyval.en) = (yyvsp[(2) - (2)].en); } 9184 9205 break; … … 9187 9208 9188 9209 /* Line 1806 of yacc.c */ 9189 #line 9 190"Parser/parser.cc"9210 #line 9211 "Parser/parser.cc" 9190 9211 default: break; 9191 9212 } … … 9418 9439 9419 9440 /* Line 2067 of yacc.c */ 9420 #line 285 6"parser.yy"9441 #line 2859 "parser.yy" 9421 9442 9422 9443 // ----end of grammar---- -
src/Parser/parser.yy
rd58a39a0 r7756647 379 379 { $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); } 380 380 | postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector 381 { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $5 ) ) ); } 381 382 | postfix_expression '.' INTEGERconstant 383 { $$ = new ExpressionNode( build_fieldSel( $1, build_constantInteger( *$3 ) ) ); } 382 384 | postfix_expression ARROW no_attr_identifier 383 385 { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); } 384 386 | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector 387 { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); } 385 388 | postfix_expression ICR 386 389 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); } -
src/ResolvExpr/Alternative.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Alternative.cc -- 7 // Alternative.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 12 12 // Last Modified On : Sat May 16 23:54:23 2015 13 13 // Update Count : 2 14 // 14 // 15 15 16 16 #include "Alternative.h" … … 20 20 21 21 namespace ResolvExpr { 22 Alternative::Alternative() : expr( 0 ) {}22 Alternative::Alternative() : cost( Cost::zero ), cvtCost( Cost::zero ), expr( 0 ) {} 23 23 24 24 Alternative::Alternative( Expression *expr, const TypeEnvironment &env, const Cost& cost ) … … 35 35 if ( &other == this ) return *this; 36 36 initialize( other, *this ); 37 return *this; 38 } 39 40 Alternative::Alternative( Alternative && other ) : cost( other.cost ), cvtCost( other.cvtCost ), expr( other.expr ), env( other.env ) { 41 other.expr = nullptr; 42 } 43 44 Alternative & Alternative::operator=( Alternative && other ) { 45 if ( &other == this ) return *this; 46 delete expr; 47 cost = other.cost; 48 cvtCost = other.cvtCost; 49 expr = other.expr; 50 env = other.env; 51 other.expr = nullptr; 37 52 return *this; 38 53 } … … 54 69 expr->print( os, indent ); 55 70 os << "(types:" << std::endl; 56 printAll( expr->get_results(), os, indent + 4 ); 57 os << ")" << std::endl; 71 os << std::string( indent+4, ' ' ); 72 expr->get_result()->print( os, indent + 4 ); 73 os << std::endl << ")" << std::endl; 58 74 } else { 59 75 os << "Null expression!" << std::endl; -
src/ResolvExpr/Alternative.h
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Alternative.h -- 7 // Alternative.h -- 8 8 // 9 9 // Author : Richard C. Bilson … … 12 12 // Last Modified On : Sat May 16 23:54:39 2015 13 13 // Update Count : 2 14 // 14 // 15 15 16 16 #ifndef ALTERNATIVE_H … … 32 32 Alternative( const Alternative &other ); 33 33 Alternative &operator=( const Alternative &other ); 34 Alternative( Alternative && other ); 35 Alternative &operator=( Alternative && other ); 34 36 ~Alternative(); 35 37 36 38 void initialize( const Alternative &src, Alternative &dest ); 37 39 38 40 void print( std::ostream &os, int indent = 0 ) const; 39 41 40 42 Cost cost; 41 43 Cost cvtCost; -
src/ResolvExpr/AlternativeFinder.cc
rd58a39a0 r7756647 38 38 #include "SynTree/TypeSubstitution.h" 39 39 #include "SymTab/Validate.h" 40 #include "Tuples/TupleAssignment.h" 41 #include "Tuples/NameMatcher.h" 40 #include "Tuples/Tuples.h" 42 41 #include "Common/utility.h" 43 42 #include "InitTweak/InitTweak.h" … … 64 63 } 65 64 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 66 73 namespace { 67 74 void printAlts( const AltList &list, std::ostream &os, int indent = 0 ) { … … 76 83 out.push_back( i->expr->clone() ); 77 84 } 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;86 85 } 87 86 … … 101 100 PruneStruct current( candidate ); 102 101 std::string mangleName; 103 for ( std::list< Type* >::const_iterator retType = candidate->expr->get_results().begin(); retType != candidate->expr->get_results().end(); ++retType ){104 Type * newType = (*retType)->clone();102 { 103 Type * newType = candidate->expr->get_result()->clone(); 105 104 candidate->env.apply( newType ); 106 mangleName += SymTab::Mangler::mangle( newType );105 mangleName = SymTab::Mangler::mangle( newType ); 107 106 delete newType; 108 107 } … … 133 132 if ( ! target->second.isAmbiguous ) { 134 133 Alternative &alt = *target->second.candidate; 135 for ( std::list< Type* >::iterator result = alt.expr->get_results().begin(); result != alt.expr->get_results().end(); ++result ) { 136 alt.env.applyFree( *result ); 137 } 134 alt.env.applyFree( alt.expr->get_result() ); 138 135 *out++ = alt; 139 136 } 140 137 } 141 142 }143 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 cost149 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 164 template< typename InputIterator >165 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {166 while ( begin != end ) {167 result.simpleCombine( (*begin++).env );168 }169 138 } 170 139 171 140 void renameTypes( Expression *expr ) { 172 for ( std::list< Type* >::iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) { 173 (*i)->accept( global_renamer ); 174 } 141 expr->get_result()->accept( global_renamer ); 175 142 } 176 143 } … … 204 171 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) { 205 172 if ( adjust ) { 206 adjustExprType List( i->expr->get_results().begin(), i->expr->get_results().end(), i->env, indexer );173 adjustExprType( i->expr->get_result(), i->env, indexer ); 207 174 } 208 175 } … … 241 208 242 209 template< typename StructOrUnionType > 243 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ) { 244 std::list< Declaration* > members; 245 aggInst->lookup( name, members ); 246 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 247 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 248 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 249 renameTypes( alternatives.back().expr ); 250 } else { 251 assert( false ); 252 } 210 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 211 // member must be either a tuple expression or a name expr 212 if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ) ) { 213 const std::string & name = nameExpr->get_name(); 214 std::list< Declaration* > members; 215 aggInst->lookup( name, members ); 216 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 217 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 218 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 219 renameTypes( alternatives.back().expr ); 220 } else { 221 assert( false ); 222 } 223 } 224 } else if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( member ) ) { 225 assert( false ); 226 } else { 227 // xxx - temporary 228 std::cerr << member << std::endl; 229 assertf( false, "reached unexpected case of addAggMembers" ); 253 230 } 254 231 } … … 259 236 260 237 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 ); 238 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( alt.expr ); 239 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 240 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 267 241 268 242 Cost convCost( 0, 0, 0 ); … … 270 244 std::list< DeclarationWithType* >::iterator formal = formals.begin(); 271 245 std::list< Expression* >& actuals = appExpr->get_args(); 246 247 std::list< Type * > formalTypes; 248 std::list< Type * >::iterator formalType = formalTypes.end(); 249 272 250 for ( std::list< Expression* >::iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) { 251 273 252 PRINT( 274 253 std::cerr << "actual expression:" << std::endl; 275 254 (*actualExpr)->print( std::cerr, 8 ); 276 255 std::cerr << "--- results are" << std::endl; 277 printAll( (*actualExpr)->get_results(),std::cerr, 8 );256 (*actualExpr)->get_result()->print( std::cerr, 8 ); 278 257 ) 279 258 std::list< DeclarationWithType* >::iterator startFormal = formal; 280 259 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; 260 std::list< Type * > flatActualTypes; 261 flatten( (*actualExpr)->get_result(), back_inserter( flatActualTypes ) ); 262 for ( std::list< Type* >::iterator actualType = flatActualTypes.begin(); actualType != flatActualTypes.end(); ++actualType ) { 263 264 265 // tuple handling code 266 if ( formalType == formalTypes.end() ) { 267 // the type of the formal parameter may be a tuple type. To make this easier to work with, 268 // flatten the tuple type and traverse the resulting list of types, incrementing the formal 269 // iterator once its types have been extracted. Once a particular formal parameter's type has 270 // been exhausted load the next formal parameter's type. 271 if ( formal == formals.end() ) { 272 if ( function->get_isVarArgs() ) { 273 convCost += Cost( 1, 0, 0 ); 274 break; 275 } else { 276 return Cost::infinity; 277 } 288 278 } 279 formalTypes.clear(); 280 flatten( (*formal)->get_type(), back_inserter( formalTypes ) ); 281 formalType = formalTypes.begin(); 282 ++formal; 289 283 } 284 290 285 PRINT( 291 286 std::cerr << std::endl << "converting "; 292 (*actual )->print( std::cerr, 8 );287 (*actualType)->print( std::cerr, 8 ); 293 288 std::cerr << std::endl << " to "; 294 289 (*formal)->get_type()->print( std::cerr, 8 ); 295 290 ) 296 Cost newCost = conversionCost( *actual , (*formal)->get_type(), indexer, alt.env );291 Cost newCost = conversionCost( *actualType, *formalType, indexer, alt.env ); 297 292 PRINT( 298 293 std::cerr << std::endl << "cost is" << newCost << std::endl; … … 305 300 actualCost += newCost; 306 301 307 convCost += Cost( 0, polyCost( (*formal)->get_type(), alt.env, indexer ) + polyCost( *actual, alt.env, indexer ), 0 );308 309 formal ++;302 convCost += Cost( 0, polyCost( *formalType, alt.env, indexer ) + polyCost( *actualType, alt.env, indexer ), 0 ); 303 304 formalType++; 310 305 } 311 306 if ( actualCost != Cost( 0, 0, 0 ) ) { … … 356 351 /// Adds type variables to the open variable set and marks their assertions 357 352 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ) { 358 for ( std::list< TypeDecl* >::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {353 for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) { 359 354 unifiableVars[ (*tyvar)->get_name() ] = (*tyvar)->get_kind(); 360 355 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) { … … 365 360 } 366 361 367 bool AlternativeFinder::instantiateFunction( std::list< DeclarationWithType* >& formals, /*const*/ AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave ) { 362 /// instantiate a single argument by matching actuals from [actualIt, actualEnd) against formalType, 363 /// producing expression(s) in out and their total cost in cost. 364 template< typename AltIterator, typename OutputIterator > 365 bool instantiateArgument( Type * formalType, Initializer * defaultValue, AltIterator & actualIt, AltIterator actualEnd, OpenVarSet & openVars, TypeEnvironment & resultEnv, AssertionSet & resultNeed, AssertionSet & resultHave, const SymTab::Indexer & indexer, Cost & cost, OutputIterator out ) { 366 if ( TupleType * tupleType = dynamic_cast< TupleType * >( formalType ) ) { 367 // formalType is a TupleType - group actuals into a TupleExpr whose type unifies with the TupleType 368 TupleExpr * tupleExpr = new TupleExpr(); 369 for ( Type * type : *tupleType ) { 370 if ( ! instantiateArgument( type, defaultValue, actualIt, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( tupleExpr->get_exprs() ) ) ) { 371 delete tupleExpr; 372 return false; 373 } 374 } 375 tupleExpr->set_result( Tuples::makeTupleType( tupleExpr->get_exprs() ) ); 376 *out++ = tupleExpr; 377 } else if ( actualIt != actualEnd ) { 378 // both actualType and formalType are atomic (non-tuple) types - if they unify 379 // then accept actual as an argument, otherwise return false (fail to instantiate argument) 380 Expression * actual = actualIt->expr; 381 Type * actualType = actual->get_result(); 382 PRINT( 383 std::cerr << "formal type is "; 384 formalType->print( std::cerr ); 385 std::cerr << std::endl << "actual type is "; 386 actualType->print( std::cerr ); 387 std::cerr << std::endl; 388 ) 389 if ( ! unify( formalType, actualType, resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 390 return false; 391 } 392 // move the expression from the alternative to the output iterator 393 *out++ = actual; 394 actualIt->expr = nullptr; 395 cost += actualIt->cost; 396 ++actualIt; 397 } else { 398 // End of actuals - Handle default values 399 if ( SingleInit *si = dynamic_cast<SingleInit *>( defaultValue )) { 400 // so far, only constant expressions are accepted as default values 401 if ( ConstantExpr *cnstexpr = dynamic_cast<ConstantExpr *>( si->get_value()) ) { 402 if ( Constant *cnst = dynamic_cast<Constant *>( cnstexpr->get_constant() ) ) { 403 if ( unify( formalType, cnst->get_type(), resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 404 // xxx - Don't know if this is right 405 *out++ = cnstexpr->clone(); 406 return true; 407 } // if 408 } // if 409 } // if 410 } // if 411 return false; 412 } // if 413 return true; 414 } 415 416 bool AlternativeFinder::instantiateFunction( std::list< DeclarationWithType* >& formals, const AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave, AltList & out ) { 368 417 simpleCombineEnvironments( actuals.begin(), actuals.end(), resultEnv ); 369 418 // make sure we don't widen any existing bindings … … 373 422 resultEnv.extractOpenVars( openVars ); 374 423 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 */ 383 std::list< DeclarationWithType* >::iterator formal = formals.begin(); 384 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; 388 } 389 PRINT( 390 std::cerr << "formal type is "; 391 (*formal)->get_type()->print( std::cerr ); 392 std::cerr << std::endl << "actual type is "; 393 (*actual)->print( std::cerr ); 394 std::cerr << std::endl; 395 ) 396 if ( ! unify( (*formal)->get_type(), *actual, resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 397 return false; 398 } 399 formal++; 400 } 401 } 402 // Handling of default values 403 while ( formal != formals.end() ) { 404 if ( ObjectDecl *od = dynamic_cast<ObjectDecl *>( *formal ) ) 405 if ( SingleInit *si = dynamic_cast<SingleInit *>( od->get_init() )) 406 // so far, only constant expressions are accepted as default values 407 if ( ConstantExpr *cnstexpr = dynamic_cast<ConstantExpr *>( si->get_value()) ) 408 if ( Constant *cnst = dynamic_cast<Constant *>( cnstexpr->get_constant() ) ) 409 if ( unify( (*formal)->get_type(), cnst->get_type(), resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 410 // XXX Don't know if this is right 411 actuals.push_back( Alternative( cnstexpr->clone(), env, Cost::zero ) ); 412 formal++; 413 if ( formal == formals.end()) break; 414 } 415 return false; 424 // flatten actuals so that each actual has an atomic (non-tuple) type 425 AltList exploded; 426 Tuples::explode( actuals, back_inserter( exploded ) ); 427 428 AltList::iterator actualExpr = exploded.begin(); 429 AltList::iterator actualEnd = exploded.end(); 430 for ( DeclarationWithType * formal : formals ) { 431 // match flattened actuals with formal parameters - actuals will be grouped to match 432 // with formals as appropriate 433 Cost cost; 434 std::list< Expression * > newExprs; 435 ObjectDecl * obj = safe_dynamic_cast< ObjectDecl * >( formal ); 436 if ( ! instantiateArgument( obj->get_type(), obj->get_init(), actualExpr, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( newExprs ) ) ) { 437 deleteAll( newExprs ); 438 return false; 439 } 440 // success - produce argument as a new alternative 441 assert( newExprs.size() == 1 ); 442 out.push_back( Alternative( newExprs.front(), resultEnv, cost ) ); 443 } 444 if ( actualExpr != actualEnd ) { 445 // there are still actuals remaining, but we've run out of formal parameters to match against 446 // this is okay only if the function is variadic 447 if ( ! isVarArgs ) { 448 return false; 449 } 450 out.splice( out.end(), exploded, actualExpr, actualEnd ); 416 451 } 417 452 return true; … … 500 535 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 501 536 Expression *varExpr = new VariableExpr( candDecl ); 502 deleteAll( varExpr->get_results() ); 503 varExpr->get_results().clear(); 504 varExpr->get_results().push_front( adjType->clone() ); 537 delete varExpr->get_result(); 538 varExpr->set_result( adjType->clone() ); 505 539 PRINT( 506 540 std::cerr << "satisfying assertion " << curDecl->get_uniqueId() << " "; … … 545 579 546 580 template< typename OutputIterator > 547 void AlternativeFinder::makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, AltList &actualAlt, OutputIterator out ) {581 void AlternativeFinder::makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, const AltList &actualAlt, OutputIterator out ) { 548 582 OpenVarSet openVars; 549 583 AssertionSet resultNeed, resultHave; 550 584 TypeEnvironment resultEnv; 551 585 makeUnifiableVars( funcType, openVars, resultNeed ); 552 if ( instantiateFunction( funcType->get_parameters(), actualAlt, funcType->get_isVarArgs(), openVars, resultEnv, resultNeed, resultHave ) ) { 586 AltList instantiatedActuals; // filled by instantiate function 587 if ( instantiateFunction( funcType->get_parameters(), actualAlt, funcType->get_isVarArgs(), openVars, resultEnv, resultNeed, resultHave, instantiatedActuals ) ) { 553 588 ApplicationExpr *appExpr = new ApplicationExpr( func.expr->clone() ); 554 Alternative newAlt( appExpr, resultEnv, sumCost( actualAlt) );555 makeExprList( actualAlt, appExpr->get_args() );589 Alternative newAlt( appExpr, resultEnv, sumCost( instantiatedActuals ) ); 590 makeExprList( instantiatedActuals, appExpr->get_args() ); 556 591 PRINT( 557 592 std::cerr << "need assertions:" << std::endl; … … 574 609 PointerType pt( Type::Qualifiers(), v.clone() ); 575 610 UntypedExpr *vexpr = untypedExpr->clone(); 576 vexpr-> get_results().push_front( pt.clone() );611 vexpr->set_result( pt.clone() ); 577 612 alternatives.push_back( Alternative( vexpr, env, Cost()) ); 578 613 return; … … 587 622 combos( argAlternatives.begin(), argAlternatives.end(), back_inserter( possibilities ) ); 588 623 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 ... 624 // take care of possible tuple assignments 625 // if not tuple assignment, assignment is taken care of as a normal function call 626 Tuples::handleTupleAssignment( *this, untypedExpr, possibilities ); 594 627 595 628 AltList candidates; … … 604 637 // check if the type is pointer to function 605 638 PointerType *pointer; 606 if ( func->expr->get_results().size() == 1 && ( pointer = dynamic_cast< PointerType* >( func->expr->get_results().front() ) ) ) {639 if ( ( pointer = dynamic_cast< PointerType* >( func->expr->get_result() ) ) ) { 607 640 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 608 641 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 640 673 // check if the type is pointer to function 641 674 PointerType *pointer; 642 if ( funcOp->expr->get_results().size() == 1 643 && ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_results().front() ) ) ) { 675 if ( ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result() ) ) ) { 644 676 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 645 677 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 665 697 666 698 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 ); 699 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( withFunc->expr ); 700 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 701 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 673 702 std::cerr << "Case +++++++++++++" << std::endl; 674 703 std::cerr << "formals are:" << std::endl; … … 692 721 693 722 bool isLvalue( Expression *expr ) { 694 for ( std::list< Type* >::const_iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) { 695 if ( !(*i)->get_isLvalue() ) return false; 696 } // for 697 return true; 723 // xxx - recurse into tuples? 724 return expr->has_result() && expr->get_result()->get_isLvalue(); 698 725 } 699 726 … … 709 736 710 737 void AlternativeFinder::visit( CastExpr *castExpr ) { 711 for ( std::list< Type* >::iterator i = castExpr->get_results().begin(); i != castExpr->get_results().end(); ++i ) { 712 *i = resolveTypeof( *i, indexer ); 713 SymTab::validateType( *i, &indexer ); 714 adjustExprType( *i, env, indexer ); 715 } // for 738 Type *& toType = castExpr->get_result(); 739 toType = resolveTypeof( toType, indexer ); 740 SymTab::validateType( toType, &indexer ); 741 adjustExprType( toType, env, indexer ); 716 742 717 743 AlternativeFinder finder( indexer, env ); … … 727 753 // that are cast directly. The candidate is invalid if it has fewer results than there are types to cast 728 754 // to. 729 int discardedValues = (*i).expr->get_result s().size() - castExpr->get_results().size();755 int discardedValues = (*i).expr->get_result()->size() - castExpr->get_result()->size(); 730 756 if ( discardedValues < 0 ) continue; 731 std::list< Type* >::iterator candidate_end = (*i).expr->get_results().begin(); 732 std::advance( candidate_end, castExpr->get_results().size() ); 757 // xxx - may need to go into tuple types and extract relavent types and use unifyList 733 758 // unification run for side-effects 734 unifyList( castExpr->get_results().begin(), castExpr->get_results().end(), 735 (*i).expr->get_results().begin(), candidate_end, 736 i->env, needAssertions, haveAssertions, openVars, indexer ); 737 Cost thisCost = castCostList( (*i).expr->get_results().begin(), candidate_end, 738 castExpr->get_results().begin(), castExpr->get_results().end(), 739 indexer, i->env ); 759 unify( castExpr->get_result(), (*i).expr->get_result(), i->env, needAssertions, haveAssertions, openVars, indexer ); 760 Cost thisCost = castCost( (*i).expr->get_result(), castExpr->get_result(), indexer, i->env ); 740 761 if ( thisCost != Cost::infinity ) { 741 762 // count one safe conversion for each value that is thrown away … … 760 781 761 782 for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) { 762 if ( agg->expr->get_results().size() == 1 ) { 763 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_results().front() ) ) { 764 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 765 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_results().front() ) ) { 766 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 767 } // if 783 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() ) ) { 784 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 785 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) { 786 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() ); 768 787 } // if 769 788 } // for … … 791 810 renameTypes( alternatives.back().expr ); 792 811 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { 793 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 812 NameExpr nameExpr( "" ); 813 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 794 814 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) { 795 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 815 NameExpr nameExpr( "" ); 816 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 796 817 } // if 797 818 } // for … … 894 915 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) ); 895 916 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 896 alternatives.back().expr-> get_results().push_back( (*i)->get_type()->clone() );917 alternatives.back().expr->set_result( (*i)->get_type()->clone() ); 897 918 } // for 898 919 } // if … … 917 938 finder.find( attrExpr->get_expr() ); 918 939 for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) { 919 if ( choice->expr->get_result s().size() == 1 ) {920 resolveAttr(*i, function, choice->expr->get_result s().front(), choice->env );940 if ( choice->expr->get_result()->size() == 1 ) { 941 resolveAttr(*i, function, choice->expr->get_result(), choice->env ); 921 942 } // fi 922 943 } // for … … 960 981 AssertionSet needAssertions, haveAssertions; 961 982 Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost ); 962 std::list< Type* > commonTypes;963 if ( unify List( second->expr->get_results().begin(), second->expr->get_results().end(), third->expr->get_results().begin(), third->expr->get_results().end(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonTypes) ) {983 Type* commonType; 984 if ( unify( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) { 964 985 ConditionalExpr *newExpr = new ConditionalExpr( first->expr->clone(), second->expr->clone(), third->expr->clone() ); 965 std::list< Type* >::const_iterator original = second->expr->get_results().begin(); 966 std::list< Type* >::const_iterator commonType = commonTypes.begin(); 967 for ( ; original != second->expr->get_results().end() && commonType != commonTypes.end(); ++original, ++commonType ) { 968 if ( *commonType ) { 969 newExpr->get_results().push_back( *commonType ); 970 } else { 971 newExpr->get_results().push_back( (*original)->clone() ); 972 } // if 973 } // for 986 newExpr->set_result( commonType ? commonType : second->expr->get_result()->clone() ); 974 987 newAlt.expr = newExpr; 975 988 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) ); … … 999 1012 TupleExpr *newExpr = new TupleExpr; 1000 1013 makeExprList( *i, newExpr->get_exprs() ); 1001 for ( std::list< Expression* >::const_iterator resultExpr = newExpr->get_exprs().begin(); resultExpr != newExpr->get_exprs().end(); ++resultExpr ) { 1002 for ( std::list< Type* >::const_iterator resultType = (*resultExpr)->get_results().begin(); resultType != (*resultExpr)->get_results().end(); ++resultType ) { 1003 newExpr->get_results().push_back( (*resultType)->clone() ); 1004 } // for 1005 } // for 1014 newExpr->set_result( Tuples::makeTupleType( newExpr->get_exprs() ) ); 1006 1015 1007 1016 TypeEnvironment compositeEnv; … … 1024 1033 } 1025 1034 } 1035 1036 void AlternativeFinder::visit( TupleIndexExpr *tupleExpr ) { 1037 alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) ); 1038 } 1039 1040 void AlternativeFinder::visit( TupleAssignExpr *tupleAssignExpr ) { 1041 alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) ); 1042 } 1026 1043 } // namespace ResolvExpr 1027 1044 -
src/ResolvExpr/AlternativeFinder.h
rd58a39a0 r7756647 67 67 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 68 68 virtual void visit( ConstructorExpr * ctorExpr ); 69 public: // xxx - temporary hack - should make Tuples::TupleAssignment a friend 69 virtual void visit( TupleIndexExpr *tupleExpr ); 70 virtual void visit( TupleAssignExpr *tupleExpr ); 71 /// Runs a new alternative finder on each element in [begin, end) 72 /// and writes each alternative finder to out. 70 73 template< typename InputIterator, typename OutputIterator > 71 74 void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out ); 72 75 73 private:74 76 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 75 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name);77 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); 76 78 /// Adds alternatives for offsetof expressions, given the base type and name of the member 77 79 template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name ); 78 bool instantiateFunction( std::list< DeclarationWithType* >& formals, /*const*/ AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave);80 bool instantiateFunction( std::list< DeclarationWithType* >& formals, const AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave, AltList & out ); 79 81 template< typename OutputIterator > 80 void makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, AltList &actualAlt, OutputIterator out );82 void makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, const AltList &actualAlt, OutputIterator out ); 81 83 template< typename OutputIterator > 82 84 void inferParameters( const AssertionSet &need, AssertionSet &have, const Alternative &newAlt, OpenVarSet &openVars, OutputIterator out ); … … 89 91 90 92 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ); 93 94 template< typename InputIterator, typename OutputIterator > 95 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) { 96 AltList alternatives; 97 98 // select the alternatives that have the minimum parameter cost 99 Cost minCost = Cost::infinity; 100 for ( InputIterator i = begin; i != end; ++i ) { 101 if ( i->cost < minCost ) { 102 minCost = i->cost; 103 i->cost = i->cvtCost; 104 alternatives.clear(); 105 alternatives.push_back( *i ); 106 } else if ( i->cost == minCost ) { 107 i->cost = i->cvtCost; 108 alternatives.push_back( *i ); 109 } 110 } 111 std::copy( alternatives.begin(), alternatives.end(), out ); 112 } 113 114 Cost sumCost( const AltList &in ); 115 116 template< typename InputIterator > 117 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) { 118 while ( begin != end ) { 119 result.simpleCombine( (*begin++).env ); 120 } 121 } 91 122 } // namespace ResolvExpr 92 123 -
src/ResolvExpr/AlternativePrinter.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // AlternativePrinter.cc -- 7 // AlternativePrinter.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 33 33 for ( AltList::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 34 34 os << "Alternative " << count++ << " ==============" << std::endl; 35 printAll( i->expr->get_results(),os );35 i->expr->get_result()->print( os ); 36 36 // i->print( os ); 37 37 os << std::endl; -
src/ResolvExpr/ConversionCost.cc
rd58a39a0 r7756647 240 240 std::list< Type* >::const_iterator srcIt = tupleType->get_types().begin(); 241 241 std::list< Type* >::const_iterator destIt = destAsTuple->get_types().begin(); 242 while ( srcIt != tupleType->get_types().end() ) {242 while ( srcIt != tupleType->get_types().end() && destIt != destAsTuple->get_types().end() ) { 243 243 Cost newCost = conversionCost( *srcIt++, *destIt++, indexer, env ); 244 244 if ( newCost == Cost::infinity ) { -
src/ResolvExpr/FindOpenVars.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FindOpenVars.cc -- 7 // FindOpenVars.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 47 47 void FindOpenVars::common_action( Type *type ) { 48 48 if ( nextIsOpen ) { 49 for ( std::list< TypeDecl* >::const_iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {49 for ( Type::ForallList::const_iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) { 50 50 openVars[ (*i)->get_name() ] = (*i)->get_kind(); 51 51 for ( std::list< DeclarationWithType* >::const_iterator assert = (*i)->get_assertions().begin(); assert != (*i)->get_assertions().end(); ++assert ) { … … 56 56 } 57 57 } else { 58 for ( std::list< TypeDecl* >::const_iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {58 for ( Type::ForallList::const_iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) { 59 59 closedVars[ (*i)->get_name() ] = (*i)->get_kind(); 60 60 for ( std::list< DeclarationWithType* >::const_iterator assert = (*i)->get_assertions().begin(); assert != (*i)->get_assertions().end(); ++assert ) { -
src/ResolvExpr/RenameVars.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // RenameVars.cc -- 7 // RenameVars.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 125 125 mapStack.push_front( mapStack.front() ); 126 126 // renames all "forall" type names to `_${level}_${name}' 127 for ( std::list< TypeDecl* >::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {127 for ( Type::ForallList::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) { 128 128 std::ostringstream output; 129 129 output << "_" << level << "_" << (*i)->get_name(); -
src/ResolvExpr/ResolveTypeof.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ResolveTypeof.cc -- 7 // ResolveTypeof.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 58 58 if ( typeofType->get_expr() ) { 59 59 Expression *newExpr = resolveInVoidContext( typeofType->get_expr(), indexer ); 60 assert( newExpr->get_results().size() > 0 ); 61 Type *newType; 62 if ( newExpr->get_results().size() > 1 ) { 63 TupleType *tupleType = new TupleType( Type::Qualifiers() ); 64 cloneAll( newExpr->get_results(), tupleType->get_types() ); 65 newType = tupleType; 66 } else { 67 newType = newExpr->get_results().front()->clone(); 68 } // if 60 assert( newExpr->has_result() && ! newExpr->get_result()->isVoid() ); 61 Type *newType = newExpr->get_result(); 69 62 delete typeofType; 70 63 return newType; -
src/ResolvExpr/Resolver.cc
rd58a39a0 r7756647 19 19 #include "RenameVars.h" 20 20 #include "ResolveTypeof.h" 21 #include "typeops.h" 21 22 #include "SynTree/Statement.h" 22 23 #include "SynTree/Type.h" … … 37 38 38 39 virtual void visit( FunctionDecl *functionDecl ); 39 virtual void visit( ObjectDecl * functionDecl );40 virtual void visit( ObjectDecl *objectDecl ); 40 41 virtual void visit( TypeDecl *typeDecl ); 41 42 virtual void visit( EnumDecl * enumDecl ); … … 67 68 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 68 69 void fallbackInit( ConstructorInit * ctorInit ); 69 std::list< Type * >functionReturn;70 Type * functionReturn; 70 71 Type *initContext; 71 72 Type *switchType; … … 157 158 const TypeEnvironment *newEnv = 0; 158 159 for ( AltList::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 159 if ( i->expr->get_result s().size() == 1 && isIntegralType( i->expr->get_results().front() ) ) {160 if ( i->expr->get_result()->size() == 1 && isIntegralType( i->expr->get_result() ) ) { 160 161 if ( newExpr ) { 161 162 throw SemanticError( "Too many interpretations for case control expression", untyped ); … … 234 235 Type *new_type = resolveTypeof( functionDecl->get_type(), *this ); 235 236 functionDecl->set_type( new_type ); 236 std::list< Type * > oldFunctionReturn = functionReturn; 237 functionReturn.clear(); 238 for ( std::list< DeclarationWithType * >::const_iterator i = functionDecl->get_functionType()->get_returnVals().begin(); i != functionDecl->get_functionType()->get_returnVals().end(); ++i ) { 239 functionReturn.push_back( (*i)->get_type() ); 240 } // for 237 ValueGuard< Type * > oldFunctionReturn( functionReturn ); 238 functionReturn = ResolvExpr::extractResultType( functionDecl->get_functionType() ); 241 239 SymTab::Indexer::visit( functionDecl ); 242 functionReturn = oldFunctionReturn;243 240 } 244 241 … … 338 335 void Resolver::visit( ReturnStmt *returnStmt ) { 339 336 if ( returnStmt->get_expr() ) { 340 CastExpr *castExpr = new CastExpr( returnStmt->get_expr() ); 341 cloneAll( functionReturn, castExpr->get_results() ); 337 CastExpr *castExpr = new CastExpr( returnStmt->get_expr(), functionReturn->clone() ); 342 338 Expression *newExpr = findSingleExpression( castExpr, *this ); 343 339 delete castExpr; … … 384 380 if ( isCharType( at->get_base() ) ) { 385 381 // check if the resolved type is char * 386 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result s().front() ) ) {382 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) { 387 383 if ( isCharType( pt->get_base() ) ) { 388 384 // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello"; … … 446 442 (*iter)->accept( *this ); 447 443 } // for 444 } else if ( TupleType * tt = dynamic_cast< TupleType * > ( initContext ) ) { 445 for ( Type * t : *tt ) { 446 if ( iter == end ) break; 447 initContext = t; 448 (*iter++)->accept( *this ); 449 } 448 450 } else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) { 449 451 resolveAggrInit( st->get_baseStruct(), iter, end ); -
src/ResolvExpr/TypeEnvironment.cc
rd58a39a0 r7756647 158 158 } 159 159 160 void TypeEnvironment::add( const std::list< TypeDecl* >&tyDecls ) {161 for ( std::list< TypeDecl* >::const_iterator i = tyDecls.begin(); i != tyDecls.end(); ++i ) {160 void TypeEnvironment::add( const Type::ForallList &tyDecls ) { 161 for ( Type::ForallList::const_iterator i = tyDecls.begin(); i != tyDecls.end(); ++i ) { 162 162 EqvClass newClass; 163 163 newClass.vars.insert( (*i)->get_name() ); -
src/ResolvExpr/TypeEnvironment.h
rd58a39a0 r7756647 55 55 bool lookup( const std::string &var, EqvClass &eqvClass ) const; 56 56 void add( const EqvClass &eqvClass ); 57 void add( const std::list< TypeDecl* >&tyDecls );57 void add( const Type::ForallList &tyDecls ); 58 58 template< typename SynTreeClass > int apply( SynTreeClass *&type ) const; 59 59 template< typename SynTreeClass > int applyFree( SynTreeClass *&type ) const; -
src/ResolvExpr/Unify.cc
rd58a39a0 r7756647 598 598 } 599 599 600 // xxx - compute once and store in the FunctionType? 601 Type * extractResultType( FunctionType * function ) { 602 if ( function->get_returnVals().size() == 0 ) { 603 return new VoidType( Type::Qualifiers() ); 604 } else if ( function->get_returnVals().size() == 1 ) { 605 return function->get_returnVals().front()->get_type()->clone(); 606 } else { 607 TupleType * tupleType = new TupleType( Type::Qualifiers() ); 608 for ( DeclarationWithType * decl : function->get_returnVals() ) { 609 tupleType->get_types().push_back( decl->get_type()->clone() ); 610 } // for 611 return tupleType; 612 } 613 } 600 614 } // namespace ResolvExpr 601 615 -
src/ResolvExpr/typeops.h
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // typeops.h -- 7 // typeops.h -- 8 8 // 9 9 // Author : Richard C. Bilson … … 30 30 typedef typename InputIterator::value_type SetType; 31 31 typedef typename std::list< typename SetType::value_type > ListType; 32 32 33 33 if ( begin == end ) { 34 34 *out++ = ListType(); 35 35 return; 36 36 } // if 37 37 38 38 InputIterator current = begin; 39 39 begin++; … … 41 41 std::list< ListType > recursiveResult; 42 42 combos( begin, end, back_inserter( recursiveResult ) ); 43 43 44 44 for ( typename std::list< ListType >::const_iterator i = recursiveResult.begin(); i != recursiveResult.end(); ++i ) { 45 45 for ( typename ListType::const_iterator j = current->begin(); j != current->end(); ++j ) { … … 52 52 } // for 53 53 } 54 54 55 55 // in AdjustExprType.cc 56 56 /// Replaces array types with the equivalent pointer, and function types with a pointer-to-function … … 144 144 } 145 145 146 /// creates the type represented by the list of returnVals in a FunctionType. The caller owns the return value. 147 Type * extractResultType( FunctionType * functionType ); 148 146 149 // in CommonType.cc 147 150 Type *commonType( Type *type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ); … … 152 155 // in Occurs.cc 153 156 bool occurs( Type *type, std::string varName, const TypeEnvironment &env ); 157 158 // flatten tuple type into list of types 159 template< typename OutputIterator > 160 void flatten( Type * type, OutputIterator out ) { 161 if ( TupleType * tupleType = dynamic_cast< TupleType * >( type ) ) { 162 for ( Type * t : tupleType->get_types() ) { 163 flatten( t, out ); 164 } 165 } else { 166 *out++ = type; 167 } 168 } 154 169 } // namespace ResolvExpr 155 170 -
src/SymTab/Autogen.cc
rd58a39a0 r7756647 116 116 // This happens before function pointer type conversion, so need to do it manually here 117 117 VariableExpr * assignVarExpr = new VariableExpr( assignDecl ); 118 Type * & assignVarExprType = assignVarExpr->get_results().front();118 Type * assignVarExprType = assignVarExpr->get_result(); 119 119 assignVarExprType = new PointerType( Type::Qualifiers(), assignVarExprType ); 120 assignVarExpr->set_result( assignVarExprType ); 120 121 ApplicationExpr * assignExpr = new ApplicationExpr( assignVarExpr ); 121 122 assignExpr->get_args().push_back( new VariableExpr( dstParam ) ); -
src/SymTab/Indexer.cc
rd58a39a0 r7756647 40 40 41 41 namespace SymTab { 42 template< typename Container, typename VisitorType >43 inline void accept AllNewScope( Container &container, VisitorType &visitor ) {42 template< typename TreeType, typename VisitorType > 43 inline void acceptNewScope( TreeType *tree, VisitorType &visitor ) { 44 44 visitor.enterScope(); 45 acceptAll( container, visitor );45 maybeAccept( tree, visitor ); 46 46 visitor.leaveScope(); 47 47 } … … 143 143 for ( DeclarationWithType * decl : copy ) { 144 144 if ( FunctionDecl * function = dynamic_cast< FunctionDecl * >( decl ) ) { 145 std::list< DeclarationWithType * > params = function->get_functionType()->get_parameters();145 std::list< DeclarationWithType * > & params = function->get_functionType()->get_parameters(); 146 146 assert( ! params.empty() ); 147 147 // use base type of pointer, so that qualifiers on the pointer type aren't considered. … … 337 337 338 338 void Indexer::visit( ApplicationExpr *applicationExpr ) { 339 accept AllNewScope( applicationExpr->get_results(), *this );339 acceptNewScope( applicationExpr->get_result(), *this ); 340 340 maybeAccept( applicationExpr->get_function(), *this ); 341 341 acceptAll( applicationExpr->get_args(), *this ); … … 343 343 344 344 void Indexer::visit( UntypedExpr *untypedExpr ) { 345 accept AllNewScope( untypedExpr->get_results(), *this );345 acceptNewScope( untypedExpr->get_result(), *this ); 346 346 acceptAll( untypedExpr->get_args(), *this ); 347 347 } 348 348 349 349 void Indexer::visit( NameExpr *nameExpr ) { 350 accept AllNewScope( nameExpr->get_results(), *this );350 acceptNewScope( nameExpr->get_result(), *this ); 351 351 } 352 352 353 353 void Indexer::visit( AddressExpr *addressExpr ) { 354 accept AllNewScope( addressExpr->get_results(), *this );354 acceptNewScope( addressExpr->get_result(), *this ); 355 355 maybeAccept( addressExpr->get_arg(), *this ); 356 356 } 357 357 358 358 void Indexer::visit( LabelAddressExpr *labAddressExpr ) { 359 accept AllNewScope( labAddressExpr->get_results(), *this );359 acceptNewScope( labAddressExpr->get_result(), *this ); 360 360 maybeAccept( labAddressExpr->get_arg(), *this ); 361 361 } 362 362 363 363 void Indexer::visit( CastExpr *castExpr ) { 364 accept AllNewScope( castExpr->get_results(), *this );364 acceptNewScope( castExpr->get_result(), *this ); 365 365 maybeAccept( castExpr->get_arg(), *this ); 366 366 } 367 367 368 368 void Indexer::visit( UntypedMemberExpr *memberExpr ) { 369 accept AllNewScope( memberExpr->get_results(), *this );369 acceptNewScope( memberExpr->get_result(), *this ); 370 370 maybeAccept( memberExpr->get_aggregate(), *this ); 371 371 } 372 372 373 373 void Indexer::visit( MemberExpr *memberExpr ) { 374 accept AllNewScope( memberExpr->get_results(), *this );374 acceptNewScope( memberExpr->get_result(), *this ); 375 375 maybeAccept( memberExpr->get_aggregate(), *this ); 376 376 } 377 377 378 378 void Indexer::visit( VariableExpr *variableExpr ) { 379 accept AllNewScope( variableExpr->get_results(), *this );379 acceptNewScope( variableExpr->get_result(), *this ); 380 380 } 381 381 382 382 void Indexer::visit( ConstantExpr *constantExpr ) { 383 accept AllNewScope( constantExpr->get_results(), *this );383 acceptNewScope( constantExpr->get_result(), *this ); 384 384 maybeAccept( constantExpr->get_constant(), *this ); 385 385 } 386 386 387 387 void Indexer::visit( SizeofExpr *sizeofExpr ) { 388 accept AllNewScope( sizeofExpr->get_results(), *this );388 acceptNewScope( sizeofExpr->get_result(), *this ); 389 389 if ( sizeofExpr->get_isType() ) { 390 390 maybeAccept( sizeofExpr->get_type(), *this ); … … 395 395 396 396 void Indexer::visit( AlignofExpr *alignofExpr ) { 397 accept AllNewScope( alignofExpr->get_results(), *this );397 acceptNewScope( alignofExpr->get_result(), *this ); 398 398 if ( alignofExpr->get_isType() ) { 399 399 maybeAccept( alignofExpr->get_type(), *this ); … … 404 404 405 405 void Indexer::visit( UntypedOffsetofExpr *offsetofExpr ) { 406 accept AllNewScope( offsetofExpr->get_results(), *this );406 acceptNewScope( offsetofExpr->get_result(), *this ); 407 407 maybeAccept( offsetofExpr->get_type(), *this ); 408 408 } 409 409 410 410 void Indexer::visit( OffsetofExpr *offsetofExpr ) { 411 accept AllNewScope( offsetofExpr->get_results(), *this );411 acceptNewScope( offsetofExpr->get_result(), *this ); 412 412 maybeAccept( offsetofExpr->get_type(), *this ); 413 413 maybeAccept( offsetofExpr->get_member(), *this ); … … 415 415 416 416 void Indexer::visit( OffsetPackExpr *offsetPackExpr ) { 417 accept AllNewScope( offsetPackExpr->get_results(), *this );417 acceptNewScope( offsetPackExpr->get_result(), *this ); 418 418 maybeAccept( offsetPackExpr->get_type(), *this ); 419 419 } 420 420 421 421 void Indexer::visit( AttrExpr *attrExpr ) { 422 accept AllNewScope( attrExpr->get_results(), *this );422 acceptNewScope( attrExpr->get_result(), *this ); 423 423 if ( attrExpr->get_isType() ) { 424 424 maybeAccept( attrExpr->get_type(), *this ); … … 429 429 430 430 void Indexer::visit( LogicalExpr *logicalExpr ) { 431 accept AllNewScope( logicalExpr->get_results(), *this );431 acceptNewScope( logicalExpr->get_result(), *this ); 432 432 maybeAccept( logicalExpr->get_arg1(), *this ); 433 433 maybeAccept( logicalExpr->get_arg2(), *this ); … … 435 435 436 436 void Indexer::visit( ConditionalExpr *conditionalExpr ) { 437 accept AllNewScope( conditionalExpr->get_results(), *this );437 acceptNewScope( conditionalExpr->get_result(), *this ); 438 438 maybeAccept( conditionalExpr->get_arg1(), *this ); 439 439 maybeAccept( conditionalExpr->get_arg2(), *this ); … … 442 442 443 443 void Indexer::visit( CommaExpr *commaExpr ) { 444 accept AllNewScope( commaExpr->get_results(), *this );444 acceptNewScope( commaExpr->get_result(), *this ); 445 445 maybeAccept( commaExpr->get_arg1(), *this ); 446 446 maybeAccept( commaExpr->get_arg2(), *this ); … … 448 448 449 449 void Indexer::visit( TupleExpr *tupleExpr ) { 450 accept AllNewScope( tupleExpr->get_results(), *this );450 acceptNewScope( tupleExpr->get_result(), *this ); 451 451 acceptAll( tupleExpr->get_exprs(), *this ); 452 452 } 453 453 454 void Indexer::visit( SolvedTupleExpr *tupleExpr ) { 455 acceptAllNewScope( tupleExpr->get_results(), *this ); 456 acceptAll( tupleExpr->get_exprs(), *this ); 454 void Indexer::visit( TupleAssignExpr *tupleExpr ) { 455 acceptNewScope( tupleExpr->get_result(), *this ); 456 enterScope(); 457 acceptAll( tupleExpr->get_tempDecls(), *this ); 458 acceptAll( tupleExpr->get_assigns(), *this ); 459 leaveScope(); 457 460 } 458 461 459 462 void Indexer::visit( TypeExpr *typeExpr ) { 460 accept AllNewScope( typeExpr->get_results(), *this );463 acceptNewScope( typeExpr->get_result(), *this ); 461 464 maybeAccept( typeExpr->get_type(), *this ); 462 465 } … … 469 472 470 473 void Indexer::visit( UntypedValofExpr *valofExpr ) { 471 accept AllNewScope( valofExpr->get_results(), *this );474 acceptNewScope( valofExpr->get_result(), *this ); 472 475 maybeAccept( valofExpr->get_body(), *this ); 473 476 } -
src/SymTab/Indexer.h
rd58a39a0 r7756647 64 64 virtual void visit( ConditionalExpr *conditionalExpr ); 65 65 virtual void visit( CommaExpr *commaExpr ); 66 virtual void visit( TupleExpr *tupleExpr );67 virtual void visit( SolvedTupleExpr *tupleExpr );68 66 virtual void visit( TypeExpr *typeExpr ); 69 67 virtual void visit( AsmExpr *asmExpr ); 70 68 virtual void visit( UntypedValofExpr *valofExpr ); 69 virtual void visit( TupleExpr *tupleExpr ); 70 virtual void visit( TupleAssignExpr *tupleExpr ); 71 71 72 72 virtual void visit( TraitInstType *contextInst ); -
src/SymTab/Mangler.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Mangler.cc -- 7 // Mangler.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 35 35 return mangler.get_mangleName(); 36 36 } 37 37 38 38 Mangler::Mangler( bool mangleOverridable, bool typeMode ) 39 39 : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ) {} 40 40 41 41 Mangler::Mangler( const Mangler &rhs ) : mangleName() { 42 42 varNums = rhs.varNums; … … 115 115 "Ir", // LongDoubleImaginary 116 116 }; 117 117 118 118 printQualifiers( basicType ); 119 119 mangleName << btLetter[ basicType->get_kind() ]; … … 253 253 // skip if not including qualifiers 254 254 if ( typeMode ) return; 255 255 256 256 if ( ! type->get_forall().empty() ) { 257 257 std::list< std::string > assertionNames; 258 258 int tcount = 0, dcount = 0, fcount = 0; 259 259 mangleName << "A"; 260 for ( std::list< TypeDecl* >::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {260 for ( Type::ForallList::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) { 261 261 switch ( (*i)->get_kind() ) { 262 262 case TypeDecl::Any: -
src/SymTab/Validate.cc
rd58a39a0 r7756647 23 23 // - All enumeration constants have type EnumInstType. 24 24 // 25 // - The type "void" never occurs in lists of function parameter or return types ; neither do tuple types. A function26 // taking no arguments has no argument types , and tuples are flattened.25 // - The type "void" never occurs in lists of function parameter or return types. A function 26 // taking no arguments has no argument types. 27 27 // 28 28 // - No context instances exist; they are all replaced by the set of declarations signified by the context, instantiated … … 429 429 /// Fix up assertions 430 430 void forallFixer( Type *func ) { 431 for ( std::list< TypeDecl * >::iterator type = func->get_forall().begin(); type != func->get_forall().end(); ++type ) {431 for ( Type::ForallList::iterator type = func->get_forall().begin(); type != func->get_forall().end(); ++type ) { 432 432 std::list< DeclarationWithType * > toBeDone, nextRound; 433 433 toBeDone.splice( toBeDone.end(), (*type )->get_assertions() ); -
src/SynTree/AddressExpr.cc
rd58a39a0 r7756647 19 19 20 20 AddressExpr::AddressExpr( Expression *arg, Expression *_aname ) : Expression( _aname ), arg( arg ) { 21 for ( std::list< Type* >::const_iterator i = arg->get_results().begin(); i != arg->get_results().end(); ++i) {22 get_results().push_back( new PointerType( Type::Qualifiers(), (*i)->clone() ) );23 } // for21 if ( arg->has_result() ) { 22 set_result( new PointerType( Type::Qualifiers(), arg->get_result()->clone() ) ); 23 } 24 24 } 25 25 … … 35 35 if ( arg ) { 36 36 os << std::string( indent+2, ' ' ); 37 37 arg->print( os, indent+2 ); 38 38 } // if 39 39 } -
src/SynTree/ApplicationExpr.cc
rd58a39a0 r7756647 21 21 #include "TypeSubstitution.h" 22 22 #include "Common/utility.h" 23 23 #include "ResolvExpr/typeops.h" 24 24 25 25 ParamEntry::ParamEntry( const ParamEntry &other ) : … … 43 43 44 44 ApplicationExpr::ApplicationExpr( Expression *funcExpr ) : function( funcExpr ) { 45 PointerType *pointer = dynamic_cast< PointerType* >( funcExpr->get_results().front() ); 46 assert( pointer ); 47 FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ); 48 assert( function ); 45 PointerType *pointer = safe_dynamic_cast< PointerType* >( funcExpr->get_result() ); 46 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 49 47 50 for ( std::list< DeclarationWithType* >::const_iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) {51 get_results().push_back( (*i)->get_type()->clone() ); 52 } // for48 set_result( ResolvExpr::extractResultType( function ) ); 49 50 assert( has_result() ); 53 51 } 54 52 -
src/SynTree/CommaExpr.cc
rd58a39a0 r7756647 23 23 // to false on all result types. Actually doing this causes some strange things 24 24 // to happen in later passes (particularly, Specialize, Lvalue, and Box). This needs to be looked into. 25 cloneAll( arg2->get_results(), get_results() ); 26 // for ( Type *& type : get_results() ) { 27 // type->set_isLvalue( false ); 28 // } 25 set_result( maybeClone( arg2->get_result() ) ); 26 // get_type->set_isLvalue( false ); 29 27 } 30 28 -
src/SynTree/Expression.cc
rd58a39a0 r7756647 31 31 32 32 33 Expression::Expression( Expression *_aname ) : env( 0 ), argName( _aname ) {} 34 35 Expression::Expression( const Expression &other ) : env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) { 36 cloneAll( other.results, results ); 33 Expression::Expression( Expression *_aname ) : result( 0 ), env( 0 ), argName( _aname ) {} 34 35 Expression::Expression( const Expression &other ) : result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) { 37 36 } 38 37 … … 40 39 delete env; 41 40 delete argName; // xxx -- there's a problem in cloning ConstantExpr I still don't know how to fix 42 deleteAll( results ); 43 } 44 45 void Expression::add_result( Type *t ) { 46 if ( TupleType *tuple = dynamic_cast< TupleType* >( t ) ) { 47 std::copy( tuple->get_types().begin(), tuple->get_types().end(), back_inserter( results ) ); 48 } else { 49 results.push_back(t); 50 } // if 41 delete result; 51 42 } 52 43 … … 68 59 69 60 ConstantExpr::ConstantExpr( Constant _c, Expression *_aname ) : Expression( _aname ), constant( _c ) { 70 add_result( constant.get_type()->clone() );61 set_result( constant.get_type()->clone() ); 71 62 } 72 63 … … 85 76 assert( var ); 86 77 assert( var->get_type() ); 87 add_result( var->get_type()->clone() ); 88 for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) { 89 (*i)->set_isLvalue( true ); 90 } // for 78 Type * type = var->get_type()->clone(); 79 type->set_isLvalue( true ); 80 set_result( type ); 91 81 } 92 82 … … 110 100 SizeofExpr::SizeofExpr( Expression *expr_, Expression *_aname ) : 111 101 Expression( _aname ), expr(expr_), type(0), isType(false) { 112 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );102 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 113 103 } 114 104 115 105 SizeofExpr::SizeofExpr( Type *type_, Expression *_aname ) : 116 106 Expression( _aname ), expr(0), type(type_), isType(true) { 117 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );107 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 118 108 } 119 109 … … 141 131 AlignofExpr::AlignofExpr( Expression *expr_, Expression *_aname ) : 142 132 Expression( _aname ), expr(expr_), type(0), isType(false) { 143 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );133 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 144 134 } 145 135 146 136 AlignofExpr::AlignofExpr( Type *type_, Expression *_aname ) : 147 137 Expression( _aname ), expr(0), type(type_), isType(true) { 148 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );138 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 149 139 } 150 140 … … 172 162 UntypedOffsetofExpr::UntypedOffsetofExpr( Type *type_, const std::string &member_, Expression *_aname ) : 173 163 Expression( _aname ), type(type_), member(member_) { 174 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );164 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 175 165 } 176 166 … … 197 187 OffsetofExpr::OffsetofExpr( Type *type_, DeclarationWithType *member_, Expression *_aname ) : 198 188 Expression( _aname ), type(type_), member(member_) { 199 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );189 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 200 190 } 201 191 … … 229 219 230 220 OffsetPackExpr::OffsetPackExpr( StructInstType *type_, Expression *aname_ ) : Expression( aname_ ), type( type_ ) { 231 add_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) );221 set_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) ); 232 222 } 233 223 … … 284 274 285 275 CastExpr::CastExpr( Expression *arg_, Type *toType, Expression *_aname ) : Expression( _aname ), arg(arg_) { 286 add_result(toType);276 set_result(toType); 287 277 } 288 278 289 279 CastExpr::CastExpr( Expression *arg_, Expression *_aname ) : Expression( _aname ), arg(arg_) { 280 set_result( new VoidType( Type::Qualifiers() ) ); 290 281 } 291 282 … … 303 294 arg->print(os, indent+2); 304 295 os << std::endl << std::string( indent, ' ' ) << "to:" << std::endl; 305 if ( results.empty() ) { 306 os << std::string( indent+2, ' ' ) << "nothing" << std::endl; 296 os << std::string( indent+2, ' ' ); 297 if ( result->isVoid() ) { 298 os << "nothing"; 307 299 } else { 308 printAll(results, os, indent+2);300 result->print( os, indent+2 ); 309 301 } // if 310 Expression::print( os, indent ); 311 } 312 313 UntypedMemberExpr::UntypedMemberExpr( std::string _member, Expression *_aggregate, Expression *_aname ) : 302 os << std::endl; 303 Expression::print( os, indent ); 304 } 305 306 UntypedMemberExpr::UntypedMemberExpr( Expression * _member, Expression *_aggregate, Expression *_aname ) : 314 307 Expression( _aname ), member(_member), aggregate(_aggregate) {} 315 308 316 309 UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr &other ) : 317 Expression( other ), member( other.member), aggregate( maybeClone( other.aggregate ) ) {310 Expression( other ), member( maybeClone( other.member ) ), aggregate( maybeClone( other.aggregate ) ) { 318 311 } 319 312 320 313 UntypedMemberExpr::~UntypedMemberExpr() { 321 314 delete aggregate; 315 delete member; 322 316 } 323 317 324 318 void UntypedMemberExpr::print( std::ostream &os, int indent ) const { 325 os << "Untyped Member Expression, with field: " << get_member(); 319 os << "Untyped Member Expression, with field: " << std::endl; 320 os << std::string( indent+2, ' ' ); 321 get_member()->print(os, indent+4); 322 os << std::string( indent+2, ' ' ); 326 323 327 324 Expression *agg = get_aggregate(); 328 os << " , from aggregate: ";325 os << "from aggregate: " << std::endl; 329 326 if (agg != 0) { 330 os << std::string( indent + 2, ' ' );331 agg->print(os, indent + 2);327 os << std::string( indent + 4, ' ' ); 328 agg->print(os, indent + 4); 332 329 } 333 330 os << std::string( indent+2, ' ' ); … … 338 335 MemberExpr::MemberExpr( DeclarationWithType *_member, Expression *_aggregate, Expression *_aname ) : 339 336 Expression( _aname ), member(_member), aggregate(_aggregate) { 340 add_result( member->get_type()->clone() ); 341 for ( std::list< Type* >::iterator i = get_results().begin(); i != get_results().end(); ++i ) { 342 (*i)->set_isLvalue( true ); 343 } // for 337 set_result( member->get_type()->clone() ); 338 get_result()->set_isLvalue( true ); 344 339 } 345 340 … … 372 367 } 373 368 374 375 UntypedExpr::UntypedExpr( Expression *_function, Expression *_aname ) : Expression( _aname ), function( _function) {}369 UntypedExpr::UntypedExpr( Expression *_function, const std::list<Expression *> &_args, Expression *_aname ) : 370 Expression( _aname ), function(_function), args(_args) {} 376 371 377 372 UntypedExpr::UntypedExpr( const UntypedExpr &other ) : … … 379 374 cloneAll( other.args, args ); 380 375 } 381 382 UntypedExpr::UntypedExpr( Expression *_function, std::list<Expression *> &_args, Expression *_aname ) :383 Expression( _aname ), function(_function), args(_args) {}384 376 385 377 UntypedExpr::~UntypedExpr() { … … 419 411 LogicalExpr::LogicalExpr( Expression *arg1_, Expression *arg2_, bool andp, Expression *_aname ) : 420 412 Expression( _aname ), arg1(arg1_), arg2(arg2_), isAnd(andp) { 421 add_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );413 set_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 422 414 } 423 415 … … 477 469 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( ApplicationExpr * callExpr ) : callExpr( callExpr ) { 478 470 assert( callExpr ); 479 cloneAll( callExpr->get_results(), results ); 471 assert( callExpr->has_result() ); 472 set_result( callExpr->get_result()->clone() ); 480 473 } 481 474 … … 510 503 Expression * arg = InitTweak::getCallArg( callExpr, 0 ); 511 504 assert( arg ); 512 cloneAll( arg->get_results(), results);505 set_result( maybeClone( arg->get_result() ) ); 513 506 } 514 507 … … 530 523 531 524 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) { 532 add_result( type->clone() ); 533 } 534 535 CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {} 525 assert( type && initializer ); 526 set_result( type->clone() ); 527 } 528 529 CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( other.type->clone() ), initializer( other.initializer->clone() ) {} 536 530 537 531 CompoundLiteralExpr::~CompoundLiteralExpr() { … … 542 536 void CompoundLiteralExpr::print( std::ostream &os, int indent ) const { 543 537 os << "Compound Literal Expression: " << std::endl; 544 if ( type ) type->print( os, indent + 2 ); 545 if ( initializer ) initializer->print( os, indent + 2 ); 538 os << std::string( indent+2, ' ' ); 539 type->print( os, indent + 2 ); 540 os << std::string( indent+2, ' ' ); 541 initializer->print( os, indent + 2 ); 546 542 } 547 543 … … 557 553 558 554 RangeExpr::RangeExpr( Expression *low, Expression *high ) : low( low ), high( high ) {} 559 RangeExpr::RangeExpr( const RangeExpr &other ) : low( other.low->clone() ), high( other.high->clone() ) {}555 RangeExpr::RangeExpr( const RangeExpr &other ) : Expression( other ), low( other.low->clone() ), high( other.high->clone() ) {} 560 556 void RangeExpr::print( std::ostream &os, int indent ) const { 561 os << std::string( indent, ' ' ) <<"Range Expression: ";557 os << "Range Expression: "; 562 558 low->print( os, indent ); 563 559 os << " ... "; 564 560 high->print( os, indent ); 561 } 562 563 StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) { 564 assert( statements ); 565 std::list< Statement * > & body = statements->get_kids(); 566 if ( ! body.empty() ) { 567 if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) { 568 set_result( maybeClone( exprStmt->get_expr()->get_result() ) ); 569 } 570 } 571 } 572 StmtExpr::StmtExpr( const StmtExpr &other ) : Expression( other ), statements( other.statements->clone() ) {} 573 StmtExpr::~StmtExpr() { 574 delete statements; 575 } 576 void StmtExpr::print( std::ostream &os, int indent ) const { 577 os << "Statement Expression: " << std::endl << std::string( indent, ' ' ); 578 statements->print( os, indent+2 ); 579 } 580 581 582 UniqueExpr::UniqueExpr( Expression *expr ) : expr( new Expression* ) { 583 set_expr( expr ); 584 assert( expr ); 585 assert( expr->has_result() ); 586 set_result( expr->get_result()->clone() ); 587 } 588 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ) { 589 } 590 UniqueExpr::~UniqueExpr() { 591 if ( expr.unique() ) { 592 delete *expr; 593 } 594 } 595 void UniqueExpr::print( std::ostream &os, int indent ) const { 596 os << "Unique Expression: " << std::endl << std::string( indent+2, ' ' ); 597 get_expr()->print( os, indent+2 ); 565 598 } 566 599 -
src/SynTree/Expression.h
rd58a39a0 r7756647 32 32 virtual ~Expression(); 33 33 34 std::list<Type *>& get_results() { return results; } 35 void add_result( Type *t ); 34 Type *& get_result() { return result; } 35 void set_result( Type *newValue ) { result = newValue; } 36 bool has_result() const { return result != nullptr; } 36 37 37 38 TypeSubstitution *get_env() const { return env; } … … 47 48 virtual void print( std::ostream &os, int indent = 0 ) const; 48 49 protected: 49 std::list<Type *> results;50 Type * result; 50 51 TypeSubstitution *env; 51 52 Expression* argName; // if expression is used as an argument, it can be "designated" by this name … … 98 99 class UntypedExpr : public Expression { 99 100 public: 100 UntypedExpr( Expression *function, Expression *_aname = nullptr );101 UntypedExpr( Expression *function, const std::list<Expression *> &args = std::list< Expression * >(), Expression *_aname = nullptr ); 101 102 UntypedExpr( const UntypedExpr &other ); 102 UntypedExpr( Expression *function, std::list<Expression *> &args, Expression *_aname = nullptr );103 103 virtual ~UntypedExpr(); 104 104 … … 200 200 class UntypedMemberExpr : public Expression { 201 201 public: 202 UntypedMemberExpr( std::stringmember, Expression *aggregate, Expression *_aname = nullptr );202 UntypedMemberExpr( Expression *member, Expression *aggregate, Expression *_aname = nullptr ); 203 203 UntypedMemberExpr( const UntypedMemberExpr &other ); 204 204 virtual ~UntypedMemberExpr(); 205 205 206 std::stringget_member() const { return member; }207 void set_member( const std::string &newValue ) { member = newValue; }206 Expression * get_member() const { return member; } 207 void set_member( Expression * newValue ) { member = newValue; } 208 208 Expression *get_aggregate() const { return aggregate; } 209 209 void set_aggregate( Expression *newValue ) { aggregate = newValue; } … … 214 214 virtual void print( std::ostream &os, int indent = 0 ) const; 215 215 private: 216 std::stringmember;216 Expression *member; 217 217 Expression *aggregate; 218 218 }; … … 483 483 }; 484 484 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 on504 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 521 485 /// TypeExpr represents a type used in an expression (e.g. as a type generator parameter) 522 486 class TypeExpr : public Expression { … … 618 582 CompoundLiteralExpr( Type * type, Initializer * initializer ); 619 583 CompoundLiteralExpr( const CompoundLiteralExpr &other ); 620 ~CompoundLiteralExpr();584 virtual ~CompoundLiteralExpr(); 621 585 622 586 Type * get_type() const { return type; } … … 670 634 private: 671 635 Expression *low, *high; 636 }; 637 638 /// TupleExpr represents a tuple expression ( [a, b, c] ) 639 class TupleExpr : public Expression { 640 public: 641 TupleExpr( const std::list< Expression * > & exprs = std::list< Expression * >(), Expression *_aname = nullptr ); 642 TupleExpr( const TupleExpr &other ); 643 virtual ~TupleExpr(); 644 645 void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; } 646 std::list<Expression*>& get_exprs() { return exprs; } 647 648 virtual TupleExpr *clone() const { return new TupleExpr( *this ); } 649 virtual void accept( Visitor &v ) { v.visit( this ); } 650 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 651 virtual void print( std::ostream &os, int indent = 0 ) const; 652 private: 653 std::list<Expression*> exprs; 654 }; 655 656 /// TupleIndexExpr represents an element selection operation on a tuple value, e.g. t.3 after processing by the expression analyzer 657 class TupleIndexExpr : public Expression { 658 public: 659 TupleIndexExpr( Expression * tuple, unsigned int index ); 660 TupleIndexExpr( const TupleIndexExpr &other ); 661 virtual ~TupleIndexExpr(); 662 663 Expression * get_tuple() const { return tuple; } 664 int get_index() const { return index; } 665 TupleIndexExpr * set_tuple( Expression *newValue ) { tuple = newValue; return this; } 666 TupleIndexExpr * set_index( unsigned int newValue ) { index = newValue; return this; } 667 668 virtual TupleIndexExpr *clone() const { return new TupleIndexExpr( *this ); } 669 virtual void accept( Visitor &v ) { v.visit( this ); } 670 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 671 virtual void print( std::ostream &os, int indent = 0 ) const; 672 private: 673 Expression * tuple; 674 unsigned int index; 675 }; 676 677 /// MemberTupleExpr represents a tuple member selection operation on a struct type, e.g. s.[a, b, c] after processing by the expression analyzer 678 class MemberTupleExpr : public Expression { 679 public: 680 MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname = nullptr ); 681 MemberTupleExpr( const MemberTupleExpr &other ); 682 virtual ~MemberTupleExpr(); 683 684 Expression * get_member() const { return member; } 685 Expression * get_aggregate() const { return aggregate; } 686 MemberTupleExpr * set_member( Expression *newValue ) { member = newValue; return this; } 687 MemberTupleExpr * set_aggregate( Expression *newValue ) { aggregate = newValue; return this; } 688 689 virtual MemberTupleExpr *clone() const { return new MemberTupleExpr( *this ); } 690 virtual void accept( Visitor &v ) { v.visit( this ); } 691 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 692 virtual void print( std::ostream &os, int indent = 0 ) const; 693 private: 694 Expression * member; 695 Expression * aggregate; 696 }; 697 698 /// TupleAssignExpr represents a multiple assignment operation, where both sides of the assignment have tuple type, e.g. [a, b, c] = [d, e, f];, 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;, or a tuple ctor/dtor expression 699 class TupleAssignExpr : public Expression { 700 public: 701 TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname = nullptr ); 702 TupleAssignExpr( const TupleAssignExpr &other ); 703 virtual ~TupleAssignExpr(); 704 705 std::list< Expression * > & get_assigns() { return assigns; } 706 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; } 707 708 virtual TupleAssignExpr *clone() const { return new TupleAssignExpr( *this ); } 709 virtual void accept( Visitor &v ) { v.visit( this ); } 710 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 711 virtual void print( std::ostream &os, int indent = 0 ) const; 712 private: 713 std::list< Expression * > assigns; // assignment expressions that use tempDecls 714 std::list< ObjectDecl * > tempDecls; // temporaries for address of lhs exprs 715 }; 716 717 /// StmtExpr represents a GCC 'statement expression', e.g. ({ int x = 5; x; }) 718 class StmtExpr : public Expression { 719 public: 720 StmtExpr( CompoundStmt *statements ); 721 StmtExpr( const StmtExpr & other ); 722 virtual ~StmtExpr(); 723 724 CompoundStmt * get_statements() const { return statements; } 725 StmtExpr * set_statements( CompoundStmt * newValue ) { statements = newValue; return this; } 726 727 virtual StmtExpr *clone() const { return new StmtExpr( *this ); } 728 virtual void accept( Visitor &v ) { v.visit( this ); } 729 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 730 virtual void print( std::ostream &os, int indent = 0 ) const; 731 private: 732 CompoundStmt * statements; 733 }; 734 735 class UniqueExpr : public Expression { 736 public: 737 UniqueExpr( Expression * expr ); 738 UniqueExpr( const UniqueExpr & other ); 739 ~UniqueExpr(); 740 741 Expression * get_expr() const { return *expr; } 742 UniqueExpr * set_expr( Expression * newValue ) { *expr = newValue; return this; } 743 744 virtual UniqueExpr *clone() const { return new UniqueExpr( *this ); } 745 virtual void accept( Visitor &v ) { v.visit( this ); } 746 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 747 virtual void print( std::ostream &os, int indent = 0 ) const; 748 private: 749 std::shared_ptr< Expression * > expr; 672 750 }; 673 751 -
src/SynTree/Mutator.cc
rd58a39a0 r7756647 178 178 179 179 Expression *Mutator::mutate( ApplicationExpr *applicationExpr ) { 180 mutateAll( applicationExpr->get_results(), *this);180 applicationExpr->set_result( maybeMutate( applicationExpr->get_result(), *this ) ); 181 181 applicationExpr->set_function( maybeMutate( applicationExpr->get_function(), *this ) ); 182 182 mutateAll( applicationExpr->get_args(), *this ); … … 185 185 186 186 Expression *Mutator::mutate( UntypedExpr *untypedExpr ) { 187 mutateAll( untypedExpr->get_results(), *this);187 untypedExpr->set_result( maybeMutate( untypedExpr->get_result(), *this ) ); 188 188 mutateAll( untypedExpr->get_args(), *this ); 189 189 return untypedExpr; … … 191 191 192 192 Expression *Mutator::mutate( NameExpr *nameExpr ) { 193 mutateAll( nameExpr->get_results(), *this);193 nameExpr->set_result( maybeMutate( nameExpr->get_result(), *this ) ); 194 194 return nameExpr; 195 195 } 196 196 197 197 Expression *Mutator::mutate( AddressExpr *addressExpr ) { 198 mutateAll( addressExpr->get_results(), *this);198 addressExpr->set_result( maybeMutate( addressExpr->get_result(), *this ) ); 199 199 addressExpr->set_arg( maybeMutate( addressExpr->get_arg(), *this ) ); 200 200 return addressExpr; … … 202 202 203 203 Expression *Mutator::mutate( LabelAddressExpr *labelAddressExpr ) { 204 mutateAll( labelAddressExpr->get_results(), *this);204 labelAddressExpr->set_result( maybeMutate( labelAddressExpr->get_result(), *this ) ); 205 205 labelAddressExpr->set_arg( maybeMutate( labelAddressExpr->get_arg(), *this ) ); 206 206 return labelAddressExpr; … … 208 208 209 209 Expression *Mutator::mutate( CastExpr *castExpr ) { 210 mutateAll( castExpr->get_results(), *this);210 castExpr->set_result( maybeMutate( castExpr->get_result(), *this ) ); 211 211 castExpr->set_arg( maybeMutate( castExpr->get_arg(), *this ) ); 212 212 return castExpr; … … 214 214 215 215 Expression *Mutator::mutate( UntypedMemberExpr *memberExpr ) { 216 mutateAll( memberExpr->get_results(), *this ); 216 memberExpr->set_result( maybeMutate( memberExpr->get_result(), *this ) ); 217 memberExpr->set_aggregate( maybeMutate( memberExpr->get_aggregate(), *this ) ); 218 memberExpr->set_member( maybeMutate( memberExpr->get_member(), *this ) ); 219 return memberExpr; 220 } 221 222 Expression *Mutator::mutate( MemberExpr *memberExpr ) { 223 memberExpr->set_result( maybeMutate( memberExpr->get_result(), *this ) ); 217 224 memberExpr->set_aggregate( maybeMutate( memberExpr->get_aggregate(), *this ) ); 218 225 return memberExpr; 219 226 } 220 227 221 Expression *Mutator::mutate( MemberExpr *memberExpr ) {222 mutateAll( memberExpr->get_results(), *this );223 memberExpr->set_aggregate( maybeMutate( memberExpr->get_aggregate(), *this ) );224 return memberExpr;225 }226 227 228 Expression *Mutator::mutate( VariableExpr *variableExpr ) { 228 mutateAll( variableExpr->get_results(), *this);229 variableExpr->set_result( maybeMutate( variableExpr->get_result(), *this ) ); 229 230 return variableExpr; 230 231 } 231 232 232 233 Expression *Mutator::mutate( ConstantExpr *constantExpr ) { 233 mutateAll( constantExpr->get_results(), *this);234 constantExpr->set_result( maybeMutate( constantExpr->get_result(), *this ) ); 234 235 // maybeMutate( constantExpr->get_constant(), *this ) 235 236 return constantExpr; … … 237 238 238 239 Expression *Mutator::mutate( SizeofExpr *sizeofExpr ) { 239 mutateAll( sizeofExpr->get_results(), *this);240 sizeofExpr->set_result( maybeMutate( sizeofExpr->get_result(), *this ) ); 240 241 if ( sizeofExpr->get_isType() ) { 241 242 sizeofExpr->set_type( maybeMutate( sizeofExpr->get_type(), *this ) ); … … 247 248 248 249 Expression *Mutator::mutate( AlignofExpr *alignofExpr ) { 249 mutateAll( alignofExpr->get_results(), *this);250 alignofExpr->set_result( maybeMutate( alignofExpr->get_result(), *this ) ); 250 251 if ( alignofExpr->get_isType() ) { 251 252 alignofExpr->set_type( maybeMutate( alignofExpr->get_type(), *this ) ); … … 257 258 258 259 Expression *Mutator::mutate( UntypedOffsetofExpr *offsetofExpr ) { 259 mutateAll( offsetofExpr->get_results(), *this);260 offsetofExpr->set_result( maybeMutate( offsetofExpr->get_result(), *this ) ); 260 261 offsetofExpr->set_type( maybeMutate( offsetofExpr->get_type(), *this ) ); 261 262 return offsetofExpr; … … 263 264 264 265 Expression *Mutator::mutate( OffsetofExpr *offsetofExpr ) { 265 mutateAll( offsetofExpr->get_results(), *this);266 offsetofExpr->set_result( maybeMutate( offsetofExpr->get_result(), *this ) ); 266 267 offsetofExpr->set_type( maybeMutate( offsetofExpr->get_type(), *this ) ); 267 268 offsetofExpr->set_member( maybeMutate( offsetofExpr->get_member(), *this ) ); … … 270 271 271 272 Expression *Mutator::mutate( OffsetPackExpr *offsetPackExpr ) { 272 mutateAll( offsetPackExpr->get_results(), *this);273 offsetPackExpr->set_result( maybeMutate( offsetPackExpr->get_result(), *this ) ); 273 274 offsetPackExpr->set_type( maybeMutate( offsetPackExpr->get_type(), *this ) ); 274 275 return offsetPackExpr; … … 276 277 277 278 Expression *Mutator::mutate( AttrExpr *attrExpr ) { 278 mutateAll( attrExpr->get_results(), *this);279 attrExpr->set_result( maybeMutate( attrExpr->get_result(), *this ) ); 279 280 if ( attrExpr->get_isType() ) { 280 281 attrExpr->set_type( maybeMutate( attrExpr->get_type(), *this ) ); … … 286 287 287 288 Expression *Mutator::mutate( LogicalExpr *logicalExpr ) { 288 mutateAll( logicalExpr->get_results(), *this);289 logicalExpr->set_result( maybeMutate( logicalExpr->get_result(), *this ) ); 289 290 logicalExpr->set_arg1( maybeMutate( logicalExpr->get_arg1(), *this ) ); 290 291 logicalExpr->set_arg2( maybeMutate( logicalExpr->get_arg2(), *this ) ); … … 293 294 294 295 Expression *Mutator::mutate( ConditionalExpr *conditionalExpr ) { 295 mutateAll( conditionalExpr->get_results(), *this);296 conditionalExpr->set_result( maybeMutate( conditionalExpr->get_result(), *this ) ); 296 297 conditionalExpr->set_arg1( maybeMutate( conditionalExpr->get_arg1(), *this ) ); 297 298 conditionalExpr->set_arg2( maybeMutate( conditionalExpr->get_arg2(), *this ) ); … … 301 302 302 303 Expression *Mutator::mutate( CommaExpr *commaExpr ) { 303 mutateAll( commaExpr->get_results(), *this);304 commaExpr->set_result( maybeMutate( commaExpr->get_result(), *this ) ); 304 305 commaExpr->set_arg1( maybeMutate( commaExpr->get_arg1(), *this ) ); 305 306 commaExpr->set_arg2( maybeMutate( commaExpr->get_arg2(), *this ) ); … … 307 308 } 308 309 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 321 310 Expression *Mutator::mutate( TypeExpr *typeExpr ) { 322 mutateAll( typeExpr->get_results(), *this);311 typeExpr->set_result( maybeMutate( typeExpr->get_result(), *this ) ); 323 312 typeExpr->set_type( maybeMutate( typeExpr->get_type(), *this ) ); 324 313 return typeExpr; … … 340 329 341 330 Expression* Mutator::mutate( ConstructorExpr *ctorExpr ) { 342 mutateAll( ctorExpr->get_results(), *this);331 ctorExpr->set_result( maybeMutate( ctorExpr->get_result(), *this ) ); 343 332 ctorExpr->set_callExpr( maybeMutate( ctorExpr->get_callExpr(), *this ) ); 344 333 return ctorExpr; … … 346 335 347 336 Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) { 348 mutateAll( compLitExpr->get_results(), *this);337 compLitExpr->set_result( maybeMutate( compLitExpr->get_result(), *this ) ); 349 338 compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) ); 350 339 compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) ); … … 353 342 354 343 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) { 355 mutateAll( valofExpr->get_results(), *this);344 valofExpr->set_result( maybeMutate( valofExpr->get_result(), *this ) ); 356 345 return valofExpr; 357 346 } … … 361 350 rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) ); 362 351 return rangeExpr; 352 } 353 354 Expression *Mutator::mutate( TupleExpr *tupleExpr ) { 355 tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) ); 356 mutateAll( tupleExpr->get_exprs(), *this ); 357 return tupleExpr; 358 } 359 360 Expression *Mutator::mutate( TupleIndexExpr *tupleExpr ) { 361 tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) ); 362 tupleExpr->set_tuple( maybeMutate( tupleExpr->get_tuple(), *this ) ); 363 return tupleExpr; 364 } 365 366 Expression *Mutator::mutate( MemberTupleExpr *tupleExpr ) { 367 tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) ); 368 tupleExpr->set_member( maybeMutate( tupleExpr->get_member(), *this ) ); 369 tupleExpr->set_aggregate( maybeMutate( tupleExpr->get_aggregate(), *this ) ); 370 return tupleExpr; 371 } 372 373 Expression *Mutator::mutate( TupleAssignExpr *assignExpr ) { 374 assignExpr->set_result( maybeMutate( assignExpr->get_result(), *this ) ); 375 mutateAll( assignExpr->get_tempDecls(), *this ); 376 mutateAll( assignExpr->get_assigns(), *this ); 377 return assignExpr; 378 } 379 380 Expression *Mutator::mutate( StmtExpr *stmtExpr ) { 381 stmtExpr->set_result( maybeMutate( stmtExpr->get_result(), *this ) ); 382 stmtExpr->set_statements( maybeMutate( stmtExpr->get_statements(), *this ) ); 383 return stmtExpr; 384 } 385 386 Expression *Mutator::mutate( UniqueExpr *uniqueExpr ) { 387 uniqueExpr->set_result( maybeMutate( uniqueExpr->get_result(), *this ) ); 388 uniqueExpr->set_expr( maybeMutate( uniqueExpr->get_expr(), *this ) ); 389 return uniqueExpr; 363 390 } 364 391 -
src/SynTree/Mutator.h
rd58a39a0 r7756647 71 71 virtual Expression* mutate( ConditionalExpr *conditionalExpr ); 72 72 virtual Expression* mutate( CommaExpr *commaExpr ); 73 virtual Expression* mutate( TupleExpr *tupleExpr );74 virtual Expression* mutate( SolvedTupleExpr *tupleExpr );75 73 virtual Expression* mutate( TypeExpr *typeExpr ); 76 74 virtual Expression* mutate( AsmExpr *asmExpr ); … … 80 78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 81 79 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 ); 85 virtual Expression* mutate( UniqueExpr * uniqueExpr ); 82 86 83 87 virtual Type* mutate( VoidType *basicType ); -
src/SynTree/ReferenceToType.cc
rd58a39a0 r7756647 56 56 } 57 57 } // namespace 58 59 StructInstType::StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct ) : Parent( tq, baseStruct->get_name() ), baseStruct( baseStruct ) {} 58 60 59 61 std::string StructInstType::typeString() const { return "struct"; } -
src/SynTree/SynTree.h
rd58a39a0 r7756647 76 76 class ConditionalExpr; 77 77 class CommaExpr; 78 class TupleExpr;79 class SolvedTupleExpr;80 78 class TypeExpr; 81 79 class AsmExpr; … … 85 83 class UntypedValofExpr; 86 84 class RangeExpr; 85 class TupleExpr; 86 class TupleIndexExpr; 87 class MemberTupleExpr; 88 class TupleAssignExpr; 89 class StmtExpr; 90 class UniqueExpr; 87 91 88 92 class Type; -
src/SynTree/TupleExpr.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TupleExpr.cc -- 7 // TupleExpr.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 16 16 #include "Expression.h" 17 17 #include "Common/utility.h" 18 #include "Type.h" 19 #include "Declaration.h" 20 #include "Tuples/Tuples.h" 18 21 19 TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) { 22 TupleExpr::TupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) { 23 if ( ! exprs.empty() ) { 24 if ( std::all_of( exprs.begin(), exprs.end(), [](Expression * expr) { return expr->get_result(); } ) ) { 25 set_result( Tuples::makeTupleType( exprs ) ); 26 } 27 } 20 28 } 21 29 … … 29 37 30 38 void TupleExpr::print( std::ostream &os, int indent ) const { 31 os << std::string( indent, ' ' ) <<"Tuple:" << std::endl;39 os << "Tuple:" << std::endl; 32 40 printAll( exprs, os, indent+2 ); 33 41 Expression::print( os, indent ); 34 42 } 35 43 36 SolvedTupleExpr::SolvedTupleExpr( std::list<Expression *> &_exprs, Expression *_aname ) : Expression( _aname ) { 37 std::copy(_exprs.begin(), _exprs.end(), back_inserter(exprs)); 44 TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index ) { 45 TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() ); 46 assert( type->size() > index ); 47 set_result( (*std::next( type->get_types().begin(), index ))->clone() ); 48 get_result()->set_isLvalue( type->get_isLvalue() ); 38 49 } 39 50 40 SolvedTupleExpr::SolvedTupleExpr( const SolvedTupleExpr &other ) : Expression( other ) { 41 cloneAll( other.exprs, exprs ); 51 TupleIndexExpr::TupleIndexExpr( const TupleIndexExpr &other ) : Expression( other ), tuple( other.tuple->clone() ), index( other.index ) { 42 52 } 43 53 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 ); 54 TupleIndexExpr::~TupleIndexExpr() { 55 delete tuple; 56 } 57 58 void TupleIndexExpr::print( std::ostream &os, int indent ) const { 59 os << "Tuple Index Expression, with tuple:" << std::endl; 60 os << std::string( indent+2, ' ' ); 61 tuple->print( os, indent+2 ); 62 os << std::string( indent+2, ' ' ) << "with index: " << index << std::endl; 47 63 Expression::print( os, indent ); 48 64 } 65 66 MemberTupleExpr::MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname ) : Expression( _aname ) { 67 set_result( maybeClone( member->get_result() ) ); // xxx - ??? 68 } 69 70 MemberTupleExpr::MemberTupleExpr( const MemberTupleExpr &other ) : Expression( other ), member( other.member->clone() ), aggregate( other.aggregate->clone() ) { 71 } 72 73 MemberTupleExpr::~MemberTupleExpr() { 74 delete member; 75 delete aggregate; 76 } 77 78 void MemberTupleExpr::print( std::ostream &os, int indent ) const { 79 os << "Member Tuple Expression, with aggregate:" << std::endl; 80 os << std::string( indent+2, ' ' ); 81 aggregate->print( os, indent+2 ); 82 os << std::string( indent+2, ' ' ) << "with member: " << std::endl; 83 os << std::string( indent+2, ' ' ); 84 member->print( os, indent+2 ); 85 Expression::print( os, indent ); 86 } 87 88 89 TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname ) : Expression( _aname ), assigns( assigns ), tempDecls( tempDecls ) { 90 set_result( Tuples::makeTupleType( assigns ) ); 91 } 92 93 TupleAssignExpr::TupleAssignExpr( const TupleAssignExpr &other ) : Expression( other ), tempDecls( other.tempDecls ) /* temporary */ { 94 cloneAll( other.assigns, assigns ); 95 // xxx - clone needs to go into assigns and replace tempDecls 96 } 97 98 TupleAssignExpr::~TupleAssignExpr() { 99 deleteAll( assigns ); 100 // deleteAll( tempDecls ); 101 } 102 103 void TupleAssignExpr::print( std::ostream &os, int indent ) const { 104 os << "Tuple Assignment Expression, with temporaries:" << std::endl; 105 printAll( tempDecls, os, indent+4 ); 106 os << std::string( indent+2, ' ' ) << "with assignments: " << std::endl; 107 printAll( assigns, os, indent+4 ); 108 Expression::print( os, indent ); 109 } 110 111 49 112 50 113 // Local Variables: // -
src/SynTree/TupleType.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TupleType.cc -- 7 // TupleType.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 17 17 #include "Common/utility.h" 18 18 19 TupleType::TupleType( const Type::Qualifiers &tq ) : Type( tq) {19 TupleType::TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types ) : Type( tq ), types( types ) { 20 20 } 21 21 -
src/SynTree/Type.h
rd58a39a0 r7756647 20 20 #include "Visitor.h" 21 21 #include "Mutator.h" 22 #include "Common/utility.h" 22 23 23 24 class Type { … … 27 28 Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic, bool isAttribute ): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ), isAttribute( isAttribute ) {} 28 29 30 Qualifiers &operator&=( const Qualifiers &other ); 29 31 Qualifiers &operator+=( const Qualifiers &other ); 30 32 Qualifiers &operator-=( const Qualifiers &other ); … … 63 65 void set_isAtomic( bool newValue ) { tq.isAtomic = newValue; } 64 66 void set_isAttribute( bool newValue ) { tq.isAttribute = newValue; } 65 std::list<TypeDecl*>& get_forall() { return forall; } 67 68 typedef std::list<TypeDecl *> ForallList; 69 ForallList& get_forall() { return forall; } 70 71 /// How many elemental types are represented by this type 72 virtual unsigned size() const { return 1; }; 73 virtual bool isVoid() const { return size() == 0; } 66 74 67 75 virtual Type *clone() const = 0; … … 71 79 private: 72 80 Qualifiers tq; 73 std::list<TypeDecl*>forall;81 ForallList forall; 74 82 }; 75 83 … … 77 85 public: 78 86 VoidType( const Type::Qualifiers &tq ); 87 88 virtual unsigned size() const { return 0; }; 79 89 80 90 virtual VoidType *clone() const { return new VoidType( *this ); } … … 234 244 public: 235 245 StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {} 246 StructInstType( const Type::Qualifiers &tq, StructDecl * baseStruct ); 236 247 StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {} 237 248 … … 348 359 class TupleType : public Type { 349 360 public: 350 TupleType( const Type::Qualifiers &tq );361 TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types = std::list< Type * >() ); 351 362 TupleType( const TupleType& ); 352 363 virtual ~TupleType(); 353 364 365 typedef std::list<Type*> value_type; 366 typedef value_type::iterator iterator; 367 354 368 std::list<Type*>& get_types() { return types; } 369 virtual unsigned size() const { return types.size(); }; 370 371 iterator begin() { return types.begin(); } 372 iterator end() { return types.end(); } 355 373 356 374 virtual TupleType *clone() const { return new TupleType( *this ); } … … 442 460 }; 443 461 462 inline Type::Qualifiers &Type::Qualifiers::operator&=( const Type::Qualifiers &other ) { 463 isConst &= other.isConst; 464 isVolatile &= other.isVolatile; 465 isRestrict &= other.isRestrict; 466 isLvalue &= other.isLvalue; 467 isAtomic &= other.isAtomic; 468 return *this; 469 } 470 444 471 inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) { 445 472 isConst |= other.isConst; -
src/SynTree/TypeSubstitution.cc
rd58a39a0 r7756647 72 72 Type *TypeSubstitution::lookup( std::string formalType ) const { 73 73 TypeEnvType::const_iterator i = typeEnv.find( formalType ); 74 74 75 75 // break on not in substitution set 76 76 if ( i == typeEnv.end() ) return 0; 77 77 78 78 // attempt to transitively follow TypeInstType links. 79 79 while ( TypeInstType *actualType = dynamic_cast< TypeInstType* >( i->second ) ) { 80 80 const std::string& typeName = actualType->get_name(); 81 81 82 82 // break cycles in the transitive follow 83 83 if ( formalType == typeName ) break; 84 84 85 85 // Look for the type this maps to, returning previous mapping if none-such 86 86 i = typeEnv.find( typeName ); 87 87 if ( i == typeEnv.end() ) return actualType; 88 88 } 89 89 90 90 // return type from substitution set 91 91 return i->second; 92 92 93 93 #if 0 94 94 if ( i == typeEnv.end() ) { … … 149 149 // bind type variables from forall-qualifiers 150 150 if ( freeOnly ) { 151 for ( std::list< TypeDecl* >::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {151 for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) { 152 152 boundVars.insert( (*tyvar )->get_name() ); 153 153 } // for … … 163 163 // bind type variables from forall-qualifiers 164 164 if ( freeOnly ) { 165 for ( std::list< TypeDecl* >::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {165 for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) { 166 166 boundVars.insert( (*tyvar )->get_name() ); 167 167 } // for -
src/SynTree/Visitor.cc
rd58a39a0 r7756647 150 150 151 151 void Visitor::visit( ApplicationExpr *applicationExpr ) { 152 acceptAll( applicationExpr->get_results(), *this );152 maybeAccept( applicationExpr->get_result(), *this ); 153 153 maybeAccept( applicationExpr->get_function(), *this ); 154 154 acceptAll( applicationExpr->get_args(), *this ); … … 156 156 157 157 void Visitor::visit( UntypedExpr *untypedExpr ) { 158 acceptAll( untypedExpr->get_results(), *this );158 maybeAccept( untypedExpr->get_result(), *this ); 159 159 acceptAll( untypedExpr->get_args(), *this ); 160 160 } 161 161 162 162 void Visitor::visit( NameExpr *nameExpr ) { 163 acceptAll( nameExpr->get_results(), *this );163 maybeAccept( nameExpr->get_result(), *this ); 164 164 } 165 165 166 166 void Visitor::visit( AddressExpr *addressExpr ) { 167 acceptAll( addressExpr->get_results(), *this );167 maybeAccept( addressExpr->get_result(), *this ); 168 168 maybeAccept( addressExpr->get_arg(), *this ); 169 169 } 170 170 171 171 void Visitor::visit( LabelAddressExpr *labAddressExpr ) { 172 acceptAll( labAddressExpr->get_results(), *this );172 maybeAccept( labAddressExpr->get_result(), *this ); 173 173 maybeAccept( labAddressExpr->get_arg(), *this ); 174 174 } 175 175 176 176 void Visitor::visit( CastExpr *castExpr ) { 177 acceptAll( castExpr->get_results(), *this );177 maybeAccept( castExpr->get_result(), *this ); 178 178 maybeAccept( castExpr->get_arg(), *this ); 179 179 } 180 180 181 181 void Visitor::visit( UntypedMemberExpr *memberExpr ) { 182 acceptAll( memberExpr->get_results(), *this );182 maybeAccept( memberExpr->get_result(), *this ); 183 183 maybeAccept( memberExpr->get_aggregate(), *this ); 184 maybeAccept( memberExpr->get_member(), *this ); 184 185 } 185 186 186 187 void Visitor::visit( MemberExpr *memberExpr ) { 187 acceptAll( memberExpr->get_results(), *this );188 maybeAccept( memberExpr->get_result(), *this ); 188 189 maybeAccept( memberExpr->get_aggregate(), *this ); 189 190 } 190 191 191 192 void Visitor::visit( VariableExpr *variableExpr ) { 192 acceptAll( variableExpr->get_results(), *this );193 maybeAccept( variableExpr->get_result(), *this ); 193 194 } 194 195 195 196 void Visitor::visit( ConstantExpr *constantExpr ) { 196 acceptAll( constantExpr->get_results(), *this );197 maybeAccept( constantExpr->get_result(), *this ); 197 198 maybeAccept( constantExpr->get_constant(), *this ); 198 199 } 199 200 200 201 void Visitor::visit( SizeofExpr *sizeofExpr ) { 201 acceptAll( sizeofExpr->get_results(), *this );202 maybeAccept( sizeofExpr->get_result(), *this ); 202 203 if ( sizeofExpr->get_isType() ) { 203 204 maybeAccept( sizeofExpr->get_type(), *this ); … … 208 209 209 210 void Visitor::visit( AlignofExpr *alignofExpr ) { 210 acceptAll( alignofExpr->get_results(), *this );211 maybeAccept( alignofExpr->get_result(), *this ); 211 212 if ( alignofExpr->get_isType() ) { 212 213 maybeAccept( alignofExpr->get_type(), *this ); … … 217 218 218 219 void Visitor::visit( UntypedOffsetofExpr *offsetofExpr ) { 219 acceptAll( offsetofExpr->get_results(), *this );220 maybeAccept( offsetofExpr->get_result(), *this ); 220 221 maybeAccept( offsetofExpr->get_type(), *this ); 221 222 } 222 223 223 224 void Visitor::visit( OffsetofExpr *offsetofExpr ) { 224 acceptAll( offsetofExpr->get_results(), *this );225 maybeAccept( offsetofExpr->get_result(), *this ); 225 226 maybeAccept( offsetofExpr->get_type(), *this ); 226 227 maybeAccept( offsetofExpr->get_member(), *this ); … … 228 229 229 230 void Visitor::visit( OffsetPackExpr *offsetPackExpr ) { 230 acceptAll( offsetPackExpr->get_results(), *this );231 maybeAccept( offsetPackExpr->get_result(), *this ); 231 232 maybeAccept( offsetPackExpr->get_type(), *this ); 232 233 } 233 234 234 235 void Visitor::visit( AttrExpr *attrExpr ) { 235 acceptAll( attrExpr->get_results(), *this );236 maybeAccept( attrExpr->get_result(), *this ); 236 237 if ( attrExpr->get_isType() ) { 237 238 maybeAccept( attrExpr->get_type(), *this ); … … 242 243 243 244 void Visitor::visit( LogicalExpr *logicalExpr ) { 244 acceptAll( logicalExpr->get_results(), *this );245 maybeAccept( logicalExpr->get_result(), *this ); 245 246 maybeAccept( logicalExpr->get_arg1(), *this ); 246 247 maybeAccept( logicalExpr->get_arg2(), *this ); … … 248 249 249 250 void Visitor::visit( ConditionalExpr *conditionalExpr ) { 250 acceptAll( conditionalExpr->get_results(), *this );251 maybeAccept( conditionalExpr->get_result(), *this ); 251 252 maybeAccept( conditionalExpr->get_arg1(), *this ); 252 253 maybeAccept( conditionalExpr->get_arg2(), *this ); … … 255 256 256 257 void Visitor::visit( CommaExpr *commaExpr ) { 257 acceptAll( commaExpr->get_results(), *this );258 maybeAccept( commaExpr->get_result(), *this ); 258 259 maybeAccept( commaExpr->get_arg1(), *this ); 259 260 maybeAccept( commaExpr->get_arg2(), *this ); 260 261 } 261 262 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 272 263 void Visitor::visit( TypeExpr *typeExpr ) { 273 acceptAll( typeExpr->get_results(), *this );264 maybeAccept( typeExpr->get_result(), *this ); 274 265 maybeAccept( typeExpr->get_type(), *this ); 275 266 } … … 288 279 289 280 void Visitor::visit( ConstructorExpr * ctorExpr ) { 290 acceptAll( ctorExpr->get_results(), *this );281 maybeAccept( ctorExpr->get_result(), *this ); 291 282 maybeAccept( ctorExpr->get_callExpr(), *this ); 292 283 } 293 284 294 285 void Visitor::visit( CompoundLiteralExpr *compLitExpr ) { 295 acceptAll( compLitExpr->get_results(), *this );286 maybeAccept( compLitExpr->get_result(), *this ); 296 287 maybeAccept( compLitExpr->get_type(), *this ); 297 288 maybeAccept( compLitExpr->get_initializer(), *this ); … … 299 290 300 291 void Visitor::visit( UntypedValofExpr *valofExpr ) { 301 acceptAll( valofExpr->get_results(), *this );292 maybeAccept( valofExpr->get_result(), *this ); 302 293 maybeAccept( valofExpr->get_body(), *this ); 303 294 } … … 306 297 maybeAccept( rangeExpr->get_low(), *this ); 307 298 maybeAccept( rangeExpr->get_high(), *this ); 299 } 300 301 void Visitor::visit( TupleExpr *tupleExpr ) { 302 maybeAccept( tupleExpr->get_result(), *this ); 303 acceptAll( tupleExpr->get_exprs(), *this ); 304 } 305 306 void Visitor::visit( TupleIndexExpr *tupleExpr ) { 307 maybeAccept( tupleExpr->get_result(), *this ); 308 maybeAccept( tupleExpr->get_tuple(), *this ); 309 } 310 311 void Visitor::visit( MemberTupleExpr *tupleExpr ) { 312 maybeAccept( tupleExpr->get_result(), *this ); 313 maybeAccept( tupleExpr->get_member(), *this ); 314 maybeAccept( tupleExpr->get_aggregate(), *this ); 315 } 316 317 void Visitor::visit( TupleAssignExpr *assignExpr ) { 318 maybeAccept( assignExpr->get_result(), *this ); 319 acceptAll( assignExpr->get_tempDecls(), *this ); 320 acceptAll( assignExpr->get_assigns(), *this ); 321 } 322 323 void Visitor::visit( StmtExpr *stmtExpr ) { 324 maybeAccept( stmtExpr->get_result(), *this ); 325 maybeAccept( stmtExpr->get_statements(), *this ); 326 } 327 328 void Visitor::visit( UniqueExpr *uniqueExpr ) { 329 maybeAccept( uniqueExpr->get_result(), *this ); 330 maybeAccept( uniqueExpr->get_expr(), *this ); 308 331 } 309 332 -
src/SynTree/Visitor.h
rd58a39a0 r7756647 71 71 virtual void visit( ConditionalExpr *conditionalExpr ); 72 72 virtual void visit( CommaExpr *commaExpr ); 73 virtual void visit( TupleExpr *tupleExpr );74 virtual void visit( SolvedTupleExpr *tupleExpr );75 73 virtual void visit( TypeExpr *typeExpr ); 76 74 virtual void visit( AsmExpr *asmExpr ); … … 80 78 virtual void visit( UntypedValofExpr *valofExpr ); 81 79 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 ); 85 virtual void visit( UniqueExpr * uniqueExpr ); 82 86 83 87 virtual void visit( VoidType *basicType ); -
src/Tuples/TupleAssignment.cc
rd58a39a0 r7756647 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TupleAssignment.cc -- 7 // TupleAssignment.cc -- 8 8 // 9 9 // Author : Rodolfo G. Esteves … … 18 18 #include "ResolvExpr/typeops.h" 19 19 #include "SynTree/Expression.h" 20 #include "TupleAssignment.h" 20 #include "SynTree/Initializer.h" 21 #include "Tuples.h" 21 22 #include "Common/SemanticError.h" 23 #include "InitTweak/InitTweak.h" 22 24 23 25 #include <functional> … … 27 29 #include <cassert> 28 30 #include <set> 31 #include <unordered_set> 29 32 30 33 namespace Tuples { 31 TupleAssignSpotter::TupleAssignSpotter( ResolvExpr::AlternativeFinder *f = 0 ) 32 : currentFinder(f), matcher(0), hasMatched( false ) {} 33 34 bool TupleAssignSpotter::pointsToTuple( Expression *expr ) { 34 class TupleAssignSpotter { 35 public: 36 // dispatcher for Tuple (multiple and mass) assignment operations 37 TupleAssignSpotter( ResolvExpr::AlternativeFinder & ); 38 void spot( UntypedExpr * expr, const std::list<ResolvExpr::AltList> &possibilities ); 39 40 private: 41 void match(); 42 43 struct Matcher { 44 public: 45 Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList & alts ); 46 virtual ~Matcher() {} 47 virtual void match( std::list< Expression * > &out ) = 0; 48 ResolvExpr::AltList lhs, rhs; 49 TupleAssignSpotter &spotter; 50 std::list< ObjectDecl * > tmpDecls; 51 }; 52 53 struct MassAssignMatcher : public Matcher { 54 public: 55 MassAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList & alts ); 56 virtual void match( std::list< Expression * > &out ); 57 }; 58 59 struct MultipleAssignMatcher : public Matcher { 60 public: 61 MultipleAssignMatcher( TupleAssignSpotter &spot, const ResolvExpr::AltList & alts ); 62 virtual void match( std::list< Expression * > &out ); 63 }; 64 65 ResolvExpr::AlternativeFinder ¤tFinder; 66 std::string fname; 67 std::unique_ptr< Matcher > matcher; 68 }; 69 70 /// true if expr is an expression of tuple type, i.e. a tuple expression, tuple variable, or MRV (multiple-return-value) function 71 bool isTuple( Expression *expr ) { 72 if ( ! expr ) return false; 73 assert( expr->has_result() ); 74 return dynamic_cast<TupleExpr *>(expr) || expr->get_result()->size() > 1; 75 } 76 77 template< typename AltIter > 78 bool isMultAssign( AltIter begin, AltIter end ) { 79 // multiple assignment if more than one alternative in the range or if 80 // the alternative is a tuple 81 if ( begin == end ) return false; 82 if ( isTuple( begin->expr ) ) return true; 83 return ++begin != end; 84 } 85 86 bool pointsToTuple( Expression *expr ) { 35 87 // 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; 88 if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) { 89 return pointsToTuple( castExpr->get_arg() ); 90 } else if ( AddressExpr *addr = dynamic_cast< AddressExpr * >( expr) ) { 91 return isTuple( addr->get_arg() ); 92 } 39 93 return false; 40 94 } 41 95 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 ) { 135 if ( NameExpr *assgnop = dynamic_cast< NameExpr * >(expr->get_function()) ) { 136 137 if ( assgnop->get_name() == std::string("?=?") ) { 138 139 for ( std::list<ResolvExpr::AltList>::iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) { 140 assert( ali->size() == 2 ); 141 ResolvExpr::AltList::iterator opit = ali->begin(); 142 ResolvExpr::Alternative op1 = *opit, op2 = *(++opit); 143 144 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 96 void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * expr, const std::list<ResolvExpr::AltList> &possibilities ) { 97 TupleAssignSpotter spotter( currentFinder ); 98 spotter.spot( expr, possibilities ); 99 } 100 101 TupleAssignSpotter::TupleAssignSpotter( ResolvExpr::AlternativeFinder &f ) 102 : currentFinder(f) {} 103 104 void TupleAssignSpotter::spot( UntypedExpr * expr, const std::list<ResolvExpr::AltList> &possibilities ) { 105 if ( NameExpr *op = dynamic_cast< NameExpr * >(expr->get_function()) ) { 106 if ( InitTweak::isCtorDtorAssign( op->get_name() ) ) { 107 fname = op->get_name(); 108 for ( std::list<ResolvExpr::AltList>::const_iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) { 109 if ( ali->size() == 0 ) continue; // AlternativeFinder will natrually handle this case, if it's legal 110 if ( ali->size() <= 1 && InitTweak::isAssignment( op->get_name() ) ) { 111 // what does it mean if an assignment takes 1 argument? maybe someone defined such a function, in which case AlternativeFinder will naturally handle it 112 continue; 113 } 114 115 assert( ! ali->empty() ); 116 // grab args 2-N and group into a TupleExpr 117 const ResolvExpr::Alternative & alt1 = ali->front(); 118 auto begin = std::next(ali->begin(), 1), end = ali->end(); 119 if ( pointsToTuple(alt1.expr) ) { 120 if ( isMultAssign( begin, end ) ) { 121 matcher.reset( new MultipleAssignMatcher( *this, *ali ) ); 122 } else { 150 123 // 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() ) ); 124 matcher.reset( new MassAssignMatcher( *this, *ali ) ); 178 125 } 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() ) ); 126 match(); 189 127 } 190 128 } 191 129 } 192 130 } 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) ) 199 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 131 } 132 133 void TupleAssignSpotter::match() { 134 assert ( matcher != 0 ); 135 136 std::list< Expression * > new_assigns; 137 matcher->match( new_assigns ); 138 139 if ( new_assigns.empty() ) return; 140 ResolvExpr::AltList current; 141 // now resolve new assignments 142 for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) { 143 ResolvExpr::AlternativeFinder finder( currentFinder.get_indexer(), currentFinder.get_environ() ); 144 try { 145 finder.findWithAdjustment(*i); 146 } catch (...) { 147 return; // xxx - no match should not mean failure, it just means this particular tuple assignment isn't valid 148 } 149 // prune expressions that don't coincide with 150 ResolvExpr::AltList alts = finder.get_alternatives(); 151 assert( alts.size() == 1 ); 152 assert( alts.front().expr != 0 ); 153 current.push_back( alts.front() ); 154 } 155 156 // extract expressions from the assignment alternatives to produce a list of assignments that 157 // together form a single alternative 158 std::list< Expression *> solved_assigns; 159 for ( ResolvExpr::Alternative & alt : current ) { 160 solved_assigns.push_back( alt.expr->clone() ); 161 } 162 // xxx - need to do this?? 163 ResolvExpr::TypeEnvironment compositeEnv; 164 simpleCombineEnvironments( current.begin(), current.end(), compositeEnv ); 165 currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new TupleAssignExpr(solved_assigns, matcher->tmpDecls), compositeEnv, ResolvExpr::sumCost( current ) ) ); 166 } 167 168 TupleAssignSpotter::Matcher::Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList &alts ) : spotter(spotter) { 169 assert( ! alts.empty() ); 170 ResolvExpr::Alternative lhsAlt = alts.front(); 171 // peel off the cast that exists on ctor/dtor expressions 172 bool isCast = false; 173 if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( lhsAlt.expr ) ) { 174 lhsAlt.expr = castExpr->get_arg(); 175 castExpr->set_arg( nullptr ); 176 delete castExpr; 177 isCast = true; 178 } 179 180 // explode the lhs so that each field of the tuple-valued-expr is assigned. 181 explode( lhsAlt, back_inserter(lhs) ); 182 // and finally, re-add the cast to each lhs expr, so that qualified tuple fields can be constructed 183 if ( isCast ) { 184 for ( ResolvExpr::Alternative & alt : lhs ) { 185 Expression *& expr = alt.expr; 186 Type * castType = expr->get_result()->clone(); 187 Type * type = InitTweak::getPointerBase( castType ); 188 assert( type ); 189 type->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true); 190 type->set_isLvalue( true ); // xxx - might not need this 191 expr = new CastExpr( expr, castType ); 192 } 193 } 194 // } 195 } 196 197 TupleAssignSpotter::MassAssignMatcher::MassAssignMatcher( TupleAssignSpotter &spotter,const ResolvExpr::AltList & alts ) : Matcher( spotter, alts ) { 198 assert( alts.size() == 1 || alts.size() == 2 ); 199 if ( alts.size() == 2 ) { 200 rhs.push_back( alts.back() ); 201 } 202 } 203 204 TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList & alts ) : Matcher( spotter, alts ) { 205 // explode the rhs so that each field of the tuple-valued-expr is assigned. 206 explode( std::next(alts.begin(), 1), alts.end(), back_inserter(rhs) ); 207 } 208 209 UntypedExpr * createFunc( const std::string &fname, ObjectDecl *left, ObjectDecl *right ) { 210 assert( left ); 211 std::list< Expression * > args; 212 args.push_back( new AddressExpr( new UntypedExpr( new NameExpr("*?"), std::list< Expression * >{ new VariableExpr( left ) } ) ) ); 213 // args.push_back( new AddressExpr( new VariableExpr( left ) ) ); 214 if ( right ) args.push_back( new VariableExpr( right ) ); 215 return new UntypedExpr( new NameExpr( fname ), args ); 216 } 217 218 ObjectDecl * newObject( UniqueName & namer, Expression * expr ) { 219 assert( expr->has_result() && ! expr->get_result()->isVoid() ); 220 return new ObjectDecl( namer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, expr->get_result()->clone(), new SingleInit( expr->clone() ) ); 221 } 222 223 void TupleAssignSpotter::MassAssignMatcher::match( std::list< Expression * > &out ) { 224 static UniqueName lhsNamer( "__massassign_L" ); 225 static UniqueName rhsNamer( "__massassign_R" ); 226 assert ( ! lhs.empty() && rhs.size() <= 1); 227 228 ObjectDecl * rtmp = rhs.size() == 1 ? newObject( rhsNamer, rhs.front().expr ) : nullptr; 229 for ( ResolvExpr::Alternative & lhsAlt : lhs ) { 230 ObjectDecl * ltmp = newObject( lhsNamer, lhsAlt.expr ); 231 out.push_back( createFunc( spotter.fname, ltmp, rtmp ) ); 232 tmpDecls.push_back( ltmp ); 233 } 234 if ( rtmp ) tmpDecls.push_back( rtmp ); 235 } 236 237 void TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) { 238 static UniqueName lhsNamer( "__multassign_L" ); 239 static UniqueName rhsNamer( "__multassign_R" ); 240 // xxx - need more complicated matching? 267 241 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; 341 } 342 343 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 << " " ; 349 ostr << std::endl; 350 } // 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; 242 std::list< ObjectDecl * > ltmp; 243 std::list< ObjectDecl * > rtmp; 244 std::transform( lhs.begin(), lhs.end(), back_inserter( ltmp ), []( ResolvExpr::Alternative & alt ){ 245 return newObject( lhsNamer, alt.expr ); 246 }); 247 std::transform( rhs.begin(), rhs.end(), back_inserter( rtmp ), []( ResolvExpr::Alternative & alt ){ 248 return newObject( rhsNamer, alt.expr ); 249 }); 250 zipWith( ltmp.begin(), ltmp.end(), rtmp.begin(), rtmp.end(), back_inserter(out), [&](ObjectDecl * obj1, ObjectDecl * obj2 ) { return createFunc(spotter.fname, obj1, obj2); } ); 251 tmpDecls.splice( tmpDecls.end(), ltmp ); 252 tmpDecls.splice( tmpDecls.end(), rtmp ); 253 } 408 254 } 409 255 } // namespace Tuples -
src/Tuples/module.mk
rd58a39a0 r7756647 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## module.mk -- 8 ## module.mk -- 9 9 ## 10 10 ## Author : Richard C. Bilson … … 16 16 17 17 SRC += Tuples/TupleAssignment.cc \ 18 Tuples/ NameMatcher.cc18 Tuples/TupleExpansion.cc -
src/main.cc
rd58a39a0 r7756647 42 42 #include "Common/UnimplementedError.h" 43 43 #include "../config.h" 44 #include "Tuples/Tuples.h" 44 45 45 46 using namespace std; … … 249 250 } // if 250 251 252 OPTPRINT( "expandUniqueExpr" ); // xxx - is this the right place for this? 253 Tuples::expandUniqueExpr( translationUnit ); 254 251 255 // fix ObjectDecl - replaces ConstructorInit nodes 252 256 OPTPRINT( "fixInit" ) … … 272 276 OPTPRINT( "box" ) 273 277 GenPoly::box( translationUnit ); 278 OPTPRINT( "expandTuples" ); // xxx - is this the right place for this? 279 Tuples::expandTuples( translationUnit ); 274 280 275 281 // print tree right before code generation
Note:
See TracChangeset
for help on using the changeset viewer.