Changes in / [a1e67dd:fe7b281]
- Location:
- src
- Files:
-
- 5 added
- 2 deleted
- 60 edited
-
CodeGen/CodeGenerator.cc (modified) (4 diffs)
-
CodeGen/CodeGenerator.h (modified) (1 diff)
-
CodeGen/GenType.cc (modified) (1 diff)
-
Common/utility.h (modified) (2 diffs)
-
ControlStruct/LabelTypeChecker.cc (added)
-
ControlStruct/LabelTypeChecker.h (added)
-
ControlStruct/Mutate.cc (modified) (2 diffs)
-
ControlStruct/module.mk (modified) (2 diffs)
-
GenPoly/Box.cc (modified) (26 diffs)
-
GenPoly/CopyParams.cc (modified) (1 diff)
-
GenPoly/FindFunction.cc (modified) (2 diffs)
-
GenPoly/GenPoly.cc (modified) (3 diffs)
-
GenPoly/Lvalue.cc (modified) (6 diffs)
-
GenPoly/Specialize.cc (modified) (4 diffs)
-
InitTweak/FixInit.cc (modified) (12 diffs)
-
InitTweak/GenInit.cc (modified) (10 diffs)
-
InitTweak/GenInit.h (modified) (2 diffs)
-
InitTweak/InitTweak.cc (modified) (3 diffs)
-
Makefile.in (modified) (12 diffs)
-
Parser/ExpressionNode.cc (modified) (1 diff)
-
Parser/ParseNode.h (modified) (2 diffs)
-
Parser/TypeData.cc (modified) (2 diffs)
-
Parser/parser.cc (modified) (453 diffs)
-
Parser/parser.yy (modified) (3 diffs)
-
ResolvExpr/Alternative.cc (modified) (5 diffs)
-
ResolvExpr/Alternative.h (modified) (3 diffs)
-
ResolvExpr/AlternativeFinder.cc (modified) (31 diffs)
-
ResolvExpr/AlternativeFinder.h (modified) (2 diffs)
-
ResolvExpr/AlternativePrinter.cc (modified) (2 diffs)
-
ResolvExpr/ConversionCost.cc (modified) (1 diff)
-
ResolvExpr/FindOpenVars.cc (modified) (3 diffs)
-
ResolvExpr/RenameVars.cc (modified) (2 diffs)
-
ResolvExpr/ResolveTypeof.cc (modified) (2 diffs)
-
ResolvExpr/Resolver.cc (modified) (8 diffs)
-
ResolvExpr/TypeEnvironment.cc (modified) (1 diff)
-
ResolvExpr/TypeEnvironment.h (modified) (1 diff)
-
ResolvExpr/Unify.cc (modified) (1 diff)
-
ResolvExpr/typeops.h (modified) (6 diffs)
-
SymTab/Autogen.cc (modified) (1 diff)
-
SymTab/Indexer.cc (modified) (12 diffs)
-
SymTab/Indexer.h (modified) (1 diff)
-
SymTab/Mangler.cc (modified) (4 diffs)
-
SymTab/Validate.cc (modified) (2 diffs)
-
SynTree/AddressExpr.cc (modified) (2 diffs)
-
SynTree/ApplicationExpr.cc (modified) (2 diffs)
-
SynTree/CommaExpr.cc (modified) (1 diff)
-
SynTree/Expression.cc (modified) (20 diffs)
-
SynTree/Expression.h (modified) (8 diffs)
-
SynTree/Initializer.h (modified) (1 diff)
-
SynTree/Mutator.cc (modified) (20 diffs)
-
SynTree/Mutator.h (modified) (2 diffs)
-
SynTree/ReferenceToType.cc (modified) (1 diff)
-
SynTree/SynTree.h (modified) (2 diffs)
-
SynTree/TupleExpr.cc (modified) (3 diffs)
-
SynTree/TupleType.cc (modified) (2 diffs)
-
SynTree/Type.h (modified) (8 diffs)
-
SynTree/TypeSubstitution.cc (modified) (3 diffs)
-
SynTree/Visitor.cc (modified) (11 diffs)
-
SynTree/Visitor.h (modified) (2 diffs)
-
Tuples/NameMatcher.cc (added)
-
Tuples/NameMatcher.h (added)
-
Tuples/TupleAssignment.cc (modified) (3 diffs)
-
Tuples/TupleAssignment.h (added)
-
Tuples/TupleExpansion.cc (deleted)
-
Tuples/Tuples.h (deleted)
-
Tuples/module.mk (modified) (2 diffs)
-
main.cc (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
ra1e67dd rfe7b281 309 309 UntypedExpr * newExpr = new UntypedExpr( new NameExpr( "*?" ) ); 310 310 newExpr->get_args().push_back( *arg ); 311 Type * type = InitTweak::getPointerBase( (*arg)->get_result() ); 311 assert( (*arg)->get_results().size() == 1 ); 312 Type * type = InitTweak::getPointerBase( (*arg)->get_results().front() ); 312 313 assert( type ); 313 newExpr-> set_result( type->clone() );314 newExpr->get_results().push_back( type->clone() ); 314 315 *arg = newExpr; 315 316 } // if … … 526 527 extension( castExpr ); 527 528 output << "("; 528 if ( castExpr->get_result ()->isVoid() ) {529 if ( castExpr->get_results().empty() ) { 529 530 output << "(void)" ; 530 } else if ( ! castExpr->get_result ()->get_isLvalue() ) {531 } else if ( ! castExpr->get_results().front()->get_isLvalue() ) { 531 532 // at least one result type of cast, but not an lvalue 532 533 output << "("; 533 output << genType( castExpr->get_result (), "" );534 output << genType( castExpr->get_results().front(), "" ); 534 535 output << ")"; 535 536 } else { … … 639 640 } 640 641 641 void CodeGenerator::visit( TupleExpr * tupleExpr ) { assert( false );}642 void CodeGenerator::visit( TupleExpr * tupleExpr ) {} 642 643 643 644 void CodeGenerator::visit( TypeExpr * typeExpr ) {} … … 653 654 asmExpr->get_operand()->accept( *this ); 654 655 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 value674 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 } // if686 ++i;687 }688 cur_indent -= CodeGenerator::tabsize;689 output << indent << "})";690 656 } 691 657 -
src/CodeGen/CodeGenerator.h
ra1e67dd rfe7b281 70 70 virtual void visit( ConditionalExpr *conditionalExpr ); 71 71 virtual void visit( CommaExpr *commaExpr ); 72 virtual void visit( CompoundLiteralExpr *compLitExpr );73 72 virtual void visit( TupleExpr *tupleExpr ); 74 73 virtual void visit( TypeExpr *typeExpr ); 75 74 virtual void visit( AsmExpr * ); 76 virtual void visit( StmtExpr * );77 75 78 76 //*** Statements -
src/CodeGen/GenType.cc
ra1e67dd rfe7b281 227 227 typeString = "_Atomic " + typeString; 228 228 } // if 229 if ( type->get_isAttribute() ) { 230 typeString = "__attribute(( )) " + typeString; 231 } // if 229 232 } 230 233 } // namespace CodeGen -
src/Common/utility.h
ra1e67dd rfe7b281 148 148 } 149 149 150 // replace element of list with all elements of another list151 150 template< typename T > 152 151 void replace( std::list< T > &org, typename std::list< T >::iterator pos, std::list< T > &with ) { … … 159 158 160 159 return; 161 }162 163 // replace range of a list with a single element164 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 );168 160 } 169 161 -
src/ControlStruct/Mutate.cc
ra1e67dd rfe7b281 23 23 #include "MLEMutator.h" 24 24 #include "ForExprMutator.h" 25 #include "LabelTypeChecker.h" 25 26 //#include "ExceptMutator.h" 26 27 … … 40 41 41 42 //ExceptMutator exc; 43 // LabelTypeChecker lbl; 42 44 43 45 mutateAll( translationUnit, formut ); 44 46 acceptAll( translationUnit, lfix ); 45 47 //mutateAll( translationUnit, exc ); 48 //acceptAll( translationUnit, lbl ); 46 49 } 47 50 } // namespace CodeGen -
src/ControlStruct/module.mk
ra1e67dd rfe7b281 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 21 ControlStruct/ForExprMutator.cc \ 22 ControlStruct/LabelTypeChecker.cc 22 23 -
src/GenPoly/Box.cc
ra1e67dd rfe7b281 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 Type::ForallList&forall );112 void findTypeOps( const std::list< TypeDecl *> &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 Type::ForallList&forall ) {614 void Pass1::findTypeOps( const std::list< TypeDecl *> &forall ) { 615 615 // what if a nested function uses an assignment operator? 616 616 // assignOps.clear(); 617 for ( Type::ForallList::const_iterator i = forall.begin(); i != forall.end(); ++i ) {617 for ( std::list< TypeDecl *>::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 ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {682 for ( std::list< TypeDecl *>::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()->has_result() ) return;785 FunctionType *funcType = getFunctionType( appExpr->get_function()->get_result () );784 if ( appExpr->get_function()->get_results().empty() ) return; 785 FunctionType *funcType = getFunctionType( appExpr->get_function()->get_results().front() ); 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 ) continue; // xxx - previously had check for non-empty fnArgBase results802 passArgTypeVars( appExpr, (*fnParm)->get_type(), fnArgBase->get_result (), arg, exprTyVars, seenTypes );801 if ( ! fnArgBase || fnArgBase->get_results().empty() ) continue; 802 passArgTypeVars( appExpr, (*fnParm)->get_type(), fnArgBase->get_results().front(), 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 ) ); // xxx - result is never set on NameExpr892 appExpr->set_function( new NameExpr( adapterName ) ); 893 893 894 894 return ret; … … 896 896 897 897 void Pass1::boxParam( Type *param, Expression *&arg, const TyVarMap &exprTyVars ) { 898 assert( arg->has_result() );898 assert( ! arg->get_results().empty() ); 899 899 if ( isPolyType( param, exprTyVars ) ) { 900 if ( isPolyType( arg->get_result () ) ) {900 if ( isPolyType( arg->get_results().front() ) ) { 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 ()->get_isLvalue() ) {903 } else if ( arg->get_results().front()->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 ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {948 for ( std::list< TypeDecl *>::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-> set_result( arg->get_type()->clone() );989 deref->get_results().push_back( arg->get_type()->clone() ); 990 990 return deref; 991 991 } // if … … 1013 1013 Statement *bodyStmt; 1014 1014 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();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(); 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 ( Type::ForallList::iterator tyVar = functionType->get_forall().begin(); tyVar != functionType->get_forall().end(); ++tyVar ) {1066 for ( std::list< TypeDecl *>::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-> set_result( appExpr->get_result()->clone());1126 addAssign->get_results().front() = appExpr->get_results().front()->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->has_result() );1140 assert( ! appExpr->get_results().empty() ); 1141 1141 assert( appExpr->get_args().size() == 2 ); 1142 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result (), scopeTyVars, env );1143 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result (), scopeTyVars, env );1142 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_results().front(), scopeTyVars, env ); 1143 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_results().front(), 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-> set_result( appExpr->get_result()->clone() );1163 ret->get_results().push_front( appExpr->get_results().front()->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->has_result() );1173 assert( ! appExpr->get_results().empty() ); 1174 1174 assert( ! appExpr->get_args().empty() ); 1175 if ( isPolyType( appExpr->get_result (), scopeTyVars, env ) ) {1175 if ( isPolyType( appExpr->get_results().front(), scopeTyVars, env ) ) { 1176 1176 Expression *ret = appExpr->get_args().front(); 1177 delete ret->get_result ();1178 ret-> set_result( appExpr->get_result()->clone());1177 delete ret->get_results().front(); 1178 ret->get_results().front() = appExpr->get_results().front()->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->has_result() );1188 assert( ! appExpr->get_results().empty() ); 1189 1189 assert( appExpr->get_args().size() == 1 ); 1190 if ( Type *baseType = isPolyPtr( appExpr->get_result (), scopeTyVars, env ) ) {1191 Type *tempType = appExpr->get_result ()->clone();1190 if ( Type *baseType = isPolyPtr( appExpr->get_results().front(), scopeTyVars, env ) ) { 1191 Type *tempType = appExpr->get_results().front()->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->has_result() );1208 assert( ! appExpr->get_results().empty() ); 1209 1209 assert( appExpr->get_args().size() == 1 ); 1210 if ( Type *baseType = isPolyPtr( appExpr->get_result (), scopeTyVars, env ) ) {1210 if ( Type *baseType = isPolyPtr( appExpr->get_results().front(), 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->has_result() );1214 assert( ! appExpr->get_results().empty() ); 1215 1215 assert( appExpr->get_args().size() == 2 ); 1216 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result (), scopeTyVars, env );1217 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result (), scopeTyVars, env );1216 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_results().front(), scopeTyVars, env ); 1217 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_results().front(), 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-> set_result( appExpr->get_result()->clone() );1222 divide->get_results().push_front( appExpr->get_results().front()->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->has_result() );1240 assert( ! appExpr->get_results().empty() ); 1241 1241 assert( appExpr->get_args().size() == 2 ); 1242 Type *baseType = isPolyPtr( appExpr->get_result (), scopeTyVars, env );1242 Type *baseType = isPolyPtr( appExpr->get_results().front(), 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()->has_result() ); 1269 PointerType *pointer = safe_dynamic_cast< PointerType *>( appExpr->get_function()->get_result() ); 1270 FunctionType *function = safe_dynamic_cast< FunctionType *>( pointer->get_base() ); 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 ); 1271 1273 1272 1274 if ( Expression *newExpr = handleIntrinsics( appExpr ) ) { … … 1306 1308 1307 1309 Expression *Pass1::mutate( UntypedExpr *expr ) { 1308 if ( expr->has_result() && isPolyType( expr->get_result(), scopeTyVars, env ) ) {1310 if ( ! expr->get_results().empty() && isPolyType( expr->get_results().front(), scopeTyVars, env ) ) { 1309 1311 if ( NameExpr *name = dynamic_cast< NameExpr *>( expr->get_function() ) ) { 1310 1312 if ( name->get_name() == "*?" ) { … … 1320 1322 1321 1323 Expression *Pass1::mutate( AddressExpr *addrExpr ) { 1322 assert( addrExpr->get_arg()->has_result() && ! addrExpr->get_arg()->get_result()->isVoid() );1324 assert( ! addrExpr->get_arg()->get_results().empty() ); 1323 1325 1324 1326 bool needs = false; 1325 1327 if ( UntypedExpr *expr = dynamic_cast< UntypedExpr *>( addrExpr->get_arg() ) ) { 1326 if ( expr->has_result() && isPolyType( expr->get_result(), scopeTyVars, env ) ) {1328 if ( ! expr->get_results().empty() && isPolyType( expr->get_results().front(), scopeTyVars, env ) ) { 1327 1329 if ( NameExpr *name = dynamic_cast< NameExpr *>( expr->get_function() ) ) { 1328 1330 if ( name->get_name() == "*?" ) { 1329 1331 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr->get_args().front() ) ) { 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() ); 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 ); 1333 1337 needs = needsAdapter( function, scopeTyVars ); 1334 1338 } // if … … 1339 1343 // isPolyType check needs to happen before mutating addrExpr arg, so pull it forward 1340 1344 // out of the if condition. 1341 bool polytype = isPolyType( addrExpr->get_arg()->get_result (), scopeTyVars, env );1345 bool polytype = isPolyType( addrExpr->get_arg()->get_results().front(), scopeTyVars, env ); 1342 1346 addrExpr->set_arg( mutateExpression( addrExpr->get_arg() ) ); 1343 1347 if ( polytype || needs ) { 1344 1348 Expression *ret = addrExpr->get_arg(); 1345 delete ret->get_result ();1346 ret-> set_result( addrExpr->get_result()->clone());1349 delete ret->get_results().front(); 1350 ret->get_results().front() = addrExpr->get_results().front()->clone(); 1347 1351 addrExpr->set_arg( 0 ); 1348 1352 delete addrExpr; … … 1382 1386 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 1383 1387 if ( retval && returnStmt->get_expr() ) { 1384 assert( returnStmt->get_expr()->has_result() && ! returnStmt->get_expr()->get_result()->isVoid() );1388 assert( ! returnStmt->get_expr()->get_results().empty() ); 1385 1389 // ***** Code Removal ***** After introducing a temporary variable for all return expressions, the following code appears superfluous. 1386 1390 // if ( returnStmt->get_expr()->get_results().front()->get_isLvalue() ) { … … 1416 1420 // find each of its needed secondary assignment operators 1417 1421 std::list< Expression* > &tyParams = refType->get_parameters(); 1418 Type::ForallList&forallParams = functionDecl->get_type()->get_forall();1422 std::list< TypeDecl* > &forallParams = functionDecl->get_type()->get_forall(); 1419 1423 std::list< Expression* >::const_iterator tyIt = tyParams.begin(); 1420 Type::ForallList::const_iterator forallIt = forallParams.begin();1424 std::list< TypeDecl* >::const_iterator forallIt = forallParams.begin(); 1421 1425 for ( ; tyIt != tyParams.end() && forallIt != forallParams.end(); ++tyIt, ++forallIt ) { 1422 1426 // Add appropriate mapping to assignment expression environment … … 1462 1466 // replace return statement with appropriate assignment to out parameter 1463 1467 Expression *retParm = new NameExpr( retval->get_name() ); 1464 retParm-> set_result( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) );1468 retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) ); 1465 1469 assignExpr->get_args().push_back( retParm ); 1466 1470 assignExpr->get_args().push_back( returnStmt->get_expr() ); … … 1592 1596 ObjectDecl newPtr( "", DeclarationNode::NoStorageClass, LinkageSpec::C, 0, 1593 1597 new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ), 0 ); 1594 for ( Type::ForallList::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) {1598 for ( std::list< TypeDecl *>::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) { 1595 1599 ObjectDecl *sizeParm, *alignParm; 1596 1600 // add all size and alignment parameters to parameter list -
src/GenPoly/CopyParams.cc
ra1e67dd rfe7b281 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 ( Type::ForallList::const_iterator tyVar = funcDecl->get_functionType()->get_forall().begin(); tyVar != funcDecl->get_functionType()->get_forall().end(); ++tyVar ) {56 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 29 29 virtual Type *mutate( PointerType *pointerType ); 30 30 private: 31 void handleForall( const Type::ForallList&forall );31 void handleForall( const std::list< TypeDecl* > &forall ); 32 32 33 33 std::list< FunctionType* > &functions; … … 51 51 } 52 52 53 void FindFunction::handleForall( const Type::ForallList&forall ) {54 for ( Type::ForallList::const_iterator i = forall.begin(); i != forall.end(); ++i ) {53 void FindFunction::handleForall( const std::list< TypeDecl* > &forall ) { 54 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 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 ( Type::ForallList::const_iterator tyVar = type->get_forall().begin(); tyVar != type->get_forall().end(); ++tyVar ) {230 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 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() ); 101 103 102 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 103 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 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 ); 104 108 105 109 Type *funType = isLvalueRet( function ); 106 110 if ( funType && ! isIntrinsicApp( appExpr ) ) { 107 111 Expression *expr = appExpr; 108 Type *appType = appExpr->get_result ();112 Type *appType = appExpr->get_results().front(); 109 113 if ( isPolyType( funType ) && ! isPolyType( appType ) ) { 110 114 // make sure cast for polymorphic type is inside dereference … … 112 116 } 113 117 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 114 deref-> set_result( appType->clone() );115 appExpr-> set_result( new PointerType( Type::Qualifiers(), appType ));118 deref->get_results().push_back( appType->clone() ); 119 appExpr->get_results().front() = new PointerType( Type::Qualifiers(), appType ); 116 120 deref->get_args().push_back( expr ); 117 121 return deref; … … 123 127 Statement * Pass1::mutate(ReturnStmt *retStmt) { 124 128 if ( retval && retStmt->get_expr() ) { 125 if ( retStmt->get_expr()->get_result()->get_isLvalue() ) { 129 assert( ! retStmt->get_expr()->get_results().empty() ); 130 if ( retStmt->get_expr()->get_results().front()->get_isLvalue() ) { 126 131 // ***** Code Removal ***** because casts may be stripped already 127 132 … … 150 155 retParm->set_type( new PointerType( Type::Qualifiers(), retParm->get_type() ) ); 151 156 } // if 152 157 153 158 Visitor::visit( funType ); 154 159 } -
src/GenPoly/Specialize.cc
ra1e67dd rfe7b281 147 147 148 148 Expression * Specialize::doSpecialization( Type *formalType, Expression *actual, InferredParams *inferParams ) { 149 assert( actual->has_result() );150 if ( needsSpecialization( formalType, actual->get_result (), env ) ) {149 assert( ! actual->get_results().empty() ); // using front, should have this assert 150 if ( needsSpecialization( formalType, actual->get_results().front(), 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()->has_result() );174 FunctionType *function = getFunctionType( appExpr->get_function()->get_result () );173 assert( ! appExpr->get_function()->get_results().empty() ); 174 FunctionType *function = getFunctionType( appExpr->get_function()->get_results().front() ); 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->has_result() );203 addrExpr->set_arg( doSpecialization( addrExpr->get_result (), addrExpr->get_arg() ) );202 assert( ! addrExpr->get_results().empty() ); 203 addrExpr->set_arg( doSpecialization( addrExpr->get_results().front(), 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 ()->isVoid() ) {209 if ( castExpr->get_results().empty() ) { 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 (), castExpr->get_arg() );213 Expression *specialized = doSpecialization( castExpr->get_results().front(), castExpr->get_arg() ); 214 214 if ( specialized != castExpr->get_arg() ) { 215 215 // assume here that the specialization incorporates the cast -
src/InitTweak/FixInit.cc
ra1e67dd rfe7b281 35 35 #include "GenPoly/DeclMutator.h" 36 36 #include "SynTree/AddStmtVisitor.h" 37 #include "CodeGen/GenType.h" // for warning /error messages38 39 bool ctordtorp = false; // print all debug40 bool ctorp = false; // print ctor debug41 bool cpctorp = false; // print copy ctor debug42 bool dtorp = false; // print dtor debug37 #include "CodeGen/GenType.h" // for warnings 38 39 bool ctordtorp = false; 40 bool ctorp = false; 41 bool cpctorp = false; 42 bool dtorp = false; 43 43 #define PRINT( text ) if ( ctordtorp ) { text } 44 44 #define CP_CTOR_PRINT( text ) if ( ctordtorp || cpctorp ) { text } … … 47 47 namespace InitTweak { 48 48 namespace { 49 const std::list<Label> noLabels; 50 const std::list<Expression*> noDesignators; 51 49 52 class InsertImplicitCalls : public GenPoly::PolyMutator { 50 53 public: … … 66 69 67 70 /// create and resolve ctor/dtor expression: fname(var, [cpArg]) 68 Expression * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 69 Expression * makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg = NULL ); 71 ApplicationExpr * makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg = NULL ); 70 72 /// true if type does not need to be copy constructed to ensure correctness 71 bool skipCopyConstruct( Type * type ); 72 void copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr * impCpCtorExpr ); 73 void destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ); 73 bool skipCopyConstruct( Type * ); 74 74 private: 75 75 TypeSubstitution * env; … … 357 357 } 358 358 359 Expression* ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) {359 ApplicationExpr * ResolveCopyCtors::makeCtorDtor( const std::string & fname, ObjectDecl * var, Expression * cpArg ) { 360 360 assert( var ); 361 return makeCtorDtor( fname, new AddressExpr( new VariableExpr( var ) ), cpArg );362 }363 364 Expression * ResolveCopyCtors::makeCtorDtor( const std::string & fname, Expression * thisArg, Expression * cpArg ) {365 assert( thisArg );366 361 UntypedExpr * untyped = new UntypedExpr( new NameExpr( fname ) ); 367 untyped->get_args().push_back( thisArg);362 untyped->get_args().push_back( new AddressExpr( new VariableExpr( var ) ) ); 368 363 if (cpArg) untyped->get_args().push_back( cpArg->clone() ); 369 364 … … 372 367 // (VariableExpr and already resolved expression) 373 368 CP_CTOR_PRINT( std::cerr << "ResolvingCtorDtor " << untyped << std::endl; ) 374 Expression * resolved = ResolvExpr::findVoidExpression( untyped, *this ); 375 assert( resolved ); 369 ApplicationExpr * resolved = dynamic_cast< ApplicationExpr * >( ResolvExpr::findVoidExpression( untyped, *this ) ); 376 370 if ( resolved->get_env() ) { 377 371 env->add( *resolved->get_env() ); 378 372 } // if 379 373 374 assert( resolved ); 380 375 delete untyped; 381 376 return resolved; 382 377 } 383 378 384 void ResolveCopyCtors:: copyConstructArg( Expression *& arg, ImplicitCopyCtorExpr *impCpCtorExpr ) {379 void ResolveCopyCtors::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 385 380 static UniqueName tempNamer("_tmp_cp"); 386 CP_CTOR_PRINT( std::cerr << "Type Substitution: " << *impCpCtorExpr->get_env() << std::endl; ) 387 assert( arg->has_result() ); 388 Type * result = arg->get_result(); 389 if ( skipCopyConstruct( result ) ) return; // skip certain non-copyable types 390 391 // type may involve type variables, so apply type substitution to get temporary variable's actual type 392 result = result->clone(); 393 impCpCtorExpr->get_env()->apply( result ); 394 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, result, 0 ); 395 tmp->get_type()->set_isConst( false ); 396 397 // create and resolve copy constructor 398 CP_CTOR_PRINT( std::cerr << "makeCtorDtor for an argument" << std::endl; ) 399 Expression * cpCtor = makeCtorDtor( "?{}", tmp, arg ); 400 401 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( cpCtor ) ) { 402 // if the chosen constructor is intrinsic, the copy is unnecessary, so 403 // don't create the temporary and don't call the copy constructor 404 VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() ); 405 assert( function ); 406 if ( function->get_var()->get_linkage() == LinkageSpec::Intrinsic ) return; 407 } 408 409 // replace argument to function call with temporary 410 arg = new CommaExpr( cpCtor, new VariableExpr( tmp ) ); 411 impCpCtorExpr->get_tempDecls().push_back( tmp ); 412 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", tmp ) ); 413 } 414 415 void ResolveCopyCtors::destructRet( Expression * ret, ImplicitCopyCtorExpr * impCpCtorExpr ) { 416 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", new AddressExpr( ret ) ) ); 417 } 418 419 void ResolveCopyCtors::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) { 381 static UniqueName retNamer("_tmp_cp_ret"); 382 420 383 CP_CTOR_PRINT( std::cerr << "ResolveCopyCtors: " << impCpCtorExpr << std::endl; ) 421 384 Visitor::visit( impCpCtorExpr ); … … 426 389 // take each argument and attempt to copy construct it. 427 390 for ( Expression * & arg : appExpr->get_args() ) { 428 copyConstructArg( arg, impCpCtorExpr ); 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 429 416 } // for 430 417 … … 436 423 // level. Trying to pass that environment along. 437 424 callExpr->set_env( impCpCtorExpr->get_env()->clone() ); 438 Type * result = appExpr->get_result(); 439 if ( ! result->isVoid() ) { 440 static UniqueName retNamer("_tmp_cp_ret"); 425 for ( Type * result : appExpr->get_results() ) { 441 426 result = result->clone(); 442 427 impCpCtorExpr->get_env()->apply( result ); … … 445 430 impCpCtorExpr->get_returnDecls().push_back( ret ); 446 431 CP_CTOR_PRINT( std::cerr << "makeCtorDtor for a return" << std::endl; ) 447 destructRet( new VariableExpr( ret ) , impCpCtorExpr);432 impCpCtorExpr->get_dtors().push_front( makeCtorDtor( "^?{}", ret ) ); 448 433 } // for 449 434 CP_CTOR_PRINT( std::cerr << "after Resolving: " << impCpCtorExpr << std::endl; ) … … 494 479 // know the result type of the assignment is the type of the LHS (minus the pointer), so 495 480 // add that onto the assignment expression so that later steps have the necessary information 496 assign-> set_result( returnDecl->get_type()->clone() );481 assign->add_result( returnDecl->get_type()->clone() ); 497 482 498 483 Expression * retExpr = new CommaExpr( assign, new VariableExpr( returnDecl ) ); 499 if ( callExpr->get_result ()->get_isLvalue() ) {484 if ( callExpr->get_results().front()->get_isLvalue() ) { 500 485 // lvalue returning functions are funny. Lvalue.cc inserts a *? in front of any lvalue returning 501 486 // non-intrinsic function. Add an AddressExpr to the call to negate the derefence and change the … … 515 500 UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) ); 516 501 deref->get_args().push_back( retExpr ); 517 deref-> set_result( resultType );502 deref->add_result( resultType ); 518 503 retExpr = deref; 519 504 } // if … … 954 939 Expression * FixCtorExprs::mutate( ConstructorExpr * ctorExpr ) { 955 940 static UniqueName tempNamer( "_tmp_ctor_expr" ); 956 // xxx - is the size check necessary? 957 assert( ctorExpr->has_result() && ctorExpr->get_result()->size() == 1 ); 958 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_result()->clone(), nullptr ); 941 assert( ctorExpr->get_results().size() == 1 ); 942 ObjectDecl * tmp = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, nullptr, ctorExpr->get_results().front()->clone(), nullptr ); 959 943 addDeclaration( tmp ); 960 944 … … 968 952 assign->get_args().push_back( new VariableExpr( tmp ) ); 969 953 assign->get_args().push_back( firstArg ); 970 assign->set_result( ctorExpr->get_result()->clone() );954 cloneAll( ctorExpr->get_results(), assign->get_results() ); 971 955 firstArg = assign; 972 956 -
src/InitTweak/GenInit.cc
ra1e67dd rfe7b281 29 29 #include "GenPoly/DeclMutator.h" 30 30 #include "GenPoly/ScopedSet.h" 31 #include "ResolvExpr/typeops.h"32 31 33 32 namespace InitTweak { … … 51 50 52 51 protected: 53 FunctionType * ftype;52 std::list<DeclarationWithType*> returnVals; 54 53 UniqueName tempNamer; 55 54 std::string funcName; … … 87 86 88 87 bool isManaged( ObjectDecl * objDecl ) const ; // determine if object is managed 89 bool isManaged( Type * type ) const; // determine if type is managed90 88 void handleDWT( DeclarationWithType * dwt ); // add type to managed if ctor/dtor 91 89 GenPoly::ScopedSet< std::string > managedTypes; … … 136 134 137 135 Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) { 138 std::list< DeclarationWithType * > & returnVals = ftype->get_returnVals();136 // update for multiple return values 139 137 assert( returnVals.size() == 0 || returnVals.size() == 1 ); 140 138 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address … … 158 156 159 157 DeclarationWithType* ReturnFixer::mutate( FunctionDecl *functionDecl ) { 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 ); 158 ValueGuard< std::list<DeclarationWithType*> > oldReturnVals( returnVals ); 170 159 ValueGuard< std::string > oldFuncName( funcName ); 171 160 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 } 161 FunctionType * type = functionDecl->get_functionType(); 162 returnVals = type->get_returnVals(); 180 163 funcName = functionDecl->get_name(); 181 164 DeclarationWithType * decl = Mutator::mutate( functionDecl ); … … 237 220 } 238 221 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 managed242 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 249 222 bool CtorDtor::isManaged( ObjectDecl * objDecl ) const { 250 223 Type * type = objDecl->get_type(); … … 252 225 type = at->get_base(); 253 226 } 254 return isManaged( type);227 return managedTypes.find( SymTab::Mangler::mangle( type ) ) != managedTypes.end(); 255 228 } 256 229 … … 263 236 managedTypes.insert( SymTab::Mangler::mangle( type->get_base() ) ); 264 237 } 265 }266 267 ConstructorInit * genCtorInit( ObjectDecl * objDecl ) {268 // call into genImplicitCall from Autogen.h to generate calls to ctor/dtor269 // for each constructable object270 std::list< Statement * > ctor;271 std::list< Statement * > dtor;272 273 InitExpander srcParam( objDecl->get_init() );274 InitExpander nullParam( (Initializer *)NULL );275 SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), "?{}", back_inserter( ctor ), objDecl );276 SymTab::genImplicitCall( nullParam, new VariableExpr( objDecl ), "^?{}", front_inserter( dtor ), objDecl, false );277 278 // Currently genImplicitCall produces a single Statement - a CompoundStmt279 // which wraps everything that needs to happen. As such, it's technically280 // possible to use a Statement ** in the above calls, but this is inherently281 // unsafe, so instead we take the slightly less efficient route, but will be282 // immediately informed if somehow the above assumption is broken. In this case,283 // we could always wrap the list of statements at this point with a CompoundStmt,284 // but it seems reasonable at the moment for this to be done by genImplicitCall285 // itself. It is possible that genImplicitCall produces no statements (e.g. if286 // an array type does not have a dimension). In this case, it's fine to ignore287 // the object for the purposes of construction.288 assert( ctor.size() == dtor.size() && ctor.size() <= 1 );289 if ( ctor.size() == 1 ) {290 // need to remember init expression, in case no ctors exist291 // if ctor does exist, want to use ctor expression instead of init292 // push this decision to the resolver293 assert( dynamic_cast< ImplicitCtorDtorStmt * > ( ctor.front() ) && dynamic_cast< ImplicitCtorDtorStmt * > ( dtor.front() ) );294 return new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() );295 }296 return nullptr;297 238 } 298 239 … … 307 248 if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl ); 308 249 309 objDecl->set_init( genCtorInit( objDecl ) ); 250 // call into genImplicitCall from Autogen.h to generate calls to ctor/dtor 251 // for each constructable object 252 std::list< Statement * > ctor; 253 std::list< Statement * > dtor; 254 255 InitExpander srcParam( objDecl->get_init() ); 256 InitExpander nullParam( (Initializer *)NULL ); 257 SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), "?{}", back_inserter( ctor ), objDecl ); 258 SymTab::genImplicitCall( nullParam, new VariableExpr( objDecl ), "^?{}", front_inserter( dtor ), objDecl, false ); 259 260 // Currently genImplicitCall produces a single Statement - a CompoundStmt 261 // which wraps everything that needs to happen. As such, it's technically 262 // possible to use a Statement ** in the above calls, but this is inherently 263 // unsafe, so instead we take the slightly less efficient route, but will be 264 // immediately informed if somehow the above assumption is broken. In this case, 265 // we could always wrap the list of statements at this point with a CompoundStmt, 266 // but it seems reasonable at the moment for this to be done by genImplicitCall 267 // itself. It is possible that genImplicitCall produces no statements (e.g. if 268 // an array type does not have a dimension). In this case, it's fine to ignore 269 // the object for the purposes of construction. 270 assert( ctor.size() == dtor.size() && ctor.size() <= 1 ); 271 if ( ctor.size() == 1 ) { 272 // need to remember init expression, in case no ctors exist 273 // if ctor does exist, want to use ctor expression instead of init 274 // push this decision to the resolver 275 assert( dynamic_cast< ImplicitCtorDtorStmt * > ( ctor.front() ) && dynamic_cast< ImplicitCtorDtorStmt * > ( dtor.front() ) ); 276 objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) ); 277 } 310 278 } 311 279 return Parent::mutate( objDecl ); … … 320 288 managedTypes.beginScope(); 321 289 // go through assertions and recursively add seen ctor/dtors 322 for ( auto &tyDecl : functionDecl->get_functionType()->get_forall() ) {290 for ( TypeDecl * tyDecl : functionDecl->get_functionType()->get_forall() ) { 323 291 for ( DeclarationWithType *& assertion : tyDecl->get_assertions() ) { 324 292 assertion = assertion->acceptMutator( *this ); -
src/InitTweak/GenInit.h
ra1e67dd rfe7b281 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // GenInit.h --7 // RemoveInit.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves … … 27 27 /// Adds return value temporaries and wraps Initializers in ConstructorInit nodes 28 28 void genInit( std::list< Declaration * > & translationUnit ); 29 30 /// creates an appropriate ConstructorInit node which contains a constructor, destructor, and C-initializer31 ConstructorInit * genCtorInit( ObjectDecl * objDecl );32 29 } // namespace 33 30 -
src/InitTweak/InitTweak.cc
ra1e67dd rfe7b281 340 340 return allofCtorDtor( stmt, []( Expression * callExpr ){ 341 341 if ( ApplicationExpr * appExpr = isIntrinsicCallExpr( callExpr ) ) { 342 FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_result() ); 342 assert( ! appExpr->get_function()->get_results().empty() ); 343 FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_results().front() ); 343 344 assert( funcType ); 344 345 return funcType->get_parameters().size() == 1; … … 387 388 return memberExpr->get_member()->get_name(); 388 389 } else if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * > ( func ) ) { 389 return funcName( memberExpr->get_member());390 return memberExpr->get_member(); 390 391 } else { 391 392 assertf( false, "Unexpected expression type being called as a function in call expression" ); … … 450 451 // virtual void visit( LogicalExpr *logicalExpr ); 451 452 // virtual void visit( ConditionalExpr *conditionalExpr ); 453 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; } 454 virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; } 452 455 virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; } 453 456 virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; } 454 457 virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; } 455 458 virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; } 456 virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }457 virtual void visit( TupleAssignExpr *tupleExpr ) { isConstExpr = false; }458 459 459 460 bool isConstExpr; -
src/Makefile.in
ra1e67dd rfe7b281 105 105 ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) \ 106 106 ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT) \ 107 ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT) \ 107 108 GenPoly/driver_cfa_cpp-Box.$(OBJEXT) \ 108 109 GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT) \ … … 190 191 SynTree/driver_cfa_cpp-Attribute.$(OBJEXT) \ 191 192 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \ 192 Tuples/driver_cfa_cpp- TupleExpansion.$(OBJEXT)193 Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT) 193 194 am_driver_cfa_cpp_OBJECTS = $(am__objects_1) 194 195 driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS) … … 363 364 ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \ 364 365 ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \ 365 ControlStruct/ForExprMutator.cc GenPoly/Box.cc \ 366 ControlStruct/ForExprMutator.cc \ 367 ControlStruct/LabelTypeChecker.cc GenPoly/Box.cc \ 366 368 GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \ 367 369 GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \ … … 403 405 SynTree/AddStmtVisitor.cc SynTree/TypeSubstitution.cc \ 404 406 SynTree/Attribute.cc Tuples/TupleAssignment.cc \ 405 Tuples/ TupleExpansion.cc407 Tuples/NameMatcher.cc 406 408 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \ 407 409 ${cfa_cpplib_PROGRAMS}} … … 538 540 ControlStruct/$(DEPDIR)/$(am__dirstamp) 539 541 ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT): \ 542 ControlStruct/$(am__dirstamp) \ 543 ControlStruct/$(DEPDIR)/$(am__dirstamp) 544 ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT): \ 540 545 ControlStruct/$(am__dirstamp) \ 541 546 ControlStruct/$(DEPDIR)/$(am__dirstamp) … … 771 776 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT): \ 772 777 Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp) 773 Tuples/driver_cfa_cpp- TupleExpansion.$(OBJEXT):\774 Tuples/$( am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp)778 Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT): Tuples/$(am__dirstamp) \ 779 Tuples/$(DEPDIR)/$(am__dirstamp) 775 780 driver/$(am__dirstamp): 776 781 @$(MKDIR_P) driver … … 794 799 -rm -f ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) 795 800 -rm -f ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) 801 -rm -f ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT) 796 802 -rm -f ControlStruct/driver_cfa_cpp-MLEMutator.$(OBJEXT) 797 803 -rm -f ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) … … 880 886 -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) 881 887 -rm -f SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT) 888 -rm -f Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT) 882 889 -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) 883 -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)884 890 885 891 distclean-compile: … … 900 906 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@ 901 907 @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@ 902 909 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-MLEMutator.Po@am__quote@ 903 910 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-Mutate.Po@am__quote@ … … 986 993 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@ 987 994 @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@ 988 996 @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@990 997 991 998 .cc.o: … … 1229 1236 @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` 1230 1237 1238 ControlStruct/driver_cfa_cpp-LabelTypeChecker.o: ControlStruct/LabelTypeChecker.cc 1239 @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.cc 1240 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po 1241 @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.cc 1244 1245 ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj: ControlStruct/LabelTypeChecker.cc 1246 @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.Po 1248 @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 1231 1252 GenPoly/driver_cfa_cpp-Box.o: GenPoly/Box.cc 1232 1253 @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 … … 2419 2440 @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` 2420 2441 2421 Tuples/driver_cfa_cpp- TupleExpansion.o: Tuples/TupleExpansion.cc2422 @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.cc2423 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp- TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po2424 @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.cc2427 2428 Tuples/driver_cfa_cpp- TupleExpansion.obj: Tuples/TupleExpansion.cc2429 @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.Po2431 @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`2442 Tuples/driver_cfa_cpp-NameMatcher.o: Tuples/NameMatcher.cc 2443 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Tuples/driver_cfa_cpp-NameMatcher.o -MD -MP -MF Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo -c -o Tuples/driver_cfa_cpp-NameMatcher.o `test -f 'Tuples/NameMatcher.cc' || echo '$(srcdir)/'`Tuples/NameMatcher.cc 2444 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po 2445 @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.cc 2448 2449 Tuples/driver_cfa_cpp-NameMatcher.obj: Tuples/NameMatcher.cc 2450 @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.Po 2452 @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` 2434 2455 2435 2456 .ll.cc: -
src/Parser/ExpressionNode.cc
ra1e67dd rfe7b281 198 198 } 199 199 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 ) { 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 ) { 206 207 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 207 208 deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) ); 208 UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref ); 209 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref ); 210 delete member; 209 211 return ret; 210 212 } -
src/Parser/ParseNode.h
ra1e67dd rfe7b281 160 160 161 161 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ); 162 Expression * build_fieldSel( ExpressionNode * expr_node, Expression* member );163 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression* member );162 Expression * build_fieldSel( ExpressionNode * expr_node, NameExpr * member ); 163 Expression * build_pfieldSel( ExpressionNode * expr_node, NameExpr * 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 , template< typename, typename...> class Container, typename... Args>386 void buildList( const NodeType * firstNode, Container< SynTreeType *, Args...> &outputList ) {385 template< typename SynTreeType, typename NodeType > 386 void buildList( const NodeType * firstNode, std::list< SynTreeType * > &outputList ) { 387 387 SemanticError errors; 388 std::back_insert_iterator< Container< SynTreeType *, Args...> > out( outputList );388 std::back_insert_iterator< std::list< SynTreeType * > > out( outputList ); 389 389 const NodeType * cur = firstNode; 390 390 -
src/Parser/TypeData.cc
ra1e67dd rfe7b281 385 385 } // TypeData::print 386 386 387 template< typename ForallList > 388 void buildForall( const DeclarationNode * firstNode, ForallList &outputList ) { 387 void buildForall( const DeclarationNode * firstNode, list< TypeDecl* > &outputList ) { 389 388 buildList( firstNode, outputList ); 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 ) { 389 for ( list< TypeDecl* >::iterator i = outputList.begin(); i != outputList.end(); ++i ) { 390 if ( (*i)->get_kind() == TypeDecl::Any ) { 393 391 // add assertion parameters to `type' tyvars in reverse order 394 392 // add dtor: void ^?{}(T *) 395 393 FunctionType * dtorType = new FunctionType( Type::Qualifiers(), 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 ) );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 ) ); 398 396 399 397 // add copy ctor: void ?{}(T *, T) 400 398 FunctionType * copyCtorType = new FunctionType( Type::Qualifiers(), 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 ) );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 ) ); 404 402 405 403 // add default ctor: void ?{}(T *) 406 404 FunctionType * ctorType = new FunctionType( Type::Qualifiers(), 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 ) );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 ) ); 409 407 410 408 // add assignment operator: T * ?=?(T *, T) 411 409 FunctionType * assignType = new FunctionType( Type::Qualifiers(), 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 ) );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 ) ); 416 414 } // if 417 415 } // for … … 517 515 // character types. The implementation shall define char to have the same range, representation, and behavior as 518 516 // either signed char or unsigned char. 519 static BasicType::Kind chartype[] = { BasicType::SignedChar, BasicType::UnsignedChar, BasicType::Char }; 517 static BasicType::Kind chartype[] = { BasicType::SignedChar, BasicType::UnsignedChar, BasicType::Char }; 520 518 521 519 if ( td->length != DeclarationNode::NoLength ) { -
src/Parser/parser.cc
ra1e67dd rfe7b281 1023 1023 static const yytype_uint16 yyrline[] = 1024 1024 { 1025 0, 30 1, 301, 305, 312, 313, 314, 318, 319, 320,1026 32 4, 325, 329, 330, 334, 335, 339, 343, 344, 355,1027 35 7, 359, 361, 366, 367, 373, 377, 379, 381, 383,1028 38 5, 387, 389, 391, 393, 402, 403, 409, 410, 414,1029 41 5, 419, 422, 424, 426, 428, 433, 436, 441, 444,1030 44 6, 448, 453, 466, 468, 470, 472, 474, 476, 478,1031 4 80, 482, 484, 486, 493, 494, 500, 501, 502, 503,1032 50 7, 508, 510, 515, 516, 518, 520, 525, 526, 528,1033 53 3, 534, 536, 541, 542, 544, 546, 548, 553, 554,1034 55 6, 561, 562, 567, 568, 573, 574, 579, 580, 585,1035 58 6, 591, 592, 595, 597, 602, 607, 608, 610, 616,1036 61 7, 621, 622, 623, 624, 625, 626, 627, 628, 629,1037 6 30, 631, 632, 638, 640, 642, 644, 649, 650, 655,1038 65 6, 662, 663, 669, 670, 671, 672, 673, 674, 675,1039 67 6, 677, 687, 694, 696, 706, 707, 712, 714, 720,1040 7 22, 726, 727, 732, 737, 740, 742, 744, 754, 756,1041 76 7, 768, 770, 774, 776, 780, 781, 786, 787, 791,1042 79 6, 797, 801, 803, 809, 810, 814, 816, 818, 820,1043 82 6, 827, 831, 833, 838, 840, 842, 847, 849, 854,1044 85 6, 860, 863, 867, 870, 874, 876, 878, 880, 885,1045 88 7, 889, 894, 896, 898, 900, 902, 907, 909, 911,1046 91 3, 918, 930, 931, 936, 938, 943, 947, 949, 951,1047 95 3, 955, 961, 962, 968, 969, 973, 974, 979, 981,1048 98 7, 988, 990, 995, 1000, 1010, 1012, 1016, 1017, 1022,1049 102 4, 1028, 1029, 1033, 1035, 1039, 1040, 1044, 1045, 1049,1050 10 50, 1065, 1066, 1067, 1068, 1069, 1073, 1078, 1085, 1095,1051 1 100, 1105, 1113, 1118, 1123, 1128, 1133, 1141, 1163, 1168,1052 117 5, 1177, 1184, 1189, 1194, 1205, 1210, 1215, 1220, 1225,1053 123 4, 1239, 1247, 1248, 1249, 1250, 1256, 1261, 1269, 1270,1054 12 71, 1272, 1276, 1277, 1278, 1279, 1284, 1285, 1294, 1295,1055 1 300, 1301, 1306, 1308, 1310, 1312, 1314, 1317, 1316, 1328,1056 132 9, 1331, 1341, 1342, 1347, 1349, 1351, 1353, 1355, 1358,1057 13 60, 1363, 1368, 1370, 1372, 1374, 1376, 1378, 1380, 1382,1058 138 4, 1386, 1388, 1390, 1392, 1398, 1399, 1401, 1403, 1405,1059 14 10, 1411, 1417, 1418, 1420, 1422, 1427, 1429, 1431, 1433,1060 143 8, 1439, 1441, 1443, 1448, 1449, 1451, 1456, 1457, 1459,1061 14 61, 1466, 1468, 1470, 1475, 1476, 1480, 1482, 1488, 1487,1062 14 91, 1493, 1498, 1500, 1506, 1507, 1512, 1513, 1515, 1516,1063 152 5, 1526, 1528, 1530, 1535, 1537, 1543, 1544, 1546, 1549,1064 15 52, 1557, 1558, 1563, 1568, 1572, 1574, 1580, 1579, 1586,1065 158 8, 1594, 1595, 1603, 1604, 1608, 1609, 1610, 1612, 1614,1066 16 21, 1622, 1624, 1626, 1631, 1632, 1638, 1639, 1643, 1644,1067 164 9, 1650, 1651, 1653, 1661, 1662, 1664, 1667, 1669, 1673,1068 167 4, 1675, 1677, 1679, 1683, 1688, 1696, 1697, 1706, 1708,1069 171 3, 1714, 1715, 1719, 1720, 1721, 1725, 1726, 1727, 1731,1070 17 32, 1733, 1738, 1739, 1740, 1741, 1747, 1748, 1750, 1755,1071 175 6, 1761, 1762, 1763, 1764, 1765, 1780, 1781, 1786, 1787,1072 179 3, 1795, 1798, 1800, 1802, 1825, 1826, 1828, 1830, 1835,1073 183 6, 1838, 1843, 1848, 1849, 1855, 1854, 1858, 1862, 1864,1074 186 6, 1872, 1873, 1878, 1883, 1885, 1890, 1892, 1893, 1895,1075 1 900, 1902, 1904, 1909, 1911, 1916, 1921, 1929, 1935, 1934,1076 194 8, 1949, 1954, 1955, 1959, 1964, 1969, 1977, 1982, 1993,1077 199 4, 1999, 2000, 2006, 2007, 2011, 2012, 2013, 2016, 2015,1078 202 6, 2035, 2041, 2047, 2056, 2062, 2068, 2074, 2080, 2088,1079 209 4, 2102, 2108, 2117, 2118, 2119, 2123, 2127, 2129, 2134,1080 213 5, 2139, 2140, 2145, 2151, 2152, 2155, 2157, 2158, 2162,1081 216 3, 2164, 2165, 2199, 2201, 2202, 2204, 2209, 2214, 2219,1082 22 21, 2223, 2228, 2230, 2232, 2234, 2239, 2241, 2250, 2252,1083 225 3, 2258, 2260, 2262, 2267, 2269, 2271, 2276, 2278, 2280,1084 228 9, 2290, 2291, 2295, 2297, 2299, 2304, 2306, 2308, 2313,1085 231 5, 2317, 2332, 2334, 2335, 2337, 2342, 2343, 2348, 2350,1086 23 52, 2357, 2359, 2361, 2363, 2368, 2370, 2372, 2382, 2384,1087 238 5, 2387, 2392, 2394, 2396, 2401, 2403, 2405, 2407, 2412,1088 241 4, 2416, 2447, 2449, 2450, 2452, 2457, 2462, 2470, 2472,1089 247 4, 2479, 2481, 2486, 2488, 2502, 2503, 2505, 2510, 2512,1090 251 4, 2516, 2518, 2523, 2524, 2526, 2528, 2533, 2535, 2537,1091 254 3, 2545, 2547, 2551, 2553, 2555, 2557, 2571, 2572, 2574,1092 257 9, 2581, 2583, 2585, 2587, 2592, 2593, 2595, 2597, 2602,1093 260 4, 2606, 2612, 2613, 2615, 2624, 2627, 2629, 2632, 2634,1094 263 6, 2649, 2650, 2652, 2657, 2659, 2661, 2663, 2665, 2670,1095 26 71, 2673, 2675, 2680, 2682, 2690, 2691, 2692, 2697, 2698,1096 2 702, 2704, 2706, 2708, 2710, 2712, 2719, 2721, 2723, 2725,1097 272 7, 2730, 2732, 2734, 2736, 2738, 2743, 2745, 2747, 2752,1098 277 8, 2779, 2781, 2785, 2786, 2790, 2792, 2794, 2796, 2798,1099 2 800, 2807, 2809, 2811, 2813, 2815, 2817, 2822, 2827, 2829,1100 28 31, 2849, 2851, 2856, 28571025 0, 302, 302, 306, 313, 314, 315, 319, 320, 321, 1026 325, 326, 330, 331, 335, 336, 340, 344, 345, 356, 1027 358, 360, 362, 367, 368, 374, 378, 380, 381, 382, 1028 384, 385, 387, 389, 391, 400, 401, 407, 408, 412, 1029 413, 417, 421, 423, 425, 427, 432, 434, 438, 441, 1030 443, 445, 450, 463, 465, 467, 469, 471, 473, 475, 1031 477, 479, 481, 483, 490, 491, 497, 498, 499, 500, 1032 504, 505, 507, 512, 513, 515, 517, 522, 523, 525, 1033 530, 531, 533, 538, 539, 541, 543, 545, 550, 551, 1034 553, 558, 559, 564, 565, 570, 571, 576, 577, 582, 1035 583, 588, 589, 592, 594, 599, 604, 605, 607, 613, 1036 614, 618, 619, 620, 621, 622, 623, 624, 625, 626, 1037 627, 628, 629, 635, 637, 639, 641, 646, 647, 652, 1038 653, 659, 660, 666, 667, 668, 669, 670, 671, 672, 1039 673, 674, 684, 691, 693, 703, 704, 709, 711, 717, 1040 719, 723, 724, 729, 734, 737, 739, 741, 751, 753, 1041 764, 765, 767, 771, 773, 777, 778, 783, 784, 788, 1042 793, 794, 798, 800, 806, 807, 811, 813, 815, 817, 1043 823, 824, 828, 830, 835, 837, 839, 844, 846, 851, 1044 853, 857, 860, 864, 867, 871, 873, 875, 877, 882, 1045 884, 886, 891, 893, 895, 897, 899, 904, 906, 908, 1046 910, 915, 927, 928, 933, 935, 940, 944, 946, 948, 1047 950, 952, 958, 959, 965, 966, 970, 971, 976, 978, 1048 984, 985, 987, 992, 997, 1007, 1009, 1013, 1014, 1019, 1049 1021, 1025, 1026, 1030, 1032, 1036, 1037, 1041, 1042, 1046, 1050 1047, 1062, 1063, 1064, 1065, 1066, 1070, 1075, 1082, 1092, 1051 1097, 1102, 1110, 1115, 1120, 1125, 1130, 1138, 1160, 1165, 1052 1172, 1174, 1181, 1186, 1191, 1202, 1207, 1212, 1217, 1222, 1053 1231, 1236, 1244, 1245, 1246, 1247, 1253, 1258, 1266, 1267, 1054 1268, 1269, 1273, 1274, 1275, 1276, 1281, 1282, 1291, 1292, 1055 1297, 1298, 1303, 1305, 1307, 1309, 1311, 1314, 1313, 1325, 1056 1326, 1328, 1338, 1339, 1344, 1346, 1348, 1350, 1352, 1355, 1057 1357, 1360, 1365, 1367, 1369, 1371, 1373, 1375, 1377, 1379, 1058 1381, 1383, 1385, 1387, 1389, 1395, 1396, 1398, 1400, 1402, 1059 1407, 1408, 1414, 1415, 1417, 1419, 1424, 1426, 1428, 1430, 1060 1435, 1436, 1438, 1440, 1445, 1446, 1448, 1453, 1454, 1456, 1061 1458, 1463, 1465, 1467, 1472, 1473, 1477, 1479, 1485, 1484, 1062 1488, 1490, 1495, 1497, 1503, 1504, 1509, 1510, 1512, 1513, 1063 1522, 1523, 1525, 1527, 1532, 1534, 1540, 1541, 1543, 1546, 1064 1549, 1554, 1555, 1560, 1565, 1569, 1571, 1577, 1576, 1583, 1065 1585, 1591, 1592, 1600, 1601, 1605, 1606, 1607, 1609, 1611, 1066 1618, 1619, 1621, 1623, 1628, 1629, 1635, 1636, 1640, 1641, 1067 1646, 1647, 1648, 1650, 1658, 1659, 1661, 1664, 1666, 1670, 1068 1671, 1672, 1674, 1676, 1680, 1685, 1693, 1694, 1703, 1705, 1069 1710, 1711, 1712, 1716, 1717, 1718, 1722, 1723, 1724, 1728, 1070 1729, 1730, 1735, 1736, 1737, 1738, 1744, 1745, 1747, 1752, 1071 1753, 1758, 1759, 1760, 1761, 1762, 1777, 1778, 1783, 1784, 1072 1790, 1792, 1795, 1797, 1799, 1822, 1823, 1825, 1827, 1832, 1073 1833, 1835, 1840, 1845, 1846, 1852, 1851, 1855, 1859, 1861, 1074 1863, 1869, 1870, 1875, 1880, 1882, 1887, 1889, 1890, 1892, 1075 1897, 1899, 1901, 1906, 1908, 1913, 1918, 1926, 1932, 1931, 1076 1945, 1946, 1951, 1952, 1956, 1961, 1966, 1974, 1979, 1990, 1077 1991, 1996, 1997, 2003, 2004, 2008, 2009, 2010, 2013, 2012, 1078 2023, 2032, 2038, 2044, 2053, 2059, 2065, 2071, 2077, 2085, 1079 2091, 2099, 2105, 2114, 2115, 2116, 2120, 2124, 2126, 2131, 1080 2132, 2136, 2137, 2142, 2148, 2149, 2152, 2154, 2155, 2159, 1081 2160, 2161, 2162, 2196, 2198, 2199, 2201, 2206, 2211, 2216, 1082 2218, 2220, 2225, 2227, 2229, 2231, 2236, 2238, 2247, 2249, 1083 2250, 2255, 2257, 2259, 2264, 2266, 2268, 2273, 2275, 2277, 1084 2286, 2287, 2288, 2292, 2294, 2296, 2301, 2303, 2305, 2310, 1085 2312, 2314, 2329, 2331, 2332, 2334, 2339, 2340, 2345, 2347, 1086 2349, 2354, 2356, 2358, 2360, 2365, 2367, 2369, 2379, 2381, 1087 2382, 2384, 2389, 2391, 2393, 2398, 2400, 2402, 2404, 2409, 1088 2411, 2413, 2444, 2446, 2447, 2449, 2454, 2459, 2467, 2469, 1089 2471, 2476, 2478, 2483, 2485, 2499, 2500, 2502, 2507, 2509, 1090 2511, 2513, 2515, 2520, 2521, 2523, 2525, 2530, 2532, 2534, 1091 2540, 2542, 2544, 2548, 2550, 2552, 2554, 2568, 2569, 2571, 1092 2576, 2578, 2580, 2582, 2584, 2589, 2590, 2592, 2594, 2599, 1093 2601, 2603, 2609, 2610, 2612, 2621, 2624, 2626, 2629, 2631, 1094 2633, 2646, 2647, 2649, 2654, 2656, 2658, 2660, 2662, 2667, 1095 2668, 2670, 2672, 2677, 2679, 2687, 2688, 2689, 2694, 2695, 1096 2699, 2701, 2703, 2705, 2707, 2709, 2716, 2718, 2720, 2722, 1097 2724, 2727, 2729, 2731, 2733, 2735, 2740, 2742, 2744, 2749, 1098 2775, 2776, 2778, 2782, 2783, 2787, 2789, 2791, 2793, 2795, 1099 2797, 2804, 2806, 2808, 2810, 2812, 2814, 2819, 2824, 2826, 1100 2828, 2846, 2848, 2853, 2854 1101 1101 }; 1102 1102 #endif … … 4977 4977 4978 4978 /* Line 1806 of yacc.c */ 4979 #line 30 1"parser.yy"4979 #line 302 "parser.yy" 4980 4980 { typedefTable.enterScope(); } 4981 4981 break; … … 4984 4984 4985 4985 /* Line 1806 of yacc.c */ 4986 #line 30 5"parser.yy"4986 #line 306 "parser.yy" 4987 4987 { typedefTable.leaveScope(); } 4988 4988 break; … … 4991 4991 4992 4992 /* Line 1806 of yacc.c */ 4993 #line 31 2"parser.yy"4993 #line 313 "parser.yy" 4994 4994 { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); } 4995 4995 break; … … 4998 4998 4999 4999 /* Line 1806 of yacc.c */ 5000 #line 31 3"parser.yy"5000 #line 314 "parser.yy" 5001 5001 { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); } 5002 5002 break; … … 5005 5005 5006 5006 /* Line 1806 of yacc.c */ 5007 #line 31 4"parser.yy"5007 #line 315 "parser.yy" 5008 5008 { (yyval.en) = new ExpressionNode( build_constantChar( *(yyvsp[(1) - (1)].tok) ) ); } 5009 5009 break; … … 5012 5012 5013 5013 /* Line 1806 of yacc.c */ 5014 #line 3 39"parser.yy"5014 #line 340 "parser.yy" 5015 5015 { (yyval.constant) = build_constantStr( *(yyvsp[(1) - (1)].str) ); } 5016 5016 break; … … 5019 5019 5020 5020 /* Line 1806 of yacc.c */ 5021 #line 34 3"parser.yy"5021 #line 344 "parser.yy" 5022 5022 { (yyval.str) = (yyvsp[(1) - (1)].tok); } 5023 5023 break; … … 5026 5026 5027 5027 /* Line 1806 of yacc.c */ 5028 #line 34 5"parser.yy"5028 #line 346 "parser.yy" 5029 5029 { 5030 5030 appendStr( (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].tok) ); // append 2nd juxtaposed string to 1st … … 5037 5037 5038 5038 /* Line 1806 of yacc.c */ 5039 #line 35 6"parser.yy"5039 #line 357 "parser.yy" 5040 5040 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5041 5041 break; … … 5044 5044 5045 5045 /* Line 1806 of yacc.c */ 5046 #line 35 8"parser.yy"5046 #line 359 "parser.yy" 5047 5047 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5048 5048 break; … … 5051 5051 5052 5052 /* Line 1806 of yacc.c */ 5053 #line 36 0"parser.yy"5053 #line 361 "parser.yy" 5054 5054 { (yyval.en) = (yyvsp[(2) - (3)].en); } 5055 5055 break; … … 5058 5058 5059 5059 /* Line 1806 of yacc.c */ 5060 #line 36 2"parser.yy"5060 #line 363 "parser.yy" 5061 5061 { (yyval.en) = new ExpressionNode( build_valexpr( (yyvsp[(2) - (3)].sn) ) ); } 5062 5062 break; … … 5065 5065 5066 5066 /* Line 1806 of yacc.c */ 5067 #line 37 2"parser.yy"5067 #line 373 "parser.yy" 5068 5068 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Index, (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ) ); } 5069 5069 break; … … 5072 5072 5073 5073 /* Line 1806 of yacc.c */ 5074 #line 37 4"parser.yy"5074 #line 375 "parser.yy" 5075 5075 { (yyval.en) = new ExpressionNode( build_func( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ) ); } 5076 5076 break; … … 5079 5079 5080 5080 /* Line 1806 of yacc.c */ 5081 #line 37 8"parser.yy"5081 #line 379 "parser.yy" 5082 5082 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 5083 5083 break; 5084 5084 5085 case 27:5086 5087 /* Line 1806 of yacc.c */5088 #line 380 "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 382 "parser.yy"5096 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_constantInteger( *(yyvsp[(3) - (3)].tok) ) ) ); }5097 break;5098 5099 5085 case 29: 5100 5086 5101 5087 /* Line 1806 of yacc.c */ 5102 #line 38 4"parser.yy"5088 #line 383 "parser.yy" 5103 5089 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 5104 5090 break; 5105 5091 5106 case 3 0:5092 case 31: 5107 5093 5108 5094 /* Line 1806 of yacc.c */ 5109 5095 #line 386 "parser.yy" 5110 { (yyval.en) = new ExpressionNode( build_ pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en)) ) ); }5111 break; 5112 5113 case 3 1:5096 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); } 5097 break; 5098 5099 case 32: 5114 5100 5115 5101 /* Line 1806 of yacc.c */ 5116 5102 #line 388 "parser.yy" 5117 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds:: IncrPost, (yyvsp[(1) - (2)].en) ) ); }5118 break; 5119 5120 case 3 2:5103 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); } 5104 break; 5105 5106 case 33: 5121 5107 5122 5108 /* Line 1806 of yacc.c */ 5123 5109 #line 390 "parser.yy" 5124 { (yyval.en) = new ExpressionNode( build_ unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); }5125 break; 5126 5127 case 3 3:5110 { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); } 5111 break; 5112 5113 case 34: 5128 5114 5129 5115 /* Line 1806 of yacc.c */ 5130 5116 #line 392 "parser.yy" 5131 { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); }5132 break;5133 5134 case 34:5135 5136 /* Line 1806 of yacc.c */5137 #line 394 "parser.yy"5138 5117 { 5139 5118 Token fn; … … 5146 5125 5147 5126 /* Line 1806 of yacc.c */ 5148 #line 40 4"parser.yy"5127 #line 402 "parser.yy" 5149 5128 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 5150 5129 break; … … 5153 5132 5154 5133 /* Line 1806 of yacc.c */ 5155 #line 40 9"parser.yy"5134 #line 407 "parser.yy" 5156 5135 { (yyval.en) = 0; } 5157 5136 break; … … 5160 5139 5161 5140 /* Line 1806 of yacc.c */ 5162 #line 41 5"parser.yy"5141 #line 413 "parser.yy" 5163 5142 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5164 5143 break; 5165 5144 5145 case 41: 5146 5147 /* Line 1806 of yacc.c */ 5148 #line 420 "parser.yy" 5149 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5150 break; 5151 5166 5152 case 42: 5167 5153 5168 5154 /* Line 1806 of yacc.c */ 5169 #line 42 3"parser.yy"5170 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[( 1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); }5155 #line 422 "parser.yy" 5156 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5171 5157 break; 5172 5158 … … 5174 5160 5175 5161 /* Line 1806 of yacc.c */ 5176 #line 42 5"parser.yy"5177 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[( 1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }5162 #line 424 "parser.yy" 5163 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5178 5164 break; 5179 5165 … … 5181 5167 5182 5168 /* Line 1806 of yacc.c */ 5183 #line 42 7"parser.yy"5184 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[( 1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); }5169 #line 426 "parser.yy" 5170 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5185 5171 break; 5186 5172 … … 5188 5174 5189 5175 /* Line 1806 of yacc.c */ 5190 #line 429 "parser.yy" 5191 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); } 5192 break; 5193 5194 case 46: 5195 5196 /* Line 1806 of yacc.c */ 5197 #line 434 "parser.yy" 5198 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5199 break; 5200 5201 case 47: 5202 5203 /* Line 1806 of yacc.c */ 5204 #line 437 "parser.yy" 5205 { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); } 5176 #line 428 "parser.yy" 5177 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5206 5178 break; 5207 5179 … … 5209 5181 5210 5182 /* Line 1806 of yacc.c */ 5211 #line 44 5"parser.yy"5183 #line 442 "parser.yy" 5212 5184 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5213 5185 break; … … 5216 5188 5217 5189 /* Line 1806 of yacc.c */ 5218 #line 44 7"parser.yy"5190 #line 444 "parser.yy" 5219 5191 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 5220 5192 break; … … 5223 5195 5224 5196 /* Line 1806 of yacc.c */ 5225 #line 44 9"parser.yy"5197 #line 446 "parser.yy" 5226 5198 { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); } 5227 5199 break; … … 5230 5202 5231 5203 /* Line 1806 of yacc.c */ 5232 #line 45 4"parser.yy"5204 #line 451 "parser.yy" 5233 5205 { 5234 5206 switch ( (yyvsp[(1) - (2)].op) ) { … … 5248 5220 5249 5221 /* Line 1806 of yacc.c */ 5250 #line 46 7"parser.yy"5222 #line 464 "parser.yy" 5251 5223 { (yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) ); } 5252 5224 break; … … 5255 5227 5256 5228 /* Line 1806 of yacc.c */ 5257 #line 46 9"parser.yy"5229 #line 466 "parser.yy" 5258 5230 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Incr, (yyvsp[(2) - (2)].en) ) ); } 5259 5231 break; … … 5262 5234 5263 5235 /* Line 1806 of yacc.c */ 5264 #line 4 71"parser.yy"5236 #line 468 "parser.yy" 5265 5237 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Decr, (yyvsp[(2) - (2)].en) ) ); } 5266 5238 break; … … 5269 5241 5270 5242 /* Line 1806 of yacc.c */ 5271 #line 47 3"parser.yy"5243 #line 470 "parser.yy" 5272 5244 { (yyval.en) = new ExpressionNode( build_sizeOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5273 5245 break; … … 5276 5248 5277 5249 /* Line 1806 of yacc.c */ 5278 #line 47 5"parser.yy"5250 #line 472 "parser.yy" 5279 5251 { (yyval.en) = new ExpressionNode( build_sizeOftype( (yyvsp[(3) - (4)].decl) ) ); } 5280 5252 break; … … 5283 5255 5284 5256 /* Line 1806 of yacc.c */ 5285 #line 47 7"parser.yy"5257 #line 474 "parser.yy" 5286 5258 { (yyval.en) = new ExpressionNode( build_alignOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5287 5259 break; … … 5290 5262 5291 5263 /* Line 1806 of yacc.c */ 5292 #line 47 9"parser.yy"5264 #line 476 "parser.yy" 5293 5265 { (yyval.en) = new ExpressionNode( build_alignOftype( (yyvsp[(3) - (4)].decl) ) ); } 5294 5266 break; … … 5297 5269 5298 5270 /* Line 1806 of yacc.c */ 5299 #line 4 81"parser.yy"5271 #line 478 "parser.yy" 5300 5272 { (yyval.en) = new ExpressionNode( build_offsetOf( (yyvsp[(3) - (6)].decl), build_varref( (yyvsp[(5) - (6)].tok) ) ) ); } 5301 5273 break; … … 5304 5276 5305 5277 /* Line 1806 of yacc.c */ 5306 #line 48 3"parser.yy"5278 #line 480 "parser.yy" 5307 5279 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (1)].tok) ), nullptr ) ); } 5308 5280 break; … … 5311 5283 5312 5284 /* Line 1806 of yacc.c */ 5313 #line 48 5"parser.yy"5285 #line 482 "parser.yy" 5314 5286 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ) ); } 5315 5287 break; … … 5318 5290 5319 5291 /* Line 1806 of yacc.c */ 5320 #line 48 7"parser.yy"5292 #line 484 "parser.yy" 5321 5293 { (yyval.en) = new ExpressionNode( build_attrtype( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].decl) ) ); } 5322 5294 break; … … 5325 5297 5326 5298 /* Line 1806 of yacc.c */ 5327 #line 49 3"parser.yy"5299 #line 490 "parser.yy" 5328 5300 { (yyval.op) = OperKinds::PointTo; } 5329 5301 break; … … 5332 5304 5333 5305 /* Line 1806 of yacc.c */ 5334 #line 49 4"parser.yy"5306 #line 491 "parser.yy" 5335 5307 { (yyval.op) = OperKinds::AddressOf; } 5336 5308 break; … … 5339 5311 5340 5312 /* Line 1806 of yacc.c */ 5313 #line 497 "parser.yy" 5314 { (yyval.op) = OperKinds::UnPlus; } 5315 break; 5316 5317 case 67: 5318 5319 /* Line 1806 of yacc.c */ 5320 #line 498 "parser.yy" 5321 { (yyval.op) = OperKinds::UnMinus; } 5322 break; 5323 5324 case 68: 5325 5326 /* Line 1806 of yacc.c */ 5327 #line 499 "parser.yy" 5328 { (yyval.op) = OperKinds::Neg; } 5329 break; 5330 5331 case 69: 5332 5333 /* Line 1806 of yacc.c */ 5341 5334 #line 500 "parser.yy" 5342 { (yyval.op) = OperKinds::UnPlus; }5343 break;5344 5345 case 67:5346 5347 /* Line 1806 of yacc.c */5348 #line 501 "parser.yy"5349 { (yyval.op) = OperKinds::UnMinus; }5350 break;5351 5352 case 68:5353 5354 /* Line 1806 of yacc.c */5355 #line 502 "parser.yy"5356 { (yyval.op) = OperKinds::Neg; }5357 break;5358 5359 case 69:5360 5361 /* Line 1806 of yacc.c */5362 #line 503 "parser.yy"5363 5335 { (yyval.op) = OperKinds::BitNeg; } 5364 5336 break; … … 5367 5339 5368 5340 /* Line 1806 of yacc.c */ 5369 #line 50 9"parser.yy"5341 #line 506 "parser.yy" 5370 5342 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5371 5343 break; … … 5374 5346 5375 5347 /* Line 1806 of yacc.c */ 5376 #line 5 11"parser.yy"5348 #line 508 "parser.yy" 5377 5349 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5378 5350 break; … … 5381 5353 5382 5354 /* Line 1806 of yacc.c */ 5383 #line 51 7"parser.yy"5355 #line 514 "parser.yy" 5384 5356 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5385 5357 break; … … 5388 5360 5389 5361 /* Line 1806 of yacc.c */ 5390 #line 51 9"parser.yy"5362 #line 516 "parser.yy" 5391 5363 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5392 5364 break; … … 5395 5367 5396 5368 /* Line 1806 of yacc.c */ 5397 #line 5 21"parser.yy"5369 #line 518 "parser.yy" 5398 5370 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5399 5371 break; … … 5402 5374 5403 5375 /* Line 1806 of yacc.c */ 5404 #line 52 7"parser.yy"5376 #line 524 "parser.yy" 5405 5377 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5406 5378 break; … … 5409 5381 5410 5382 /* Line 1806 of yacc.c */ 5411 #line 52 9"parser.yy"5383 #line 526 "parser.yy" 5412 5384 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5413 5385 break; … … 5416 5388 5417 5389 /* Line 1806 of yacc.c */ 5418 #line 53 5"parser.yy"5390 #line 532 "parser.yy" 5419 5391 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5420 5392 break; … … 5423 5395 5424 5396 /* Line 1806 of yacc.c */ 5425 #line 53 7"parser.yy"5397 #line 534 "parser.yy" 5426 5398 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5427 5399 break; … … 5430 5402 5431 5403 /* Line 1806 of yacc.c */ 5432 #line 54 3"parser.yy"5404 #line 540 "parser.yy" 5433 5405 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5434 5406 break; … … 5437 5409 5438 5410 /* Line 1806 of yacc.c */ 5439 #line 54 5"parser.yy"5411 #line 542 "parser.yy" 5440 5412 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5441 5413 break; … … 5444 5416 5445 5417 /* Line 1806 of yacc.c */ 5446 #line 54 7"parser.yy"5418 #line 544 "parser.yy" 5447 5419 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5448 5420 break; … … 5451 5423 5452 5424 /* Line 1806 of yacc.c */ 5453 #line 54 9"parser.yy"5425 #line 546 "parser.yy" 5454 5426 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5455 5427 break; … … 5458 5430 5459 5431 /* Line 1806 of yacc.c */ 5460 #line 55 5"parser.yy"5432 #line 552 "parser.yy" 5461 5433 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5462 5434 break; … … 5465 5437 5466 5438 /* Line 1806 of yacc.c */ 5467 #line 55 7"parser.yy"5439 #line 554 "parser.yy" 5468 5440 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5469 5441 break; … … 5472 5444 5473 5445 /* Line 1806 of yacc.c */ 5474 #line 56 3"parser.yy"5446 #line 560 "parser.yy" 5475 5447 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5476 5448 break; … … 5479 5451 5480 5452 /* Line 1806 of yacc.c */ 5481 #line 56 9"parser.yy"5453 #line 566 "parser.yy" 5482 5454 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5483 5455 break; … … 5486 5458 5487 5459 /* Line 1806 of yacc.c */ 5488 #line 57 5"parser.yy"5460 #line 572 "parser.yy" 5489 5461 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5490 5462 break; … … 5493 5465 5494 5466 /* Line 1806 of yacc.c */ 5495 #line 5 81"parser.yy"5467 #line 578 "parser.yy" 5496 5468 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); } 5497 5469 break; … … 5500 5472 5501 5473 /* Line 1806 of yacc.c */ 5502 #line 58 7"parser.yy"5474 #line 584 "parser.yy" 5503 5475 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); } 5504 5476 break; … … 5507 5479 5508 5480 /* Line 1806 of yacc.c */ 5481 #line 590 "parser.yy" 5482 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5483 break; 5484 5485 case 103: 5486 5487 /* Line 1806 of yacc.c */ 5509 5488 #line 593 "parser.yy" 5489 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); } 5490 break; 5491 5492 case 104: 5493 5494 /* Line 1806 of yacc.c */ 5495 #line 595 "parser.yy" 5510 5496 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5511 5497 break; 5512 5498 5513 case 103:5514 5515 /* Line 1806 of yacc.c */5516 #line 596 "parser.yy"5517 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); }5518 break;5519 5520 case 104:5521 5522 /* Line 1806 of yacc.c */5523 #line 598 "parser.yy"5524 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }5525 break;5526 5527 5499 case 107: 5528 5500 5529 5501 /* Line 1806 of yacc.c */ 5530 #line 60 9"parser.yy"5502 #line 606 "parser.yy" 5531 5503 { (yyval.en) = new ExpressionNode( build_binary_ptr( (yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5532 5504 break; … … 5535 5507 5536 5508 /* Line 1806 of yacc.c */ 5537 #line 6 11"parser.yy"5509 #line 608 "parser.yy" 5538 5510 { (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) ) ); } 5539 5511 break; … … 5542 5514 5543 5515 /* Line 1806 of yacc.c */ 5544 #line 61 6"parser.yy"5516 #line 613 "parser.yy" 5545 5517 { (yyval.en) = nullptr; } 5546 5518 break; … … 5549 5521 5550 5522 /* Line 1806 of yacc.c */ 5523 #line 618 "parser.yy" 5524 { (yyval.op) = OperKinds::Assign; } 5525 break; 5526 5527 case 112: 5528 5529 /* Line 1806 of yacc.c */ 5530 #line 619 "parser.yy" 5531 { (yyval.op) = OperKinds::AtAssn; } 5532 break; 5533 5534 case 113: 5535 5536 /* Line 1806 of yacc.c */ 5537 #line 620 "parser.yy" 5538 { (yyval.op) = OperKinds::MulAssn; } 5539 break; 5540 5541 case 114: 5542 5543 /* Line 1806 of yacc.c */ 5551 5544 #line 621 "parser.yy" 5552 { (yyval.op) = OperKinds:: Assign; }5553 break; 5554 5555 case 11 2:5545 { (yyval.op) = OperKinds::DivAssn; } 5546 break; 5547 5548 case 115: 5556 5549 5557 5550 /* Line 1806 of yacc.c */ 5558 5551 #line 622 "parser.yy" 5559 { (yyval.op) = OperKinds:: AtAssn; }5560 break; 5561 5562 case 11 3:5552 { (yyval.op) = OperKinds::ModAssn; } 5553 break; 5554 5555 case 116: 5563 5556 5564 5557 /* Line 1806 of yacc.c */ 5565 5558 #line 623 "parser.yy" 5566 { (yyval.op) = OperKinds:: MulAssn; }5567 break; 5568 5569 case 11 4:5559 { (yyval.op) = OperKinds::PlusAssn; } 5560 break; 5561 5562 case 117: 5570 5563 5571 5564 /* Line 1806 of yacc.c */ 5572 5565 #line 624 "parser.yy" 5573 { (yyval.op) = OperKinds:: DivAssn; }5574 break; 5575 5576 case 11 5:5566 { (yyval.op) = OperKinds::MinusAssn; } 5567 break; 5568 5569 case 118: 5577 5570 5578 5571 /* Line 1806 of yacc.c */ 5579 5572 #line 625 "parser.yy" 5580 { (yyval.op) = OperKinds:: ModAssn; }5581 break; 5582 5583 case 11 6:5573 { (yyval.op) = OperKinds::LSAssn; } 5574 break; 5575 5576 case 119: 5584 5577 5585 5578 /* Line 1806 of yacc.c */ 5586 5579 #line 626 "parser.yy" 5587 { (yyval.op) = OperKinds:: PlusAssn; }5588 break; 5589 5590 case 1 17:5580 { (yyval.op) = OperKinds::RSAssn; } 5581 break; 5582 5583 case 120: 5591 5584 5592 5585 /* Line 1806 of yacc.c */ 5593 5586 #line 627 "parser.yy" 5594 { (yyval.op) = OperKinds:: MinusAssn; }5595 break; 5596 5597 case 1 18:5587 { (yyval.op) = OperKinds::AndAssn; } 5588 break; 5589 5590 case 121: 5598 5591 5599 5592 /* Line 1806 of yacc.c */ 5600 5593 #line 628 "parser.yy" 5601 { (yyval.op) = OperKinds:: LSAssn; }5602 break; 5603 5604 case 1 19:5594 { (yyval.op) = OperKinds::ERAssn; } 5595 break; 5596 5597 case 122: 5605 5598 5606 5599 /* Line 1806 of yacc.c */ 5607 5600 #line 629 "parser.yy" 5608 { (yyval.op) = OperKinds::RSAssn; }5609 break;5610 5611 case 120:5612 5613 /* Line 1806 of yacc.c */5614 #line 630 "parser.yy"5615 { (yyval.op) = OperKinds::AndAssn; }5616 break;5617 5618 case 121:5619 5620 /* Line 1806 of yacc.c */5621 #line 631 "parser.yy"5622 { (yyval.op) = OperKinds::ERAssn; }5623 break;5624 5625 case 122:5626 5627 /* Line 1806 of yacc.c */5628 #line 632 "parser.yy"5629 5601 { (yyval.op) = OperKinds::OrAssn; } 5630 5602 break; … … 5633 5605 5634 5606 /* Line 1806 of yacc.c */ 5635 #line 63 9"parser.yy"5607 #line 636 "parser.yy" 5636 5608 { (yyval.en) = new ExpressionNode( build_tuple() ); } 5637 5609 break; … … 5640 5612 5641 5613 /* Line 1806 of yacc.c */ 5642 #line 6 41"parser.yy"5614 #line 638 "parser.yy" 5643 5615 { (yyval.en) = new ExpressionNode( build_tuple( (yyvsp[(3) - (5)].en) ) ); } 5644 5616 break; … … 5647 5619 5648 5620 /* Line 1806 of yacc.c */ 5649 #line 64 3"parser.yy"5621 #line 640 "parser.yy" 5650 5622 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( (yyvsp[(4) - (6)].en) ) ) ); } 5651 5623 break; … … 5654 5626 5655 5627 /* Line 1806 of yacc.c */ 5656 #line 64 5"parser.yy"5628 #line 642 "parser.yy" 5657 5629 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_last( (yyvsp[(5) - (7)].en) ) ) ); } 5658 5630 break; … … 5661 5633 5662 5634 /* Line 1806 of yacc.c */ 5663 #line 6 51"parser.yy"5635 #line 648 "parser.yy" 5664 5636 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5665 5637 break; … … 5668 5640 5669 5641 /* Line 1806 of yacc.c */ 5670 #line 65 7"parser.yy"5642 #line 654 "parser.yy" 5671 5643 { (yyval.en) = new ExpressionNode( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5672 5644 break; … … 5675 5647 5676 5648 /* Line 1806 of yacc.c */ 5677 #line 6 62"parser.yy"5649 #line 659 "parser.yy" 5678 5650 { (yyval.en) = 0; } 5679 5651 break; … … 5682 5654 5683 5655 /* Line 1806 of yacc.c */ 5684 #line 6 71"parser.yy"5656 #line 668 "parser.yy" 5685 5657 { (yyval.sn) = (yyvsp[(1) - (1)].sn); } 5686 5658 break; … … 5689 5661 5690 5662 /* Line 1806 of yacc.c */ 5691 #line 67 8"parser.yy"5663 #line 675 "parser.yy" 5692 5664 { 5693 5665 Token fn; … … 5700 5672 5701 5673 /* Line 1806 of yacc.c */ 5702 #line 68 8"parser.yy"5674 #line 685 "parser.yy" 5703 5675 { 5704 5676 (yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) ); … … 5709 5681 5710 5682 /* Line 1806 of yacc.c */ 5711 #line 69 5"parser.yy"5683 #line 692 "parser.yy" 5712 5684 { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); } 5713 5685 break; … … 5716 5688 5717 5689 /* Line 1806 of yacc.c */ 5718 #line 702"parser.yy"5690 #line 699 "parser.yy" 5719 5691 { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); } 5720 5692 break; … … 5723 5695 5724 5696 /* Line 1806 of yacc.c */ 5725 #line 70 8"parser.yy"5697 #line 705 "parser.yy" 5726 5698 { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } } 5727 5699 break; … … 5730 5702 5731 5703 /* Line 1806 of yacc.c */ 5732 #line 71 3"parser.yy"5704 #line 710 "parser.yy" 5733 5705 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5734 5706 break; … … 5737 5709 5738 5710 /* Line 1806 of yacc.c */ 5739 #line 71 5"parser.yy"5711 #line 712 "parser.yy" 5740 5712 { // mark all fields in list 5741 5713 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 5748 5720 5749 5721 /* Line 1806 of yacc.c */ 5750 #line 7 21"parser.yy"5722 #line 718 "parser.yy" 5751 5723 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5752 5724 break; … … 5755 5727 5756 5728 /* Line 1806 of yacc.c */ 5757 #line 72 8"parser.yy"5729 #line 725 "parser.yy" 5758 5730 { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } } 5759 5731 break; … … 5762 5734 5763 5735 /* Line 1806 of yacc.c */ 5764 #line 73 3"parser.yy"5736 #line 730 "parser.yy" 5765 5737 { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); } 5766 5738 break; … … 5769 5741 5770 5742 /* Line 1806 of yacc.c */ 5771 #line 73 9"parser.yy"5743 #line 736 "parser.yy" 5772 5744 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); } 5773 5745 break; … … 5776 5748 5777 5749 /* Line 1806 of yacc.c */ 5778 #line 7 41"parser.yy"5750 #line 738 "parser.yy" 5779 5751 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); } 5780 5752 break; … … 5783 5755 5784 5756 /* Line 1806 of yacc.c */ 5785 #line 74 3"parser.yy"5757 #line 740 "parser.yy" 5786 5758 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5787 5759 break; … … 5790 5762 5791 5763 /* Line 1806 of yacc.c */ 5792 #line 74 5"parser.yy"5764 #line 742 "parser.yy" 5793 5765 { 5794 5766 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5805 5777 5806 5778 /* Line 1806 of yacc.c */ 5807 #line 75 5"parser.yy"5779 #line 752 "parser.yy" 5808 5780 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5809 5781 break; … … 5812 5784 5813 5785 /* Line 1806 of yacc.c */ 5814 #line 75 7"parser.yy"5786 #line 754 "parser.yy" 5815 5787 { 5816 5788 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5822 5794 5823 5795 /* Line 1806 of yacc.c */ 5824 #line 76 7"parser.yy"5796 #line 764 "parser.yy" 5825 5797 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5826 5798 break; … … 5829 5801 5830 5802 /* Line 1806 of yacc.c */ 5831 #line 76 9"parser.yy"5803 #line 766 "parser.yy" 5832 5804 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5833 5805 break; … … 5836 5808 5837 5809 /* Line 1806 of yacc.c */ 5838 #line 77 4"parser.yy"5810 #line 771 "parser.yy" 5839 5811 { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); } 5840 5812 break; … … 5843 5815 5844 5816 /* Line 1806 of yacc.c */ 5845 #line 77 6"parser.yy"5817 #line 773 "parser.yy" 5846 5818 { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); } 5847 5819 break; … … 5850 5822 5851 5823 /* Line 1806 of yacc.c */ 5852 #line 7 80"parser.yy"5824 #line 777 "parser.yy" 5853 5825 { (yyval.sn) = (yyvsp[(2) - (3)].sn); } 5854 5826 break; … … 5857 5829 5858 5830 /* Line 1806 of yacc.c */ 5859 #line 7 81"parser.yy"5831 #line 778 "parser.yy" 5860 5832 { (yyval.sn) = new StatementNode( build_default() ); } 5861 5833 break; … … 5864 5836 5865 5837 /* Line 1806 of yacc.c */ 5866 #line 78 7"parser.yy"5838 #line 784 "parser.yy" 5867 5839 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) )); } 5868 5840 break; … … 5871 5843 5872 5844 /* Line 1806 of yacc.c */ 5873 #line 7 91"parser.yy"5845 #line 788 "parser.yy" 5874 5846 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5875 5847 break; … … 5878 5850 5879 5851 /* Line 1806 of yacc.c */ 5880 #line 79 6"parser.yy"5852 #line 793 "parser.yy" 5881 5853 { (yyval.sn) = 0; } 5882 5854 break; … … 5885 5857 5886 5858 /* Line 1806 of yacc.c */ 5887 #line 802"parser.yy"5859 #line 799 "parser.yy" 5888 5860 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5889 5861 break; … … 5892 5864 5893 5865 /* Line 1806 of yacc.c */ 5894 #line 80 4"parser.yy"5866 #line 801 "parser.yy" 5895 5867 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); } 5896 5868 break; … … 5899 5871 5900 5872 /* Line 1806 of yacc.c */ 5901 #line 80 9"parser.yy"5873 #line 806 "parser.yy" 5902 5874 { (yyval.sn) = 0; } 5903 5875 break; … … 5906 5878 5907 5879 /* Line 1806 of yacc.c */ 5908 #line 81 5"parser.yy"5880 #line 812 "parser.yy" 5909 5881 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); } 5910 5882 break; … … 5913 5885 5914 5886 /* Line 1806 of yacc.c */ 5915 #line 81 7"parser.yy"5887 #line 814 "parser.yy" 5916 5888 { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); } 5917 5889 break; … … 5920 5892 5921 5893 /* Line 1806 of yacc.c */ 5922 #line 81 9"parser.yy"5894 #line 816 "parser.yy" 5923 5895 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); } 5924 5896 break; … … 5927 5899 5928 5900 /* Line 1806 of yacc.c */ 5929 #line 8 21"parser.yy"5901 #line 818 "parser.yy" 5930 5902 { (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) ) ) ) ) ) ); } 5931 5903 break; … … 5934 5906 5935 5907 /* Line 1806 of yacc.c */ 5936 #line 82 6"parser.yy"5908 #line 823 "parser.yy" 5937 5909 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 5938 5910 break; … … 5941 5913 5942 5914 /* Line 1806 of yacc.c */ 5943 #line 8 32"parser.yy"5915 #line 829 "parser.yy" 5944 5916 { (yyval.sn) = 0; } 5945 5917 break; … … 5948 5920 5949 5921 /* Line 1806 of yacc.c */ 5950 #line 83 4"parser.yy"5922 #line 831 "parser.yy" 5951 5923 { (yyval.sn) = 0; } 5952 5924 break; … … 5955 5927 5956 5928 /* Line 1806 of yacc.c */ 5957 #line 83 9"parser.yy"5929 #line 836 "parser.yy" 5958 5930 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5959 5931 break; … … 5962 5934 5963 5935 /* Line 1806 of yacc.c */ 5964 #line 8 41"parser.yy"5936 #line 838 "parser.yy" 5965 5937 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn), true ) ); } 5966 5938 break; … … 5969 5941 5970 5942 /* Line 1806 of yacc.c */ 5971 #line 84 3"parser.yy"5943 #line 840 "parser.yy" 5972 5944 { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); } 5973 5945 break; … … 5976 5948 5977 5949 /* Line 1806 of yacc.c */ 5978 #line 84 8"parser.yy"5950 #line 845 "parser.yy" 5979 5951 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); } 5980 5952 break; … … 5983 5955 5984 5956 /* Line 1806 of yacc.c */ 5985 #line 8 50"parser.yy"5957 #line 847 "parser.yy" 5986 5958 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); } 5987 5959 break; … … 5990 5962 5991 5963 /* Line 1806 of yacc.c */ 5992 #line 85 5"parser.yy"5964 #line 852 "parser.yy" 5993 5965 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); } 5994 5966 break; … … 5997 5969 5998 5970 /* Line 1806 of yacc.c */ 5971 #line 856 "parser.yy" 5972 { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); } 5973 break; 5974 5975 case 191: 5976 5977 /* Line 1806 of yacc.c */ 5999 5978 #line 859 "parser.yy" 6000 { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); }6001 break;6002 6003 case 191:6004 6005 /* Line 1806 of yacc.c */6006 #line 862 "parser.yy"6007 5979 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Continue ) ); } 6008 5980 break; … … 6011 5983 6012 5984 /* Line 1806 of yacc.c */ 5985 #line 863 "parser.yy" 5986 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); } 5987 break; 5988 5989 case 193: 5990 5991 /* Line 1806 of yacc.c */ 6013 5992 #line 866 "parser.yy" 6014 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); }6015 break;6016 6017 case 193:6018 6019 /* Line 1806 of yacc.c */6020 #line 869 "parser.yy"6021 5993 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 6022 5994 break; … … 6025 5997 6026 5998 /* Line 1806 of yacc.c */ 6027 #line 87 3"parser.yy"5999 #line 870 "parser.yy" 6028 6000 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); } 6029 6001 break; … … 6032 6004 6033 6005 /* Line 1806 of yacc.c */ 6034 #line 87 5"parser.yy"6006 #line 872 "parser.yy" 6035 6007 { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); } 6036 6008 break; … … 6039 6011 6040 6012 /* Line 1806 of yacc.c */ 6041 #line 87 7"parser.yy"6013 #line 874 "parser.yy" 6042 6014 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 6043 6015 break; … … 6046 6018 6047 6019 /* Line 1806 of yacc.c */ 6048 #line 87 9"parser.yy"6020 #line 876 "parser.yy" 6049 6021 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 6050 6022 break; … … 6053 6025 6054 6026 /* Line 1806 of yacc.c */ 6055 #line 8 81"parser.yy"6027 #line 878 "parser.yy" 6056 6028 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); } 6057 6029 break; … … 6060 6032 6061 6033 /* Line 1806 of yacc.c */ 6062 #line 88 6"parser.yy"6034 #line 883 "parser.yy" 6063 6035 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); } 6064 6036 break; … … 6067 6039 6068 6040 /* Line 1806 of yacc.c */ 6069 #line 88 8"parser.yy"6041 #line 885 "parser.yy" 6070 6042 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); } 6071 6043 break; … … 6074 6046 6075 6047 /* Line 1806 of yacc.c */ 6076 #line 8 90"parser.yy"6048 #line 887 "parser.yy" 6077 6049 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); } 6078 6050 break; … … 6081 6053 6082 6054 /* Line 1806 of yacc.c */ 6083 #line 89 7"parser.yy"6055 #line 894 "parser.yy" 6084 6056 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 6085 6057 break; … … 6088 6060 6089 6061 /* Line 1806 of yacc.c */ 6090 #line 89 9"parser.yy"6062 #line 896 "parser.yy" 6091 6063 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 6092 6064 break; … … 6095 6067 6096 6068 /* Line 1806 of yacc.c */ 6097 #line 901"parser.yy"6069 #line 898 "parser.yy" 6098 6070 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 6099 6071 break; … … 6102 6074 6103 6075 /* Line 1806 of yacc.c */ 6104 #line 90 3"parser.yy"6076 #line 900 "parser.yy" 6105 6077 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 6106 6078 break; … … 6109 6081 6110 6082 /* Line 1806 of yacc.c */ 6111 #line 90 8"parser.yy"6083 #line 905 "parser.yy" 6112 6084 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6113 6085 break; … … 6116 6088 6117 6089 /* Line 1806 of yacc.c */ 6118 #line 9 10"parser.yy"6090 #line 907 "parser.yy" 6119 6091 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6120 6092 break; … … 6123 6095 6124 6096 /* Line 1806 of yacc.c */ 6125 #line 9 12"parser.yy"6097 #line 909 "parser.yy" 6126 6098 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6127 6099 break; … … 6130 6102 6131 6103 /* Line 1806 of yacc.c */ 6132 #line 91 4"parser.yy"6104 #line 911 "parser.yy" 6133 6105 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6134 6106 break; … … 6137 6109 6138 6110 /* Line 1806 of yacc.c */ 6139 #line 91 9"parser.yy"6111 #line 916 "parser.yy" 6140 6112 { 6141 6113 (yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) ); … … 6146 6118 6147 6119 /* Line 1806 of yacc.c */ 6148 #line 9 32"parser.yy"6120 #line 929 "parser.yy" 6149 6121 { 6150 6122 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6156 6128 6157 6129 /* Line 1806 of yacc.c */ 6158 #line 93 7"parser.yy"6130 #line 934 "parser.yy" 6159 6131 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 6160 6132 break; … … 6163 6135 6164 6136 /* Line 1806 of yacc.c */ 6165 #line 93 9"parser.yy"6137 #line 936 "parser.yy" 6166 6138 { 6167 6139 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6173 6145 6174 6146 /* Line 1806 of yacc.c */ 6175 #line 94 8"parser.yy"6147 #line 945 "parser.yy" 6176 6148 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); } 6177 6149 break; … … 6180 6152 6181 6153 /* Line 1806 of yacc.c */ 6182 #line 9 50"parser.yy"6154 #line 947 "parser.yy" 6183 6155 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); } 6184 6156 break; … … 6187 6159 6188 6160 /* Line 1806 of yacc.c */ 6189 #line 9 52"parser.yy"6161 #line 949 "parser.yy" 6190 6162 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); } 6191 6163 break; … … 6194 6166 6195 6167 /* Line 1806 of yacc.c */ 6196 #line 95 4"parser.yy"6168 #line 951 "parser.yy" 6197 6169 { (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) ) ); } 6198 6170 break; … … 6201 6173 6202 6174 /* Line 1806 of yacc.c */ 6203 #line 95 6"parser.yy"6175 #line 953 "parser.yy" 6204 6176 { (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) ) ); } 6205 6177 break; … … 6208 6180 6209 6181 /* Line 1806 of yacc.c */ 6210 #line 9 61"parser.yy"6182 #line 958 "parser.yy" 6211 6183 { (yyval.flag) = false; } 6212 6184 break; … … 6215 6187 6216 6188 /* Line 1806 of yacc.c */ 6217 #line 96 3"parser.yy"6189 #line 960 "parser.yy" 6218 6190 { (yyval.flag) = true; } 6219 6191 break; … … 6222 6194 6223 6195 /* Line 1806 of yacc.c */ 6224 #line 96 8"parser.yy"6196 #line 965 "parser.yy" 6225 6197 { (yyval.en) = 0; } 6226 6198 break; … … 6229 6201 6230 6202 /* Line 1806 of yacc.c */ 6231 #line 97 5"parser.yy"6203 #line 972 "parser.yy" 6232 6204 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 6233 6205 break; … … 6236 6208 6237 6209 /* Line 1806 of yacc.c */ 6238 #line 9 80"parser.yy"6210 #line 977 "parser.yy" 6239 6211 { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); } 6240 6212 break; … … 6243 6215 6244 6216 /* Line 1806 of yacc.c */ 6245 #line 9 82"parser.yy"6217 #line 979 "parser.yy" 6246 6218 { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); } 6247 6219 break; … … 6250 6222 6251 6223 /* Line 1806 of yacc.c */ 6252 #line 98 7"parser.yy"6224 #line 984 "parser.yy" 6253 6225 { (yyval.en) = 0; } 6254 6226 break; … … 6257 6229 6258 6230 /* Line 1806 of yacc.c */ 6259 #line 98 9"parser.yy"6231 #line 986 "parser.yy" 6260 6232 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 6261 6233 break; … … 6264 6236 6265 6237 /* Line 1806 of yacc.c */ 6266 #line 9 91"parser.yy"6238 #line 988 "parser.yy" 6267 6239 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( (yyvsp[(3) - (3)].constant) ) ); } 6268 6240 break; … … 6271 6243 6272 6244 /* Line 1806 of yacc.c */ 6273 #line 99 6"parser.yy"6245 #line 993 "parser.yy" 6274 6246 { 6275 6247 (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) ); … … 6281 6253 6282 6254 /* Line 1806 of yacc.c */ 6283 #line 1001"parser.yy"6255 #line 998 "parser.yy" 6284 6256 { 6285 6257 (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) ); … … 6291 6263 6292 6264 /* Line 1806 of yacc.c */ 6293 #line 10 11"parser.yy"6265 #line 1008 "parser.yy" 6294 6266 { (yyval.decl) = 0; } 6295 6267 break; … … 6298 6270 6299 6271 /* Line 1806 of yacc.c */ 6300 #line 101 8"parser.yy"6272 #line 1015 "parser.yy" 6301 6273 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6302 6274 break; … … 6305 6277 6306 6278 /* Line 1806 of yacc.c */ 6307 #line 102 3"parser.yy"6279 #line 1020 "parser.yy" 6308 6280 { (yyval.decl) = 0; } 6309 6281 break; … … 6312 6284 6313 6285 /* Line 1806 of yacc.c */ 6314 #line 10 30"parser.yy"6286 #line 1027 "parser.yy" 6315 6287 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6316 6288 break; … … 6319 6291 6320 6292 /* Line 1806 of yacc.c */ 6321 #line 104 4"parser.yy"6293 #line 1041 "parser.yy" 6322 6294 {} 6323 6295 break; … … 6326 6298 6327 6299 /* Line 1806 of yacc.c */ 6328 #line 104 5"parser.yy"6300 #line 1042 "parser.yy" 6329 6301 {} 6330 6302 break; … … 6333 6305 6334 6306 /* Line 1806 of yacc.c */ 6335 #line 107 4"parser.yy"6307 #line 1071 "parser.yy" 6336 6308 { 6337 6309 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6343 6315 6344 6316 /* Line 1806 of yacc.c */ 6345 #line 10 81"parser.yy"6317 #line 1078 "parser.yy" 6346 6318 { 6347 6319 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6353 6325 6354 6326 /* Line 1806 of yacc.c */ 6355 #line 108 6"parser.yy"6327 #line 1083 "parser.yy" 6356 6328 { 6357 6329 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID ); … … 6363 6335 6364 6336 /* Line 1806 of yacc.c */ 6365 #line 109 6"parser.yy"6337 #line 1093 "parser.yy" 6366 6338 { 6367 6339 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6373 6345 6374 6346 /* Line 1806 of yacc.c */ 6375 #line 1 101"parser.yy"6347 #line 1098 "parser.yy" 6376 6348 { 6377 6349 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6383 6355 6384 6356 /* Line 1806 of yacc.c */ 6385 #line 110 6"parser.yy"6357 #line 1103 "parser.yy" 6386 6358 { 6387 6359 typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) ); … … 6393 6365 6394 6366 /* Line 1806 of yacc.c */ 6395 #line 111 4"parser.yy"6367 #line 1111 "parser.yy" 6396 6368 { 6397 6369 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6403 6375 6404 6376 /* Line 1806 of yacc.c */ 6405 #line 111 9"parser.yy"6377 #line 1116 "parser.yy" 6406 6378 { 6407 6379 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6413 6385 6414 6386 /* Line 1806 of yacc.c */ 6415 #line 112 4"parser.yy"6387 #line 1121 "parser.yy" 6416 6388 { 6417 6389 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6423 6395 6424 6396 /* Line 1806 of yacc.c */ 6425 #line 112 9"parser.yy"6397 #line 1126 "parser.yy" 6426 6398 { 6427 6399 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6433 6405 6434 6406 /* Line 1806 of yacc.c */ 6435 #line 113 4"parser.yy"6407 #line 1131 "parser.yy" 6436 6408 { 6437 6409 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 6443 6415 6444 6416 /* Line 1806 of yacc.c */ 6445 #line 11 42"parser.yy"6417 #line 1139 "parser.yy" 6446 6418 { 6447 6419 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true ); … … 6452 6424 6453 6425 /* Line 1806 of yacc.c */ 6454 #line 116 5"parser.yy"6426 #line 1162 "parser.yy" 6455 6427 { 6456 6428 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6461 6433 6462 6434 /* Line 1806 of yacc.c */ 6463 #line 116 9"parser.yy"6435 #line 1166 "parser.yy" 6464 6436 { 6465 6437 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6470 6442 6471 6443 /* Line 1806 of yacc.c */ 6472 #line 117 6"parser.yy"6444 #line 1173 "parser.yy" 6473 6445 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 6474 6446 break; … … 6477 6449 6478 6450 /* Line 1806 of yacc.c */ 6479 #line 11 80"parser.yy"6451 #line 1177 "parser.yy" 6480 6452 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); } 6481 6453 break; … … 6484 6456 6485 6457 /* Line 1806 of yacc.c */ 6486 #line 118 5"parser.yy"6458 #line 1182 "parser.yy" 6487 6459 { 6488 6460 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6494 6466 6495 6467 /* Line 1806 of yacc.c */ 6496 #line 11 90"parser.yy"6468 #line 1187 "parser.yy" 6497 6469 { 6498 6470 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6504 6476 6505 6477 /* Line 1806 of yacc.c */ 6506 #line 119 5"parser.yy"6478 #line 1192 "parser.yy" 6507 6479 { 6508 6480 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD ); … … 6514 6486 6515 6487 /* Line 1806 of yacc.c */ 6516 #line 120 6"parser.yy"6488 #line 1203 "parser.yy" 6517 6489 { 6518 6490 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6524 6496 6525 6497 /* Line 1806 of yacc.c */ 6526 #line 12 11"parser.yy"6498 #line 1208 "parser.yy" 6527 6499 { 6528 6500 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6534 6506 6535 6507 /* Line 1806 of yacc.c */ 6536 #line 121 6"parser.yy"6508 #line 1213 "parser.yy" 6537 6509 { 6538 6510 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6544 6516 6545 6517 /* Line 1806 of yacc.c */ 6546 #line 12 21"parser.yy"6518 #line 1218 "parser.yy" 6547 6519 { 6548 6520 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6554 6526 6555 6527 /* Line 1806 of yacc.c */ 6556 #line 122 6"parser.yy"6528 #line 1223 "parser.yy" 6557 6529 { 6558 6530 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6564 6536 6565 6537 /* Line 1806 of yacc.c */ 6566 #line 123 5"parser.yy"6538 #line 1232 "parser.yy" 6567 6539 { 6568 6540 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD ); … … 6574 6546 6575 6547 /* Line 1806 of yacc.c */ 6576 #line 12 40"parser.yy"6548 #line 1237 "parser.yy" 6577 6549 { 6578 6550 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD ); … … 6584 6556 6585 6557 /* Line 1806 of yacc.c */ 6586 #line 125 7"parser.yy"6558 #line 1254 "parser.yy" 6587 6559 { 6588 6560 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6594 6566 6595 6567 /* Line 1806 of yacc.c */ 6596 #line 12 62"parser.yy"6568 #line 1259 "parser.yy" 6597 6569 { 6598 6570 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6604 6576 6605 6577 /* Line 1806 of yacc.c */ 6606 #line 128 4"parser.yy"6578 #line 1281 "parser.yy" 6607 6579 { (yyval.decl) = 0; } 6608 6580 break; … … 6611 6583 6612 6584 /* Line 1806 of yacc.c */ 6613 #line 129 6"parser.yy"6585 #line 1293 "parser.yy" 6614 6586 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6615 6587 break; … … 6618 6590 6619 6591 /* Line 1806 of yacc.c */ 6620 #line 130 7"parser.yy"6592 #line 1304 "parser.yy" 6621 6593 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); } 6622 6594 break; … … 6625 6597 6626 6598 /* Line 1806 of yacc.c */ 6627 #line 130 9"parser.yy"6599 #line 1306 "parser.yy" 6628 6600 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); } 6629 6601 break; … … 6632 6604 6633 6605 /* Line 1806 of yacc.c */ 6634 #line 13 11"parser.yy"6606 #line 1308 "parser.yy" 6635 6607 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); } 6636 6608 break; … … 6639 6611 6640 6612 /* Line 1806 of yacc.c */ 6641 #line 131 3"parser.yy"6613 #line 1310 "parser.yy" 6642 6614 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); } 6643 6615 break; … … 6646 6618 6647 6619 /* Line 1806 of yacc.c */ 6648 #line 131 5"parser.yy"6620 #line 1312 "parser.yy" 6649 6621 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); } 6650 6622 break; … … 6653 6625 6654 6626 /* Line 1806 of yacc.c */ 6655 #line 131 7"parser.yy"6627 #line 1314 "parser.yy" 6656 6628 { 6657 6629 typedefTable.enterScope(); … … 6662 6634 6663 6635 /* Line 1806 of yacc.c */ 6664 #line 13 21"parser.yy"6636 #line 1318 "parser.yy" 6665 6637 { 6666 6638 typedefTable.leaveScope(); … … 6672 6644 6673 6645 /* Line 1806 of yacc.c */ 6674 #line 13 30"parser.yy"6646 #line 1327 "parser.yy" 6675 6647 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6676 6648 break; … … 6679 6651 6680 6652 /* Line 1806 of yacc.c */ 6681 #line 13 32"parser.yy"6653 #line 1329 "parser.yy" 6682 6654 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6683 6655 break; … … 6686 6658 6687 6659 /* Line 1806 of yacc.c */ 6688 #line 134 3"parser.yy"6660 #line 1340 "parser.yy" 6689 6661 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6690 6662 break; … … 6693 6665 6694 6666 /* Line 1806 of yacc.c */ 6695 #line 134 8"parser.yy"6667 #line 1345 "parser.yy" 6696 6668 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); } 6697 6669 break; … … 6700 6672 6701 6673 /* Line 1806 of yacc.c */ 6702 #line 13 50"parser.yy"6674 #line 1347 "parser.yy" 6703 6675 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); } 6704 6676 break; … … 6707 6679 6708 6680 /* Line 1806 of yacc.c */ 6709 #line 13 52"parser.yy"6681 #line 1349 "parser.yy" 6710 6682 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); } 6711 6683 break; … … 6714 6686 6715 6687 /* Line 1806 of yacc.c */ 6688 #line 1351 "parser.yy" 6689 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); } 6690 break; 6691 6692 case 318: 6693 6694 /* Line 1806 of yacc.c */ 6716 6695 #line 1354 "parser.yy" 6717 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }6718 break;6719 6720 case 318:6721 6722 /* Line 1806 of yacc.c */6723 #line 1357 "parser.yy"6724 6696 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isInline = true; } 6725 6697 break; … … 6728 6700 6729 6701 /* Line 1806 of yacc.c */ 6702 #line 1356 "parser.yy" 6703 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); } 6704 break; 6705 6706 case 320: 6707 6708 /* Line 1806 of yacc.c */ 6730 6709 #line 1359 "parser.yy" 6731 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }6732 break;6733 6734 case 320:6735 6736 /* Line 1806 of yacc.c */6737 #line 1362 "parser.yy"6738 6710 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isNoreturn = true; } 6739 6711 break; … … 6742 6714 6743 6715 /* Line 1806 of yacc.c */ 6744 #line 136 4"parser.yy"6716 #line 1361 "parser.yy" 6745 6717 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); } 6746 6718 break; … … 6749 6721 6750 6722 /* Line 1806 of yacc.c */ 6751 #line 136 9"parser.yy"6723 #line 1366 "parser.yy" 6752 6724 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); } 6753 6725 break; … … 6756 6728 6757 6729 /* Line 1806 of yacc.c */ 6758 #line 13 71"parser.yy"6730 #line 1368 "parser.yy" 6759 6731 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); } 6760 6732 break; … … 6763 6735 6764 6736 /* Line 1806 of yacc.c */ 6765 #line 137 3"parser.yy"6737 #line 1370 "parser.yy" 6766 6738 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); } 6767 6739 break; … … 6770 6742 6771 6743 /* Line 1806 of yacc.c */ 6772 #line 137 5"parser.yy"6744 #line 1372 "parser.yy" 6773 6745 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); } 6774 6746 break; … … 6777 6749 6778 6750 /* Line 1806 of yacc.c */ 6779 #line 137 7"parser.yy"6751 #line 1374 "parser.yy" 6780 6752 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Long ); } 6781 6753 break; … … 6784 6756 6785 6757 /* Line 1806 of yacc.c */ 6786 #line 137 9"parser.yy"6758 #line 1376 "parser.yy" 6787 6759 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Short ); } 6788 6760 break; … … 6791 6763 6792 6764 /* Line 1806 of yacc.c */ 6793 #line 13 81"parser.yy"6765 #line 1378 "parser.yy" 6794 6766 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Signed ); } 6795 6767 break; … … 6798 6770 6799 6771 /* Line 1806 of yacc.c */ 6800 #line 138 3"parser.yy"6772 #line 1380 "parser.yy" 6801 6773 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Unsigned ); } 6802 6774 break; … … 6805 6777 6806 6778 /* Line 1806 of yacc.c */ 6807 #line 138 5"parser.yy"6779 #line 1382 "parser.yy" 6808 6780 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); } 6809 6781 break; … … 6812 6784 6813 6785 /* Line 1806 of yacc.c */ 6814 #line 138 7"parser.yy"6786 #line 1384 "parser.yy" 6815 6787 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); } 6816 6788 break; … … 6819 6791 6820 6792 /* Line 1806 of yacc.c */ 6821 #line 138 9"parser.yy"6793 #line 1386 "parser.yy" 6822 6794 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Complex ); } 6823 6795 break; … … 6826 6798 6827 6799 /* Line 1806 of yacc.c */ 6828 #line 13 91"parser.yy"6800 #line 1388 "parser.yy" 6829 6801 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); } 6830 6802 break; … … 6833 6805 6834 6806 /* Line 1806 of yacc.c */ 6835 #line 139 3"parser.yy"6807 #line 1390 "parser.yy" 6836 6808 { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); } 6837 6809 break; … … 6840 6812 6841 6813 /* Line 1806 of yacc.c */ 6842 #line 1 400"parser.yy"6814 #line 1397 "parser.yy" 6843 6815 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6844 6816 break; … … 6847 6819 6848 6820 /* Line 1806 of yacc.c */ 6849 #line 1 402"parser.yy"6821 #line 1399 "parser.yy" 6850 6822 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6851 6823 break; … … 6854 6826 6855 6827 /* Line 1806 of yacc.c */ 6856 #line 140 4"parser.yy"6828 #line 1401 "parser.yy" 6857 6829 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6858 6830 break; … … 6861 6833 6862 6834 /* Line 1806 of yacc.c */ 6863 #line 140 6"parser.yy"6835 #line 1403 "parser.yy" 6864 6836 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); } 6865 6837 break; … … 6868 6840 6869 6841 /* Line 1806 of yacc.c */ 6870 #line 14 12"parser.yy"6842 #line 1409 "parser.yy" 6871 6843 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6872 6844 break; … … 6875 6847 6876 6848 /* Line 1806 of yacc.c */ 6877 #line 141 9"parser.yy"6849 #line 1416 "parser.yy" 6878 6850 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6879 6851 break; … … 6882 6854 6883 6855 /* Line 1806 of yacc.c */ 6884 #line 14 21"parser.yy"6856 #line 1418 "parser.yy" 6885 6857 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6886 6858 break; … … 6889 6861 6890 6862 /* Line 1806 of yacc.c */ 6891 #line 142 3"parser.yy"6863 #line 1420 "parser.yy" 6892 6864 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); } 6893 6865 break; … … 6896 6868 6897 6869 /* Line 1806 of yacc.c */ 6898 #line 142 8"parser.yy"6870 #line 1425 "parser.yy" 6899 6871 { (yyval.decl) = (yyvsp[(3) - (4)].decl); } 6900 6872 break; … … 6903 6875 6904 6876 /* Line 1806 of yacc.c */ 6905 #line 14 30"parser.yy"6877 #line 1427 "parser.yy" 6906 6878 { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); } 6907 6879 break; … … 6910 6882 6911 6883 /* Line 1806 of yacc.c */ 6912 #line 14 32"parser.yy"6884 #line 1429 "parser.yy" 6913 6885 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); } 6914 6886 break; … … 6917 6889 6918 6890 /* Line 1806 of yacc.c */ 6919 #line 143 4"parser.yy"6891 #line 1431 "parser.yy" 6920 6892 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 6921 6893 break; … … 6924 6896 6925 6897 /* Line 1806 of yacc.c */ 6926 #line 14 40"parser.yy"6898 #line 1437 "parser.yy" 6927 6899 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6928 6900 break; … … 6931 6903 6932 6904 /* Line 1806 of yacc.c */ 6933 #line 14 42"parser.yy"6905 #line 1439 "parser.yy" 6934 6906 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6935 6907 break; … … 6938 6910 6939 6911 /* Line 1806 of yacc.c */ 6940 #line 144 4"parser.yy"6912 #line 1441 "parser.yy" 6941 6913 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6942 6914 break; … … 6945 6917 6946 6918 /* Line 1806 of yacc.c */ 6947 #line 14 50"parser.yy"6919 #line 1447 "parser.yy" 6948 6920 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6949 6921 break; … … 6952 6924 6953 6925 /* Line 1806 of yacc.c */ 6954 #line 14 52"parser.yy"6926 #line 1449 "parser.yy" 6955 6927 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6956 6928 break; … … 6959 6931 6960 6932 /* Line 1806 of yacc.c */ 6961 #line 145 8"parser.yy"6933 #line 1455 "parser.yy" 6962 6934 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6963 6935 break; … … 6966 6938 6967 6939 /* Line 1806 of yacc.c */ 6968 #line 14 60"parser.yy"6940 #line 1457 "parser.yy" 6969 6941 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6970 6942 break; … … 6973 6945 6974 6946 /* Line 1806 of yacc.c */ 6975 #line 14 62"parser.yy"6947 #line 1459 "parser.yy" 6976 6948 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6977 6949 break; … … 6980 6952 6981 6953 /* Line 1806 of yacc.c */ 6982 #line 146 7"parser.yy"6954 #line 1464 "parser.yy" 6983 6955 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); } 6984 6956 break; … … 6987 6959 6988 6960 /* Line 1806 of yacc.c */ 6989 #line 146 9"parser.yy"6961 #line 1466 "parser.yy" 6990 6962 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6991 6963 break; … … 6994 6966 6995 6967 /* Line 1806 of yacc.c */ 6996 #line 14 71"parser.yy"6968 #line 1468 "parser.yy" 6997 6969 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6998 6970 break; … … 7001 6973 7002 6974 /* Line 1806 of yacc.c */ 7003 #line 14 81"parser.yy"6975 #line 1478 "parser.yy" 7004 6976 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), nullptr, nullptr, (yyvsp[(3) - (4)].decl), true ); } 7005 6977 break; … … 7008 6980 7009 6981 /* Line 1806 of yacc.c */ 7010 #line 148 3"parser.yy"6982 #line 1480 "parser.yy" 7011 6983 { 7012 6984 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 7018 6990 7019 6991 /* Line 1806 of yacc.c */ 7020 #line 148 8"parser.yy"6992 #line 1485 "parser.yy" 7021 6993 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 7022 6994 break; … … 7025 6997 7026 6998 /* Line 1806 of yacc.c */ 7027 #line 14 90"parser.yy"6999 #line 1487 "parser.yy" 7028 7000 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), nullptr, (yyvsp[(5) - (6)].decl), true ); } 7029 7001 break; … … 7032 7004 7033 7005 /* Line 1806 of yacc.c */ 7034 #line 14 92"parser.yy"7006 #line 1489 "parser.yy" 7035 7007 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), nullptr, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); } 7036 7008 break; … … 7039 7011 7040 7012 /* Line 1806 of yacc.c */ 7041 #line 149 4"parser.yy"7013 #line 1491 "parser.yy" 7042 7014 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7043 7015 break; … … 7046 7018 7047 7019 /* Line 1806 of yacc.c */ 7048 #line 149 9"parser.yy"7020 #line 1496 "parser.yy" 7049 7021 { (yyval.aggKey) = DeclarationNode::Struct; } 7050 7022 break; … … 7053 7025 7054 7026 /* Line 1806 of yacc.c */ 7055 #line 1 501"parser.yy"7027 #line 1498 "parser.yy" 7056 7028 { (yyval.aggKey) = DeclarationNode::Union; } 7057 7029 break; … … 7060 7032 7061 7033 /* Line 1806 of yacc.c */ 7062 #line 150 6"parser.yy"7034 #line 1503 "parser.yy" 7063 7035 { (yyval.decl) = 0; } 7064 7036 break; … … 7067 7039 7068 7040 /* Line 1806 of yacc.c */ 7069 #line 150 8"parser.yy"7041 #line 1505 "parser.yy" 7070 7042 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7071 7043 break; … … 7074 7046 7075 7047 /* Line 1806 of yacc.c */ 7048 #line 1511 "parser.yy" 7049 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); } 7050 break; 7051 7052 case 379: 7053 7054 /* Line 1806 of yacc.c */ 7076 7055 #line 1514 "parser.yy" 7077 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); }7078 break;7079 7080 case 379:7081 7082 /* Line 1806 of yacc.c */7083 #line 1517 "parser.yy"7084 7056 { // mark all fields in list 7085 7057 for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7092 7064 7093 7065 /* Line 1806 of yacc.c */ 7094 #line 152 7"parser.yy"7066 #line 1524 "parser.yy" 7095 7067 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); } 7096 7068 break; … … 7099 7071 7100 7072 /* Line 1806 of yacc.c */ 7101 #line 152 9"parser.yy"7073 #line 1526 "parser.yy" 7102 7074 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); } 7103 7075 break; … … 7106 7078 7107 7079 /* Line 1806 of yacc.c */ 7108 #line 15 31"parser.yy"7080 #line 1528 "parser.yy" 7109 7081 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); } 7110 7082 break; … … 7113 7085 7114 7086 /* Line 1806 of yacc.c */ 7115 #line 153 6"parser.yy"7087 #line 1533 "parser.yy" 7116 7088 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7117 7089 break; … … 7120 7092 7121 7093 /* Line 1806 of yacc.c */ 7122 #line 153 8"parser.yy"7094 #line 1535 "parser.yy" 7123 7095 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); } 7124 7096 break; … … 7127 7099 7128 7100 /* Line 1806 of yacc.c */ 7129 #line 154 3"parser.yy"7101 #line 1540 "parser.yy" 7130 7102 { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ } 7131 7103 break; … … 7134 7106 7135 7107 /* Line 1806 of yacc.c */ 7108 #line 1542 "parser.yy" 7109 { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); } 7110 break; 7111 7112 case 388: 7113 7114 /* Line 1806 of yacc.c */ 7136 7115 #line 1545 "parser.yy" 7137 { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }7138 break; 7139 7140 case 38 8:7116 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); } 7117 break; 7118 7119 case 389: 7141 7120 7142 7121 /* Line 1806 of yacc.c */ … … 7145 7124 break; 7146 7125 7147 case 389:7148 7149 /* Line 1806 of yacc.c */7150 #line 1551 "parser.yy"7151 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }7152 break;7153 7154 7126 case 391: 7155 7127 7156 7128 /* Line 1806 of yacc.c */ 7157 #line 155 7"parser.yy"7129 #line 1554 "parser.yy" 7158 7130 { (yyval.en) = 0; } 7159 7131 break; … … 7162 7134 7163 7135 /* Line 1806 of yacc.c */ 7164 #line 155 9"parser.yy"7136 #line 1556 "parser.yy" 7165 7137 { (yyval.en) = (yyvsp[(1) - (1)].en); } 7166 7138 break; … … 7169 7141 7170 7142 /* Line 1806 of yacc.c */ 7171 #line 156 4"parser.yy"7143 #line 1561 "parser.yy" 7172 7144 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7173 7145 break; … … 7176 7148 7177 7149 /* Line 1806 of yacc.c */ 7178 #line 157 3"parser.yy"7150 #line 1570 "parser.yy" 7179 7151 { (yyval.decl) = DeclarationNode::newEnum( nullptr, (yyvsp[(3) - (5)].decl) ); } 7180 7152 break; … … 7183 7155 7184 7156 /* Line 1806 of yacc.c */ 7185 #line 157 5"parser.yy"7157 #line 1572 "parser.yy" 7186 7158 { 7187 7159 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 7193 7165 7194 7166 /* Line 1806 of yacc.c */ 7195 #line 15 80"parser.yy"7167 #line 1577 "parser.yy" 7196 7168 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 7197 7169 break; … … 7200 7172 7201 7173 /* Line 1806 of yacc.c */ 7202 #line 15 82"parser.yy"7174 #line 1579 "parser.yy" 7203 7175 { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); } 7204 7176 break; … … 7207 7179 7208 7180 /* Line 1806 of yacc.c */ 7209 #line 158 7"parser.yy"7181 #line 1584 "parser.yy" 7210 7182 { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); } 7211 7183 break; … … 7214 7186 7215 7187 /* Line 1806 of yacc.c */ 7216 #line 158 9"parser.yy"7188 #line 1586 "parser.yy" 7217 7189 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); } 7218 7190 break; … … 7221 7193 7222 7194 /* Line 1806 of yacc.c */ 7223 #line 159 4"parser.yy"7195 #line 1591 "parser.yy" 7224 7196 { (yyval.en) = 0; } 7225 7197 break; … … 7228 7200 7229 7201 /* Line 1806 of yacc.c */ 7230 #line 159 6"parser.yy"7202 #line 1593 "parser.yy" 7231 7203 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7232 7204 break; … … 7235 7207 7236 7208 /* Line 1806 of yacc.c */ 7237 #line 160 3"parser.yy"7209 #line 1600 "parser.yy" 7238 7210 { (yyval.decl) = 0; } 7239 7211 break; … … 7242 7214 7243 7215 /* Line 1806 of yacc.c */ 7244 #line 16 11"parser.yy"7216 #line 1608 "parser.yy" 7245 7217 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7246 7218 break; … … 7249 7221 7250 7222 /* Line 1806 of yacc.c */ 7251 #line 161 3"parser.yy"7223 #line 1610 "parser.yy" 7252 7224 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7253 7225 break; … … 7256 7228 7257 7229 /* Line 1806 of yacc.c */ 7258 #line 161 5"parser.yy"7230 #line 1612 "parser.yy" 7259 7231 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7260 7232 break; … … 7263 7235 7264 7236 /* Line 1806 of yacc.c */ 7265 #line 162 3"parser.yy"7237 #line 1620 "parser.yy" 7266 7238 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7267 7239 break; … … 7270 7242 7271 7243 /* Line 1806 of yacc.c */ 7272 #line 162 5"parser.yy"7244 #line 1622 "parser.yy" 7273 7245 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7274 7246 break; … … 7277 7249 7278 7250 /* Line 1806 of yacc.c */ 7279 #line 162 7"parser.yy"7251 #line 1624 "parser.yy" 7280 7252 { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); } 7281 7253 break; … … 7284 7256 7285 7257 /* Line 1806 of yacc.c */ 7286 #line 163 3"parser.yy"7258 #line 1630 "parser.yy" 7287 7259 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7288 7260 break; … … 7291 7263 7292 7264 /* Line 1806 of yacc.c */ 7293 #line 163 8"parser.yy"7265 #line 1635 "parser.yy" 7294 7266 { (yyval.decl) = 0; } 7295 7267 break; … … 7298 7270 7299 7271 /* Line 1806 of yacc.c */ 7300 #line 164 5"parser.yy"7272 #line 1642 "parser.yy" 7301 7273 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7302 7274 break; … … 7305 7277 7306 7278 /* Line 1806 of yacc.c */ 7307 #line 16 52"parser.yy"7279 #line 1649 "parser.yy" 7308 7280 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7309 7281 break; … … 7312 7284 7313 7285 /* Line 1806 of yacc.c */ 7314 #line 165 4"parser.yy"7286 #line 1651 "parser.yy" 7315 7287 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7316 7288 break; 7317 7289 7318 7290 case 425: 7291 7292 /* Line 1806 of yacc.c */ 7293 #line 1660 "parser.yy" 7294 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); } 7295 break; 7296 7297 case 426: 7319 7298 7320 7299 /* Line 1806 of yacc.c */ … … 7323 7302 break; 7324 7303 7325 case 426:7326 7327 /* Line 1806 of yacc.c */7328 #line 1666 "parser.yy"7329 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }7330 break;7331 7332 7304 case 427: 7333 7305 7334 7306 /* Line 1806 of yacc.c */ 7335 #line 166 8"parser.yy"7307 #line 1665 "parser.yy" 7336 7308 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); } 7337 7309 break; … … 7340 7312 7341 7313 /* Line 1806 of yacc.c */ 7342 #line 167 8"parser.yy"7314 #line 1675 "parser.yy" 7343 7315 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7344 7316 break; … … 7347 7319 7348 7320 /* Line 1806 of yacc.c */ 7349 #line 168 4"parser.yy"7321 #line 1681 "parser.yy" 7350 7322 { 7351 7323 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7357 7329 7358 7330 /* Line 1806 of yacc.c */ 7359 #line 168 9"parser.yy"7331 #line 1686 "parser.yy" 7360 7332 { 7361 7333 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7367 7339 7368 7340 /* Line 1806 of yacc.c */ 7369 #line 169 8"parser.yy"7341 #line 1695 "parser.yy" 7370 7342 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7371 7343 break; … … 7374 7346 7375 7347 /* Line 1806 of yacc.c */ 7376 #line 170 7"parser.yy"7348 #line 1704 "parser.yy" 7377 7349 { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); } 7378 7350 break; … … 7381 7353 7382 7354 /* Line 1806 of yacc.c */ 7383 #line 170 9"parser.yy"7355 #line 1706 "parser.yy" 7384 7356 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); } 7385 7357 break; … … 7388 7360 7389 7361 /* Line 1806 of yacc.c */ 7390 #line 173 4"parser.yy"7362 #line 1731 "parser.yy" 7391 7363 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7392 7364 break; … … 7395 7367 7396 7368 /* Line 1806 of yacc.c */ 7397 #line 17 42"parser.yy"7369 #line 1739 "parser.yy" 7398 7370 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7399 7371 break; … … 7402 7374 7403 7375 /* Line 1806 of yacc.c */ 7404 #line 174 7"parser.yy"7376 #line 1744 "parser.yy" 7405 7377 { (yyval.in) = 0; } 7406 7378 break; … … 7409 7381 7410 7382 /* Line 1806 of yacc.c */ 7411 #line 174 9"parser.yy"7383 #line 1746 "parser.yy" 7412 7384 { (yyval.in) = (yyvsp[(2) - (2)].in); } 7413 7385 break; … … 7416 7388 7417 7389 /* Line 1806 of yacc.c */ 7418 #line 17 51"parser.yy"7390 #line 1748 "parser.yy" 7419 7391 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); } 7420 7392 break; … … 7423 7395 7424 7396 /* Line 1806 of yacc.c */ 7425 #line 175 5"parser.yy"7397 #line 1752 "parser.yy" 7426 7398 { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); } 7427 7399 break; … … 7430 7402 7431 7403 /* Line 1806 of yacc.c */ 7432 #line 175 6"parser.yy"7404 #line 1753 "parser.yy" 7433 7405 { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); } 7434 7406 break; … … 7437 7409 7438 7410 /* Line 1806 of yacc.c */ 7411 #line 1758 "parser.yy" 7412 { (yyval.in) = 0; } 7413 break; 7414 7415 case 463: 7416 7417 /* Line 1806 of yacc.c */ 7418 #line 1760 "parser.yy" 7419 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); } 7420 break; 7421 7422 case 464: 7423 7424 /* Line 1806 of yacc.c */ 7439 7425 #line 1761 "parser.yy" 7440 { (yyval.in) = 0; }7441 break; 7442 7443 case 46 3:7426 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); } 7427 break; 7428 7429 case 465: 7444 7430 7445 7431 /* Line 1806 of yacc.c */ 7446 7432 #line 1763 "parser.yy" 7447 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }7448 break;7449 7450 case 464:7451 7452 /* Line 1806 of yacc.c */7453 #line 1764 "parser.yy"7454 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); }7455 break;7456 7457 case 465:7458 7459 /* Line 1806 of yacc.c */7460 #line 1766 "parser.yy"7461 7433 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_last( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); } 7462 7434 break; … … 7465 7437 7466 7438 /* Line 1806 of yacc.c */ 7467 #line 17 82"parser.yy"7439 #line 1779 "parser.yy" 7468 7440 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) ) ); } 7469 7441 break; … … 7472 7444 7473 7445 /* Line 1806 of yacc.c */ 7474 #line 178 8"parser.yy"7446 #line 1785 "parser.yy" 7475 7447 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_last( (yyvsp[(2) - (2)].en) ) ); } 7476 7448 break; … … 7479 7451 7480 7452 /* Line 1806 of yacc.c */ 7453 #line 1791 "parser.yy" 7454 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); } 7455 break; 7456 7457 case 471: 7458 7459 /* Line 1806 of yacc.c */ 7481 7460 #line 1794 "parser.yy" 7482 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); }7483 break;7484 7485 case 471:7486 7487 /* Line 1806 of yacc.c */7488 #line 1797 "parser.yy"7489 7461 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7490 7462 break; … … 7493 7465 7494 7466 /* Line 1806 of yacc.c */ 7495 #line 179 9"parser.yy"7467 #line 1796 "parser.yy" 7496 7468 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7497 7469 break; … … 7500 7472 7501 7473 /* Line 1806 of yacc.c */ 7502 #line 1 801"parser.yy"7474 #line 1798 "parser.yy" 7503 7475 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ); } 7504 7476 break; … … 7507 7479 7508 7480 /* Line 1806 of yacc.c */ 7509 #line 180 3"parser.yy"7481 #line 1800 "parser.yy" 7510 7482 { (yyval.en) = (yyvsp[(4) - (6)].en); } 7511 7483 break; … … 7514 7486 7515 7487 /* Line 1806 of yacc.c */ 7516 #line 182 7"parser.yy"7488 #line 1824 "parser.yy" 7517 7489 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7518 7490 break; … … 7521 7493 7522 7494 /* Line 1806 of yacc.c */ 7523 #line 182 9"parser.yy"7495 #line 1826 "parser.yy" 7524 7496 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7525 7497 break; … … 7528 7500 7529 7501 /* Line 1806 of yacc.c */ 7530 #line 18 31"parser.yy"7502 #line 1828 "parser.yy" 7531 7503 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 7532 7504 break; … … 7535 7507 7536 7508 /* Line 1806 of yacc.c */ 7537 #line 183 7"parser.yy"7509 #line 1834 "parser.yy" 7538 7510 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7539 7511 break; … … 7542 7514 7543 7515 /* Line 1806 of yacc.c */ 7544 #line 183 9"parser.yy"7516 #line 1836 "parser.yy" 7545 7517 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7546 7518 break; … … 7549 7521 7550 7522 /* Line 1806 of yacc.c */ 7551 #line 184 4"parser.yy"7523 #line 1841 "parser.yy" 7552 7524 { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 7553 7525 break; … … 7556 7528 7557 7529 /* Line 1806 of yacc.c */ 7558 #line 18 50"parser.yy"7530 #line 1847 "parser.yy" 7559 7531 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); } 7560 7532 break; … … 7563 7535 7564 7536 /* Line 1806 of yacc.c */ 7565 #line 185 5"parser.yy"7537 #line 1852 "parser.yy" 7566 7538 { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); } 7567 7539 break; … … 7570 7542 7571 7543 /* Line 1806 of yacc.c */ 7572 #line 185 7"parser.yy"7544 #line 1854 "parser.yy" 7573 7545 { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); } 7574 7546 break; … … 7577 7549 7578 7550 /* Line 1806 of yacc.c */ 7579 #line 186 3"parser.yy"7551 #line 1860 "parser.yy" 7580 7552 { (yyval.tclass) = DeclarationNode::Otype; } 7581 7553 break; … … 7584 7556 7585 7557 /* Line 1806 of yacc.c */ 7586 #line 186 5"parser.yy"7558 #line 1862 "parser.yy" 7587 7559 { (yyval.tclass) = DeclarationNode::Ftype; } 7588 7560 break; … … 7591 7563 7592 7564 /* Line 1806 of yacc.c */ 7593 #line 186 7"parser.yy"7565 #line 1864 "parser.yy" 7594 7566 { (yyval.tclass) = DeclarationNode::Dtype; } 7595 7567 break; … … 7598 7570 7599 7571 /* Line 1806 of yacc.c */ 7600 #line 18 72"parser.yy"7572 #line 1869 "parser.yy" 7601 7573 { (yyval.decl) = 0; } 7602 7574 break; … … 7605 7577 7606 7578 /* Line 1806 of yacc.c */ 7607 #line 187 4"parser.yy"7579 #line 1871 "parser.yy" 7608 7580 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7609 7581 break; … … 7612 7584 7613 7585 /* Line 1806 of yacc.c */ 7614 #line 187 9"parser.yy"7586 #line 1876 "parser.yy" 7615 7587 { 7616 7588 typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) ); … … 7622 7594 7623 7595 /* Line 1806 of yacc.c */ 7624 #line 188 4"parser.yy"7596 #line 1881 "parser.yy" 7625 7597 { (yyval.decl) = (yyvsp[(4) - (5)].decl); } 7626 7598 break; … … 7629 7601 7630 7602 /* Line 1806 of yacc.c */ 7631 #line 188 6"parser.yy"7603 #line 1883 "parser.yy" 7632 7604 { (yyval.decl) = 0; } 7633 7605 break; … … 7636 7608 7637 7609 /* Line 1806 of yacc.c */ 7610 #line 1888 "parser.yy" 7611 { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); } 7612 break; 7613 7614 case 498: 7615 7616 /* Line 1806 of yacc.c */ 7638 7617 #line 1891 "parser.yy" 7639 { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); }7640 break;7641 7642 case 498:7643 7644 /* Line 1806 of yacc.c */7645 #line 1894 "parser.yy"7646 7618 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( build_typevalue( (yyvsp[(3) - (3)].decl) ) ) ) ); } 7647 7619 break; … … 7650 7622 7651 7623 /* Line 1806 of yacc.c */ 7652 #line 189 6"parser.yy"7624 #line 1893 "parser.yy" 7653 7625 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 7654 7626 break; … … 7657 7629 7658 7630 /* Line 1806 of yacc.c */ 7659 #line 1 901"parser.yy"7631 #line 1898 "parser.yy" 7660 7632 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7661 7633 break; … … 7664 7636 7665 7637 /* Line 1806 of yacc.c */ 7666 #line 190 3"parser.yy"7638 #line 1900 "parser.yy" 7667 7639 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); } 7668 7640 break; … … 7671 7643 7672 7644 /* Line 1806 of yacc.c */ 7673 #line 190 5"parser.yy"7645 #line 1902 "parser.yy" 7674 7646 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); } 7675 7647 break; … … 7678 7650 7679 7651 /* Line 1806 of yacc.c */ 7680 #line 19 10"parser.yy"7652 #line 1907 "parser.yy" 7681 7653 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); } 7682 7654 break; … … 7685 7657 7686 7658 /* Line 1806 of yacc.c */ 7687 #line 19 12"parser.yy"7659 #line 1909 "parser.yy" 7688 7660 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); } 7689 7661 break; … … 7692 7664 7693 7665 /* Line 1806 of yacc.c */ 7694 #line 191 7"parser.yy"7666 #line 1914 "parser.yy" 7695 7667 { 7696 7668 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD ); … … 7702 7674 7703 7675 /* Line 1806 of yacc.c */ 7704 #line 19 22"parser.yy"7676 #line 1919 "parser.yy" 7705 7677 { 7706 7678 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG ); … … 7712 7684 7713 7685 /* Line 1806 of yacc.c */ 7714 #line 19 30"parser.yy"7686 #line 1927 "parser.yy" 7715 7687 { 7716 7688 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID ); … … 7722 7694 7723 7695 /* Line 1806 of yacc.c */ 7724 #line 193 5"parser.yy"7696 #line 1932 "parser.yy" 7725 7697 { 7726 7698 typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) ); … … 7732 7704 7733 7705 /* Line 1806 of yacc.c */ 7734 #line 19 40"parser.yy"7706 #line 1937 "parser.yy" 7735 7707 { 7736 7708 typedefTable.leaveTrait(); … … 7743 7715 7744 7716 /* Line 1806 of yacc.c */ 7745 #line 19 50"parser.yy"7717 #line 1947 "parser.yy" 7746 7718 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 7747 7719 break; … … 7750 7722 7751 7723 /* Line 1806 of yacc.c */ 7752 #line 19 60"parser.yy"7724 #line 1957 "parser.yy" 7753 7725 { 7754 7726 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7760 7732 7761 7733 /* Line 1806 of yacc.c */ 7762 #line 196 5"parser.yy"7734 #line 1962 "parser.yy" 7763 7735 { 7764 7736 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7770 7742 7771 7743 /* Line 1806 of yacc.c */ 7772 #line 19 70"parser.yy"7744 #line 1967 "parser.yy" 7773 7745 { 7774 7746 typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 7780 7752 7781 7753 /* Line 1806 of yacc.c */ 7782 #line 197 8"parser.yy"7754 #line 1975 "parser.yy" 7783 7755 { 7784 7756 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7790 7762 7791 7763 /* Line 1806 of yacc.c */ 7792 #line 198 3"parser.yy"7764 #line 1980 "parser.yy" 7793 7765 { 7794 7766 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7800 7772 7801 7773 /* Line 1806 of yacc.c */ 7802 #line 199 3"parser.yy"7774 #line 1990 "parser.yy" 7803 7775 {} 7804 7776 break; … … 7807 7779 7808 7780 /* Line 1806 of yacc.c */ 7809 #line 199 5"parser.yy"7781 #line 1992 "parser.yy" 7810 7782 { parseTree = parseTree != nullptr ? parseTree->appendList( (yyvsp[(1) - (1)].decl) ) : (yyvsp[(1) - (1)].decl); } 7811 7783 break; … … 7814 7786 7815 7787 /* Line 1806 of yacc.c */ 7816 #line 2001"parser.yy"7788 #line 1998 "parser.yy" 7817 7789 { (yyval.decl) = (yyvsp[(1) - (3)].decl) != nullptr ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); } 7818 7790 break; … … 7821 7793 7822 7794 /* Line 1806 of yacc.c */ 7823 #line 200 6"parser.yy"7795 #line 2003 "parser.yy" 7824 7796 { (yyval.decl) = 0; } 7825 7797 break; … … 7828 7800 7829 7801 /* Line 1806 of yacc.c */ 7830 #line 201 4"parser.yy"7802 #line 2011 "parser.yy" 7831 7803 {} 7832 7804 break; … … 7835 7807 7836 7808 /* Line 1806 of yacc.c */ 7837 #line 201 6"parser.yy"7809 #line 2013 "parser.yy" 7838 7810 { 7839 7811 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" … … 7845 7817 7846 7818 /* Line 1806 of yacc.c */ 7847 #line 20 21"parser.yy"7819 #line 2018 "parser.yy" 7848 7820 { 7849 7821 linkage = linkageStack.top(); … … 7856 7828 7857 7829 /* Line 1806 of yacc.c */ 7858 #line 202 7"parser.yy"7830 #line 2024 "parser.yy" 7859 7831 { // mark all fields in list 7860 7832 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7867 7839 7868 7840 /* Line 1806 of yacc.c */ 7869 #line 20 42"parser.yy"7841 #line 2039 "parser.yy" 7870 7842 { 7871 7843 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7878 7850 7879 7851 /* Line 1806 of yacc.c */ 7880 #line 204 8"parser.yy"7852 #line 2045 "parser.yy" 7881 7853 { 7882 7854 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7889 7861 7890 7862 /* Line 1806 of yacc.c */ 7891 #line 205 7"parser.yy"7863 #line 2054 "parser.yy" 7892 7864 { 7893 7865 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7900 7872 7901 7873 /* Line 1806 of yacc.c */ 7902 #line 206 3"parser.yy"7874 #line 2060 "parser.yy" 7903 7875 { 7904 7876 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7911 7883 7912 7884 /* Line 1806 of yacc.c */ 7913 #line 206 9"parser.yy"7885 #line 2066 "parser.yy" 7914 7886 { 7915 7887 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7922 7894 7923 7895 /* Line 1806 of yacc.c */ 7924 #line 207 5"parser.yy"7896 #line 2072 "parser.yy" 7925 7897 { 7926 7898 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7933 7905 7934 7906 /* Line 1806 of yacc.c */ 7935 #line 20 81"parser.yy"7907 #line 2078 "parser.yy" 7936 7908 { 7937 7909 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7944 7916 7945 7917 /* Line 1806 of yacc.c */ 7946 #line 208 9"parser.yy"7918 #line 2086 "parser.yy" 7947 7919 { 7948 7920 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7955 7927 7956 7928 /* Line 1806 of yacc.c */ 7957 #line 209 5"parser.yy"7929 #line 2092 "parser.yy" 7958 7930 { 7959 7931 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7966 7938 7967 7939 /* Line 1806 of yacc.c */ 7968 #line 210 3"parser.yy"7940 #line 2100 "parser.yy" 7969 7941 { 7970 7942 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7977 7949 7978 7950 /* Line 1806 of yacc.c */ 7979 #line 210 9"parser.yy"7951 #line 2106 "parser.yy" 7980 7952 { 7981 7953 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7988 7960 7989 7961 /* Line 1806 of yacc.c */ 7990 #line 212 4"parser.yy"7962 #line 2121 "parser.yy" 7991 7963 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 7992 7964 break; … … 7995 7967 7996 7968 /* Line 1806 of yacc.c */ 7997 #line 212 9"parser.yy"7969 #line 2126 "parser.yy" 7998 7970 { delete (yyvsp[(3) - (5)].str); } 7999 7971 break; … … 8002 7974 8003 7975 /* Line 1806 of yacc.c */ 8004 #line 213 4"parser.yy"7976 #line 2131 "parser.yy" 8005 7977 { (yyval.decl) = 0; } 8006 7978 break; … … 8009 7981 8010 7982 /* Line 1806 of yacc.c */ 8011 #line 21 41"parser.yy"7983 #line 2138 "parser.yy" 8012 7984 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8013 7985 break; … … 8016 7988 8017 7989 /* Line 1806 of yacc.c */ 8018 #line 214 7"parser.yy"7990 #line 2144 "parser.yy" 8019 7991 { (yyval.decl) = 0; } 8020 7992 break; … … 8023 7995 8024 7996 /* Line 1806 of yacc.c */ 8025 #line 215 8"parser.yy"7997 #line 2155 "parser.yy" 8026 7998 { delete (yyvsp[(3) - (4)].en); } 8027 7999 break; … … 8030 8002 8031 8003 /* Line 1806 of yacc.c */ 8004 #line 2159 "parser.yy" 8005 { delete (yyvsp[(1) - (1)].tok); } 8006 break; 8007 8008 case 560: 8009 8010 /* Line 1806 of yacc.c */ 8011 #line 2160 "parser.yy" 8012 { delete (yyvsp[(1) - (1)].decl); } 8013 break; 8014 8015 case 561: 8016 8017 /* Line 1806 of yacc.c */ 8018 #line 2161 "parser.yy" 8019 { delete (yyvsp[(1) - (1)].decl); } 8020 break; 8021 8022 case 562: 8023 8024 /* Line 1806 of yacc.c */ 8032 8025 #line 2162 "parser.yy" 8033 { delete (yyvsp[(1) - (1)].tok); }8034 break;8035 8036 case 560:8037 8038 /* Line 1806 of yacc.c */8039 #line 2163 "parser.yy"8040 8026 { delete (yyvsp[(1) - (1)].decl); } 8041 8027 break; 8042 8028 8043 case 561:8044 8045 /* Line 1806 of yacc.c */8046 #line 2164 "parser.yy"8047 { delete (yyvsp[(1) - (1)].decl); }8048 break;8049 8050 case 562:8051 8052 /* Line 1806 of yacc.c */8053 #line 2165 "parser.yy"8054 { delete (yyvsp[(1) - (1)].decl); }8055 break;8056 8057 8029 case 563: 8030 8031 /* Line 1806 of yacc.c */ 8032 #line 2197 "parser.yy" 8033 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8034 break; 8035 8036 case 565: 8058 8037 8059 8038 /* Line 1806 of yacc.c */ … … 8062 8041 break; 8063 8042 8064 case 56 5:8065 8066 /* Line 1806 of yacc.c */ 8067 #line 220 3"parser.yy"8043 case 566: 8044 8045 /* Line 1806 of yacc.c */ 8046 #line 2202 "parser.yy" 8068 8047 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8069 8048 break; 8070 8049 8071 case 566:8072 8073 /* Line 1806 of yacc.c */8074 #line 2205 "parser.yy"8075 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8076 break;8077 8078 8050 case 567: 8079 8051 8080 8052 /* Line 1806 of yacc.c */ 8081 #line 22 10"parser.yy"8053 #line 2207 "parser.yy" 8082 8054 { 8083 8055 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8089 8061 8090 8062 /* Line 1806 of yacc.c */ 8091 #line 221 5"parser.yy"8063 #line 2212 "parser.yy" 8092 8064 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8093 8065 break; … … 8096 8068 8097 8069 /* Line 1806 of yacc.c */ 8098 #line 22 20"parser.yy"8070 #line 2217 "parser.yy" 8099 8071 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8100 8072 break; … … 8103 8075 8104 8076 /* Line 1806 of yacc.c */ 8105 #line 22 22"parser.yy"8077 #line 2219 "parser.yy" 8106 8078 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8107 8079 break; … … 8110 8082 8111 8083 /* Line 1806 of yacc.c */ 8112 #line 222 4"parser.yy"8084 #line 2221 "parser.yy" 8113 8085 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8114 8086 break; … … 8117 8089 8118 8090 /* Line 1806 of yacc.c */ 8119 #line 222 9"parser.yy"8091 #line 2226 "parser.yy" 8120 8092 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8121 8093 break; … … 8124 8096 8125 8097 /* Line 1806 of yacc.c */ 8126 #line 22 31"parser.yy"8098 #line 2228 "parser.yy" 8127 8099 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8128 8100 break; … … 8131 8103 8132 8104 /* Line 1806 of yacc.c */ 8133 #line 223 3"parser.yy"8105 #line 2230 "parser.yy" 8134 8106 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8135 8107 break; … … 8138 8110 8139 8111 /* Line 1806 of yacc.c */ 8140 #line 223 5"parser.yy"8112 #line 2232 "parser.yy" 8141 8113 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8142 8114 break; … … 8145 8117 8146 8118 /* Line 1806 of yacc.c */ 8147 #line 22 40"parser.yy"8119 #line 2237 "parser.yy" 8148 8120 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8149 8121 break; … … 8152 8124 8153 8125 /* Line 1806 of yacc.c */ 8154 #line 22 42"parser.yy"8126 #line 2239 "parser.yy" 8155 8127 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8156 8128 break; 8157 8129 8158 8130 case 578: 8131 8132 /* Line 1806 of yacc.c */ 8133 #line 2248 "parser.yy" 8134 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8135 break; 8136 8137 case 580: 8159 8138 8160 8139 /* Line 1806 of yacc.c */ … … 8163 8142 break; 8164 8143 8165 case 580: 8166 8167 /* Line 1806 of yacc.c */ 8168 #line 2254 "parser.yy" 8144 case 581: 8145 8146 /* Line 1806 of yacc.c */ 8147 #line 2256 "parser.yy" 8148 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8149 break; 8150 8151 case 582: 8152 8153 /* Line 1806 of yacc.c */ 8154 #line 2258 "parser.yy" 8155 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8156 break; 8157 8158 case 583: 8159 8160 /* Line 1806 of yacc.c */ 8161 #line 2260 "parser.yy" 8162 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8163 break; 8164 8165 case 584: 8166 8167 /* Line 1806 of yacc.c */ 8168 #line 2265 "parser.yy" 8169 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8170 break; 8171 8172 case 585: 8173 8174 /* Line 1806 of yacc.c */ 8175 #line 2267 "parser.yy" 8176 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8177 break; 8178 8179 case 586: 8180 8181 /* Line 1806 of yacc.c */ 8182 #line 2269 "parser.yy" 8183 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8184 break; 8185 8186 case 587: 8187 8188 /* Line 1806 of yacc.c */ 8189 #line 2274 "parser.yy" 8190 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8191 break; 8192 8193 case 588: 8194 8195 /* Line 1806 of yacc.c */ 8196 #line 2276 "parser.yy" 8197 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8198 break; 8199 8200 case 589: 8201 8202 /* Line 1806 of yacc.c */ 8203 #line 2278 "parser.yy" 8204 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8205 break; 8206 8207 case 593: 8208 8209 /* Line 1806 of yacc.c */ 8210 #line 2293 "parser.yy" 8211 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); } 8212 break; 8213 8214 case 594: 8215 8216 /* Line 1806 of yacc.c */ 8217 #line 2295 "parser.yy" 8218 { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); } 8219 break; 8220 8221 case 595: 8222 8223 /* Line 1806 of yacc.c */ 8224 #line 2297 "parser.yy" 8225 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8226 break; 8227 8228 case 596: 8229 8230 /* Line 1806 of yacc.c */ 8231 #line 2302 "parser.yy" 8232 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8233 break; 8234 8235 case 597: 8236 8237 /* Line 1806 of yacc.c */ 8238 #line 2304 "parser.yy" 8239 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8240 break; 8241 8242 case 598: 8243 8244 /* Line 1806 of yacc.c */ 8245 #line 2306 "parser.yy" 8246 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8247 break; 8248 8249 case 599: 8250 8251 /* Line 1806 of yacc.c */ 8252 #line 2311 "parser.yy" 8253 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8254 break; 8255 8256 case 600: 8257 8258 /* Line 1806 of yacc.c */ 8259 #line 2313 "parser.yy" 8260 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8261 break; 8262 8263 case 601: 8264 8265 /* Line 1806 of yacc.c */ 8266 #line 2315 "parser.yy" 8267 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8268 break; 8269 8270 case 602: 8271 8272 /* Line 1806 of yacc.c */ 8273 #line 2330 "parser.yy" 8169 8274 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8170 8275 break; 8171 8276 8172 case 581: 8173 8174 /* Line 1806 of yacc.c */ 8175 #line 2259 "parser.yy" 8176 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8177 break; 8178 8179 case 582: 8180 8181 /* Line 1806 of yacc.c */ 8182 #line 2261 "parser.yy" 8183 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8184 break; 8185 8186 case 583: 8187 8188 /* Line 1806 of yacc.c */ 8189 #line 2263 "parser.yy" 8190 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8191 break; 8192 8193 case 584: 8194 8195 /* Line 1806 of yacc.c */ 8196 #line 2268 "parser.yy" 8197 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8198 break; 8199 8200 case 585: 8201 8202 /* Line 1806 of yacc.c */ 8203 #line 2270 "parser.yy" 8204 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8205 break; 8206 8207 case 586: 8208 8209 /* Line 1806 of yacc.c */ 8210 #line 2272 "parser.yy" 8211 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8212 break; 8213 8214 case 587: 8215 8216 /* Line 1806 of yacc.c */ 8217 #line 2277 "parser.yy" 8218 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8219 break; 8220 8221 case 588: 8222 8223 /* Line 1806 of yacc.c */ 8224 #line 2279 "parser.yy" 8225 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8226 break; 8227 8228 case 589: 8229 8230 /* Line 1806 of yacc.c */ 8231 #line 2281 "parser.yy" 8232 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8233 break; 8234 8235 case 593: 8236 8237 /* Line 1806 of yacc.c */ 8238 #line 2296 "parser.yy" 8239 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); } 8240 break; 8241 8242 case 594: 8243 8244 /* Line 1806 of yacc.c */ 8245 #line 2298 "parser.yy" 8246 { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); } 8247 break; 8248 8249 case 595: 8250 8251 /* Line 1806 of yacc.c */ 8252 #line 2300 "parser.yy" 8253 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8254 break; 8255 8256 case 596: 8257 8258 /* Line 1806 of yacc.c */ 8259 #line 2305 "parser.yy" 8260 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8261 break; 8262 8263 case 597: 8264 8265 /* Line 1806 of yacc.c */ 8266 #line 2307 "parser.yy" 8267 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8268 break; 8269 8270 case 598: 8271 8272 /* Line 1806 of yacc.c */ 8273 #line 2309 "parser.yy" 8274 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8275 break; 8276 8277 case 599: 8278 8279 /* Line 1806 of yacc.c */ 8280 #line 2314 "parser.yy" 8281 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8282 break; 8283 8284 case 600: 8285 8286 /* Line 1806 of yacc.c */ 8287 #line 2316 "parser.yy" 8288 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8289 break; 8290 8291 case 601: 8292 8293 /* Line 1806 of yacc.c */ 8294 #line 2318 "parser.yy" 8295 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8296 break; 8297 8298 case 602: 8277 case 604: 8299 8278 8300 8279 /* Line 1806 of yacc.c */ … … 8303 8282 break; 8304 8283 8305 case 60 4:8306 8307 /* Line 1806 of yacc.c */ 8308 #line 233 6"parser.yy"8284 case 605: 8285 8286 /* Line 1806 of yacc.c */ 8287 #line 2335 "parser.yy" 8309 8288 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8310 8289 break; 8311 8290 8312 case 605: 8313 8314 /* Line 1806 of yacc.c */ 8315 #line 2338 "parser.yy" 8291 case 607: 8292 8293 /* Line 1806 of yacc.c */ 8294 #line 2341 "parser.yy" 8295 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8296 break; 8297 8298 case 608: 8299 8300 /* Line 1806 of yacc.c */ 8301 #line 2346 "parser.yy" 8302 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8303 break; 8304 8305 case 609: 8306 8307 /* Line 1806 of yacc.c */ 8308 #line 2348 "parser.yy" 8309 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8310 break; 8311 8312 case 610: 8313 8314 /* Line 1806 of yacc.c */ 8315 #line 2350 "parser.yy" 8316 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8317 break; 8318 8319 case 611: 8320 8321 /* Line 1806 of yacc.c */ 8322 #line 2355 "parser.yy" 8323 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8324 break; 8325 8326 case 612: 8327 8328 /* Line 1806 of yacc.c */ 8329 #line 2357 "parser.yy" 8330 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8331 break; 8332 8333 case 613: 8334 8335 /* Line 1806 of yacc.c */ 8336 #line 2359 "parser.yy" 8337 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8338 break; 8339 8340 case 614: 8341 8342 /* Line 1806 of yacc.c */ 8343 #line 2361 "parser.yy" 8344 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8345 break; 8346 8347 case 615: 8348 8349 /* Line 1806 of yacc.c */ 8350 #line 2366 "parser.yy" 8351 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8352 break; 8353 8354 case 616: 8355 8356 /* Line 1806 of yacc.c */ 8357 #line 2368 "parser.yy" 8358 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8359 break; 8360 8361 case 617: 8362 8363 /* Line 1806 of yacc.c */ 8364 #line 2370 "parser.yy" 8365 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8366 break; 8367 8368 case 618: 8369 8370 /* Line 1806 of yacc.c */ 8371 #line 2380 "parser.yy" 8316 8372 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8317 8373 break; 8318 8374 8319 case 607: 8320 8321 /* Line 1806 of yacc.c */ 8322 #line 2344 "parser.yy" 8323 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8324 break; 8325 8326 case 608: 8327 8328 /* Line 1806 of yacc.c */ 8329 #line 2349 "parser.yy" 8330 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8331 break; 8332 8333 case 609: 8334 8335 /* Line 1806 of yacc.c */ 8336 #line 2351 "parser.yy" 8337 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8338 break; 8339 8340 case 610: 8341 8342 /* Line 1806 of yacc.c */ 8343 #line 2353 "parser.yy" 8344 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8345 break; 8346 8347 case 611: 8348 8349 /* Line 1806 of yacc.c */ 8350 #line 2358 "parser.yy" 8351 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8352 break; 8353 8354 case 612: 8355 8356 /* Line 1806 of yacc.c */ 8357 #line 2360 "parser.yy" 8358 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8359 break; 8360 8361 case 613: 8362 8363 /* Line 1806 of yacc.c */ 8364 #line 2362 "parser.yy" 8365 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8366 break; 8367 8368 case 614: 8369 8370 /* Line 1806 of yacc.c */ 8371 #line 2364 "parser.yy" 8372 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8373 break; 8374 8375 case 615: 8376 8377 /* Line 1806 of yacc.c */ 8378 #line 2369 "parser.yy" 8379 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8380 break; 8381 8382 case 616: 8383 8384 /* Line 1806 of yacc.c */ 8385 #line 2371 "parser.yy" 8386 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8387 break; 8388 8389 case 617: 8390 8391 /* Line 1806 of yacc.c */ 8392 #line 2373 "parser.yy" 8393 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8394 break; 8395 8396 case 618: 8375 case 620: 8397 8376 8398 8377 /* Line 1806 of yacc.c */ … … 8401 8380 break; 8402 8381 8403 case 62 0:8404 8405 /* Line 1806 of yacc.c */ 8406 #line 238 6"parser.yy"8382 case 621: 8383 8384 /* Line 1806 of yacc.c */ 8385 #line 2385 "parser.yy" 8407 8386 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8408 8387 break; 8409 8388 8410 case 621: 8411 8412 /* Line 1806 of yacc.c */ 8413 #line 2388 "parser.yy" 8389 case 622: 8390 8391 /* Line 1806 of yacc.c */ 8392 #line 2390 "parser.yy" 8393 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8394 break; 8395 8396 case 623: 8397 8398 /* Line 1806 of yacc.c */ 8399 #line 2392 "parser.yy" 8400 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8401 break; 8402 8403 case 624: 8404 8405 /* Line 1806 of yacc.c */ 8406 #line 2394 "parser.yy" 8407 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8408 break; 8409 8410 case 625: 8411 8412 /* Line 1806 of yacc.c */ 8413 #line 2399 "parser.yy" 8414 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8415 break; 8416 8417 case 626: 8418 8419 /* Line 1806 of yacc.c */ 8420 #line 2401 "parser.yy" 8421 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8422 break; 8423 8424 case 627: 8425 8426 /* Line 1806 of yacc.c */ 8427 #line 2403 "parser.yy" 8428 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8429 break; 8430 8431 case 628: 8432 8433 /* Line 1806 of yacc.c */ 8434 #line 2405 "parser.yy" 8435 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8436 break; 8437 8438 case 629: 8439 8440 /* Line 1806 of yacc.c */ 8441 #line 2410 "parser.yy" 8442 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8443 break; 8444 8445 case 630: 8446 8447 /* Line 1806 of yacc.c */ 8448 #line 2412 "parser.yy" 8449 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8450 break; 8451 8452 case 631: 8453 8454 /* Line 1806 of yacc.c */ 8455 #line 2414 "parser.yy" 8456 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8457 break; 8458 8459 case 632: 8460 8461 /* Line 1806 of yacc.c */ 8462 #line 2445 "parser.yy" 8414 8463 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8415 8464 break; 8416 8465 8417 case 622: 8418 8419 /* Line 1806 of yacc.c */ 8420 #line 2393 "parser.yy" 8421 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8422 break; 8423 8424 case 623: 8425 8426 /* Line 1806 of yacc.c */ 8427 #line 2395 "parser.yy" 8428 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8429 break; 8430 8431 case 624: 8432 8433 /* Line 1806 of yacc.c */ 8434 #line 2397 "parser.yy" 8435 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8436 break; 8437 8438 case 625: 8439 8440 /* Line 1806 of yacc.c */ 8441 #line 2402 "parser.yy" 8442 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8443 break; 8444 8445 case 626: 8446 8447 /* Line 1806 of yacc.c */ 8448 #line 2404 "parser.yy" 8449 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8450 break; 8451 8452 case 627: 8453 8454 /* Line 1806 of yacc.c */ 8455 #line 2406 "parser.yy" 8456 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8457 break; 8458 8459 case 628: 8460 8461 /* Line 1806 of yacc.c */ 8462 #line 2408 "parser.yy" 8463 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8464 break; 8465 8466 case 629: 8467 8468 /* Line 1806 of yacc.c */ 8469 #line 2413 "parser.yy" 8470 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8471 break; 8472 8473 case 630: 8474 8475 /* Line 1806 of yacc.c */ 8476 #line 2415 "parser.yy" 8477 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8478 break; 8479 8480 case 631: 8481 8482 /* Line 1806 of yacc.c */ 8483 #line 2417 "parser.yy" 8484 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8485 break; 8486 8487 case 632: 8466 case 634: 8488 8467 8489 8468 /* Line 1806 of yacc.c */ … … 8492 8471 break; 8493 8472 8494 case 63 4:8495 8496 /* Line 1806 of yacc.c */ 8497 #line 245 1"parser.yy"8473 case 635: 8474 8475 /* Line 1806 of yacc.c */ 8476 #line 2450 "parser.yy" 8498 8477 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8499 8478 break; 8500 8479 8501 case 635:8502 8503 /* Line 1806 of yacc.c */8504 #line 2453 "parser.yy"8505 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }8506 break;8507 8508 8480 case 636: 8509 8481 8510 8482 /* Line 1806 of yacc.c */ 8511 #line 245 8"parser.yy"8483 #line 2455 "parser.yy" 8512 8484 { 8513 8485 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8519 8491 8520 8492 /* Line 1806 of yacc.c */ 8521 #line 246 3"parser.yy"8493 #line 2460 "parser.yy" 8522 8494 { 8523 8495 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8529 8501 8530 8502 /* Line 1806 of yacc.c */ 8531 #line 24 71"parser.yy"8503 #line 2468 "parser.yy" 8532 8504 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8533 8505 break; … … 8536 8508 8537 8509 /* Line 1806 of yacc.c */ 8538 #line 247 3"parser.yy"8510 #line 2470 "parser.yy" 8539 8511 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8540 8512 break; … … 8543 8515 8544 8516 /* Line 1806 of yacc.c */ 8545 #line 247 5"parser.yy"8517 #line 2472 "parser.yy" 8546 8518 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8547 8519 break; … … 8550 8522 8551 8523 /* Line 1806 of yacc.c */ 8552 #line 24 80"parser.yy"8524 #line 2477 "parser.yy" 8553 8525 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8554 8526 break; … … 8557 8529 8558 8530 /* Line 1806 of yacc.c */ 8559 #line 24 82"parser.yy"8531 #line 2479 "parser.yy" 8560 8532 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8561 8533 break; … … 8564 8536 8565 8537 /* Line 1806 of yacc.c */ 8566 #line 248 7"parser.yy"8538 #line 2484 "parser.yy" 8567 8539 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8568 8540 break; … … 8571 8543 8572 8544 /* Line 1806 of yacc.c */ 8573 #line 248 9"parser.yy"8545 #line 2486 "parser.yy" 8574 8546 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8575 8547 break; … … 8578 8550 8579 8551 /* Line 1806 of yacc.c */ 8580 #line 250 4"parser.yy"8552 #line 2501 "parser.yy" 8581 8553 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8582 8554 break; … … 8585 8557 8586 8558 /* Line 1806 of yacc.c */ 8587 #line 250 6"parser.yy"8559 #line 2503 "parser.yy" 8588 8560 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8589 8561 break; … … 8592 8564 8593 8565 /* Line 1806 of yacc.c */ 8594 #line 25 11"parser.yy"8566 #line 2508 "parser.yy" 8595 8567 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8596 8568 break; … … 8599 8571 8600 8572 /* Line 1806 of yacc.c */ 8601 #line 251 3"parser.yy"8573 #line 2510 "parser.yy" 8602 8574 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8603 8575 break; … … 8606 8578 8607 8579 /* Line 1806 of yacc.c */ 8608 #line 251 5"parser.yy"8580 #line 2512 "parser.yy" 8609 8581 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8610 8582 break; … … 8613 8585 8614 8586 /* Line 1806 of yacc.c */ 8615 #line 251 7"parser.yy"8587 #line 2514 "parser.yy" 8616 8588 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8617 8589 break; … … 8620 8592 8621 8593 /* Line 1806 of yacc.c */ 8622 #line 251 9"parser.yy"8594 #line 2516 "parser.yy" 8623 8595 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8624 8596 break; … … 8627 8599 8628 8600 /* Line 1806 of yacc.c */ 8629 #line 252 5"parser.yy"8601 #line 2522 "parser.yy" 8630 8602 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8631 8603 break; … … 8634 8606 8635 8607 /* Line 1806 of yacc.c */ 8636 #line 252 7"parser.yy"8608 #line 2524 "parser.yy" 8637 8609 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8638 8610 break; … … 8641 8613 8642 8614 /* Line 1806 of yacc.c */ 8643 #line 252 9"parser.yy"8615 #line 2526 "parser.yy" 8644 8616 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8645 8617 break; … … 8648 8620 8649 8621 /* Line 1806 of yacc.c */ 8650 #line 253 4"parser.yy"8622 #line 2531 "parser.yy" 8651 8623 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8652 8624 break; … … 8655 8627 8656 8628 /* Line 1806 of yacc.c */ 8657 #line 253 6"parser.yy"8629 #line 2533 "parser.yy" 8658 8630 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8659 8631 break; … … 8662 8634 8663 8635 /* Line 1806 of yacc.c */ 8664 #line 253 8"parser.yy"8636 #line 2535 "parser.yy" 8665 8637 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8666 8638 break; … … 8669 8641 8670 8642 /* Line 1806 of yacc.c */ 8671 #line 254 4"parser.yy"8643 #line 2541 "parser.yy" 8672 8644 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8673 8645 break; … … 8676 8648 8677 8649 /* Line 1806 of yacc.c */ 8678 #line 254 6"parser.yy"8650 #line 2543 "parser.yy" 8679 8651 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); } 8680 8652 break; … … 8683 8655 8684 8656 /* Line 1806 of yacc.c */ 8685 #line 25 52"parser.yy"8657 #line 2549 "parser.yy" 8686 8658 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); } 8687 8659 break; … … 8690 8662 8691 8663 /* Line 1806 of yacc.c */ 8692 #line 255 4"parser.yy"8664 #line 2551 "parser.yy" 8693 8665 { (yyval.decl) = DeclarationNode::newVarArray( 0 ); } 8694 8666 break; … … 8697 8669 8698 8670 /* Line 1806 of yacc.c */ 8699 #line 255 6"parser.yy"8671 #line 2553 "parser.yy" 8700 8672 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); } 8701 8673 break; … … 8704 8676 8705 8677 /* Line 1806 of yacc.c */ 8706 #line 255 8"parser.yy"8678 #line 2555 "parser.yy" 8707 8679 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); } 8708 8680 break; … … 8711 8683 8712 8684 /* Line 1806 of yacc.c */ 8713 #line 257 3"parser.yy"8685 #line 2570 "parser.yy" 8714 8686 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8715 8687 break; … … 8718 8690 8719 8691 /* Line 1806 of yacc.c */ 8720 #line 257 5"parser.yy"8692 #line 2572 "parser.yy" 8721 8693 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8722 8694 break; … … 8725 8697 8726 8698 /* Line 1806 of yacc.c */ 8727 #line 25 80"parser.yy"8699 #line 2577 "parser.yy" 8728 8700 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8729 8701 break; … … 8732 8704 8733 8705 /* Line 1806 of yacc.c */ 8734 #line 25 82"parser.yy"8706 #line 2579 "parser.yy" 8735 8707 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8736 8708 break; … … 8739 8711 8740 8712 /* Line 1806 of yacc.c */ 8741 #line 258 4"parser.yy"8713 #line 2581 "parser.yy" 8742 8714 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8743 8715 break; … … 8746 8718 8747 8719 /* Line 1806 of yacc.c */ 8748 #line 258 6"parser.yy"8720 #line 2583 "parser.yy" 8749 8721 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8750 8722 break; … … 8753 8725 8754 8726 /* Line 1806 of yacc.c */ 8755 #line 258 8"parser.yy"8727 #line 2585 "parser.yy" 8756 8728 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8757 8729 break; … … 8760 8732 8761 8733 /* Line 1806 of yacc.c */ 8762 #line 259 4"parser.yy"8734 #line 2591 "parser.yy" 8763 8735 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8764 8736 break; … … 8767 8739 8768 8740 /* Line 1806 of yacc.c */ 8769 #line 259 6"parser.yy"8741 #line 2593 "parser.yy" 8770 8742 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8771 8743 break; … … 8774 8746 8775 8747 /* Line 1806 of yacc.c */ 8776 #line 259 8"parser.yy"8748 #line 2595 "parser.yy" 8777 8749 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8778 8750 break; … … 8781 8753 8782 8754 /* Line 1806 of yacc.c */ 8783 #line 260 3"parser.yy"8755 #line 2600 "parser.yy" 8784 8756 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8785 8757 break; … … 8788 8760 8789 8761 /* Line 1806 of yacc.c */ 8790 #line 260 5"parser.yy"8762 #line 2602 "parser.yy" 8791 8763 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8792 8764 break; … … 8795 8767 8796 8768 /* Line 1806 of yacc.c */ 8797 #line 260 7"parser.yy"8769 #line 2604 "parser.yy" 8798 8770 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8799 8771 break; … … 8802 8774 8803 8775 /* Line 1806 of yacc.c */ 8804 #line 261 4"parser.yy"8776 #line 2611 "parser.yy" 8805 8777 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8806 8778 break; … … 8809 8781 8810 8782 /* Line 1806 of yacc.c */ 8783 #line 2622 "parser.yy" 8784 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8785 break; 8786 8787 case 686: 8788 8789 /* Line 1806 of yacc.c */ 8811 8790 #line 2625 "parser.yy" 8812 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }8813 break;8814 8815 case 686:8816 8817 /* Line 1806 of yacc.c */8818 #line 2628 "parser.yy"8819 8791 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 8820 8792 break; … … 8823 8795 8824 8796 /* Line 1806 of yacc.c */ 8797 #line 2627 "parser.yy" 8798 { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); } 8799 break; 8800 8801 case 688: 8802 8803 /* Line 1806 of yacc.c */ 8825 8804 #line 2630 "parser.yy" 8826 { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }8827 break;8828 8829 case 688:8830 8831 /* Line 1806 of yacc.c */8832 #line 2633 "parser.yy"8833 8805 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 8834 8806 break; … … 8837 8809 8838 8810 /* Line 1806 of yacc.c */ 8839 #line 263 5"parser.yy"8811 #line 2632 "parser.yy" 8840 8812 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); } 8841 8813 break; … … 8844 8816 8845 8817 /* Line 1806 of yacc.c */ 8846 #line 263 7"parser.yy"8818 #line 2634 "parser.yy" 8847 8819 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); } 8848 8820 break; … … 8851 8823 8852 8824 /* Line 1806 of yacc.c */ 8853 #line 26 51"parser.yy"8825 #line 2648 "parser.yy" 8854 8826 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8855 8827 break; … … 8858 8830 8859 8831 /* Line 1806 of yacc.c */ 8860 #line 265 3"parser.yy"8832 #line 2650 "parser.yy" 8861 8833 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8862 8834 break; … … 8865 8837 8866 8838 /* Line 1806 of yacc.c */ 8867 #line 265 8"parser.yy"8839 #line 2655 "parser.yy" 8868 8840 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8869 8841 break; … … 8872 8844 8873 8845 /* Line 1806 of yacc.c */ 8874 #line 26 60"parser.yy"8846 #line 2657 "parser.yy" 8875 8847 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8876 8848 break; … … 8879 8851 8880 8852 /* Line 1806 of yacc.c */ 8881 #line 26 62"parser.yy"8853 #line 2659 "parser.yy" 8882 8854 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8883 8855 break; … … 8886 8858 8887 8859 /* Line 1806 of yacc.c */ 8888 #line 266 4"parser.yy"8860 #line 2661 "parser.yy" 8889 8861 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8890 8862 break; … … 8893 8865 8894 8866 /* Line 1806 of yacc.c */ 8895 #line 266 6"parser.yy"8867 #line 2663 "parser.yy" 8896 8868 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8897 8869 break; … … 8900 8872 8901 8873 /* Line 1806 of yacc.c */ 8902 #line 26 72"parser.yy"8874 #line 2669 "parser.yy" 8903 8875 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8904 8876 break; … … 8907 8879 8908 8880 /* Line 1806 of yacc.c */ 8909 #line 267 4"parser.yy"8881 #line 2671 "parser.yy" 8910 8882 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8911 8883 break; … … 8914 8886 8915 8887 /* Line 1806 of yacc.c */ 8916 #line 267 6"parser.yy"8888 #line 2673 "parser.yy" 8917 8889 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8918 8890 break; … … 8921 8893 8922 8894 /* Line 1806 of yacc.c */ 8923 #line 26 81"parser.yy"8895 #line 2678 "parser.yy" 8924 8896 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8925 8897 break; … … 8928 8900 8929 8901 /* Line 1806 of yacc.c */ 8930 #line 268 3"parser.yy"8902 #line 2680 "parser.yy" 8931 8903 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8932 8904 break; … … 8935 8907 8936 8908 /* Line 1806 of yacc.c */ 8937 #line 269 3"parser.yy"8909 #line 2690 "parser.yy" 8938 8910 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8939 8911 break; … … 8942 8914 8943 8915 /* Line 1806 of yacc.c */ 8944 #line 270 3"parser.yy"8916 #line 2700 "parser.yy" 8945 8917 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8946 8918 break; … … 8949 8921 8950 8922 /* Line 1806 of yacc.c */ 8951 #line 270 5"parser.yy"8923 #line 2702 "parser.yy" 8952 8924 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8953 8925 break; … … 8956 8928 8957 8929 /* Line 1806 of yacc.c */ 8958 #line 270 7"parser.yy"8930 #line 2704 "parser.yy" 8959 8931 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8960 8932 break; … … 8963 8935 8964 8936 /* Line 1806 of yacc.c */ 8965 #line 270 9"parser.yy"8937 #line 2706 "parser.yy" 8966 8938 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8967 8939 break; … … 8970 8942 8971 8943 /* Line 1806 of yacc.c */ 8972 #line 27 11"parser.yy"8944 #line 2708 "parser.yy" 8973 8945 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8974 8946 break; … … 8977 8949 8978 8950 /* Line 1806 of yacc.c */ 8979 #line 271 3"parser.yy"8951 #line 2710 "parser.yy" 8980 8952 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8981 8953 break; … … 8984 8956 8985 8957 /* Line 1806 of yacc.c */ 8986 #line 27 20"parser.yy"8958 #line 2717 "parser.yy" 8987 8959 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8988 8960 break; … … 8991 8963 8992 8964 /* Line 1806 of yacc.c */ 8993 #line 27 22"parser.yy"8965 #line 2719 "parser.yy" 8994 8966 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8995 8967 break; … … 8998 8970 8999 8971 /* Line 1806 of yacc.c */ 9000 #line 272 4"parser.yy"8972 #line 2721 "parser.yy" 9001 8973 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9002 8974 break; … … 9005 8977 9006 8978 /* Line 1806 of yacc.c */ 9007 #line 272 6"parser.yy"8979 #line 2723 "parser.yy" 9008 8980 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9009 8981 break; … … 9012 8984 9013 8985 /* Line 1806 of yacc.c */ 8986 #line 2725 "parser.yy" 8987 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8988 break; 8989 8990 case 721: 8991 8992 /* Line 1806 of yacc.c */ 9014 8993 #line 2728 "parser.yy" 8994 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8995 break; 8996 8997 case 722: 8998 8999 /* Line 1806 of yacc.c */ 9000 #line 2730 "parser.yy" 9015 9001 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9016 9002 break; 9017 9003 9018 case 721: 9019 9020 /* Line 1806 of yacc.c */ 9021 #line 2731 "parser.yy" 9022 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9023 break; 9024 9025 case 722: 9026 9027 /* Line 1806 of yacc.c */ 9028 #line 2733 "parser.yy" 9004 case 723: 9005 9006 /* Line 1806 of yacc.c */ 9007 #line 2732 "parser.yy" 9008 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9009 break; 9010 9011 case 724: 9012 9013 /* Line 1806 of yacc.c */ 9014 #line 2734 "parser.yy" 9015 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9016 break; 9017 9018 case 725: 9019 9020 /* Line 1806 of yacc.c */ 9021 #line 2736 "parser.yy" 9029 9022 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9030 9023 break; 9031 9024 9032 case 723: 9033 9034 /* Line 1806 of yacc.c */ 9035 #line 2735 "parser.yy" 9036 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 9037 break; 9038 9039 case 724: 9040 9041 /* Line 1806 of yacc.c */ 9042 #line 2737 "parser.yy" 9043 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 9044 break; 9045 9046 case 725: 9047 9048 /* Line 1806 of yacc.c */ 9049 #line 2739 "parser.yy" 9025 case 726: 9026 9027 /* Line 1806 of yacc.c */ 9028 #line 2741 "parser.yy" 9029 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 9030 break; 9031 9032 case 727: 9033 9034 /* Line 1806 of yacc.c */ 9035 #line 2743 "parser.yy" 9036 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 9037 break; 9038 9039 case 728: 9040 9041 /* Line 1806 of yacc.c */ 9042 #line 2748 "parser.yy" 9043 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); } 9044 break; 9045 9046 case 729: 9047 9048 /* Line 1806 of yacc.c */ 9049 #line 2750 "parser.yy" 9050 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); } 9051 break; 9052 9053 case 731: 9054 9055 /* Line 1806 of yacc.c */ 9056 #line 2777 "parser.yy" 9057 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 9058 break; 9059 9060 case 735: 9061 9062 /* Line 1806 of yacc.c */ 9063 #line 2788 "parser.yy" 9064 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9065 break; 9066 9067 case 736: 9068 9069 /* Line 1806 of yacc.c */ 9070 #line 2790 "parser.yy" 9071 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9072 break; 9073 9074 case 737: 9075 9076 /* Line 1806 of yacc.c */ 9077 #line 2792 "parser.yy" 9078 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9079 break; 9080 9081 case 738: 9082 9083 /* Line 1806 of yacc.c */ 9084 #line 2794 "parser.yy" 9085 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9086 break; 9087 9088 case 739: 9089 9090 /* Line 1806 of yacc.c */ 9091 #line 2796 "parser.yy" 9092 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9093 break; 9094 9095 case 740: 9096 9097 /* Line 1806 of yacc.c */ 9098 #line 2798 "parser.yy" 9099 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9100 break; 9101 9102 case 741: 9103 9104 /* Line 1806 of yacc.c */ 9105 #line 2805 "parser.yy" 9106 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9107 break; 9108 9109 case 742: 9110 9111 /* Line 1806 of yacc.c */ 9112 #line 2807 "parser.yy" 9113 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9114 break; 9115 9116 case 743: 9117 9118 /* Line 1806 of yacc.c */ 9119 #line 2809 "parser.yy" 9050 9120 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9051 9121 break; 9052 9122 9053 case 726: 9054 9055 /* Line 1806 of yacc.c */ 9056 #line 2744 "parser.yy" 9057 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 9058 break; 9059 9060 case 727: 9061 9062 /* Line 1806 of yacc.c */ 9063 #line 2746 "parser.yy" 9064 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 9065 break; 9066 9067 case 728: 9068 9069 /* Line 1806 of yacc.c */ 9070 #line 2751 "parser.yy" 9071 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); } 9072 break; 9073 9074 case 729: 9075 9076 /* Line 1806 of yacc.c */ 9077 #line 2753 "parser.yy" 9078 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); } 9079 break; 9080 9081 case 731: 9082 9083 /* Line 1806 of yacc.c */ 9084 #line 2780 "parser.yy" 9085 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 9086 break; 9087 9088 case 735: 9089 9090 /* Line 1806 of yacc.c */ 9091 #line 2791 "parser.yy" 9092 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9093 break; 9094 9095 case 736: 9096 9097 /* Line 1806 of yacc.c */ 9098 #line 2793 "parser.yy" 9099 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9100 break; 9101 9102 case 737: 9103 9104 /* Line 1806 of yacc.c */ 9105 #line 2795 "parser.yy" 9106 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9107 break; 9108 9109 case 738: 9110 9111 /* Line 1806 of yacc.c */ 9112 #line 2797 "parser.yy" 9113 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9114 break; 9115 9116 case 739: 9117 9118 /* Line 1806 of yacc.c */ 9119 #line 2799 "parser.yy" 9120 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 9121 break; 9122 9123 case 740: 9124 9125 /* Line 1806 of yacc.c */ 9126 #line 2801 "parser.yy" 9127 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 9128 break; 9129 9130 case 741: 9131 9132 /* Line 1806 of yacc.c */ 9133 #line 2808 "parser.yy" 9123 case 744: 9124 9125 /* Line 1806 of yacc.c */ 9126 #line 2811 "parser.yy" 9134 9127 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9135 9128 break; 9136 9129 9137 case 74 2:9138 9139 /* Line 1806 of yacc.c */ 9140 #line 281 0"parser.yy"9130 case 745: 9131 9132 /* Line 1806 of yacc.c */ 9133 #line 2813 "parser.yy" 9141 9134 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9142 9135 break; 9143 9136 9144 case 74 3:9145 9146 /* Line 1806 of yacc.c */ 9147 #line 281 2"parser.yy"9137 case 746: 9138 9139 /* Line 1806 of yacc.c */ 9140 #line 2815 "parser.yy" 9148 9141 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9149 9142 break; 9150 9143 9151 case 744:9152 9153 /* Line 1806 of yacc.c */9154 #line 2814 "parser.yy"9155 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }9156 break;9157 9158 case 745:9159 9160 /* Line 1806 of yacc.c */9161 #line 2816 "parser.yy"9162 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); }9163 break;9164 9165 case 746:9166 9167 /* Line 1806 of yacc.c */9168 #line 2818 "parser.yy"9169 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }9170 break;9171 9172 9144 case 747: 9173 9145 9174 9146 /* Line 1806 of yacc.c */ 9175 #line 282 3"parser.yy"9147 #line 2820 "parser.yy" 9176 9148 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 9177 9149 break; … … 9180 9152 9181 9153 /* Line 1806 of yacc.c */ 9182 #line 282 8"parser.yy"9154 #line 2825 "parser.yy" 9183 9155 { (yyval.decl) = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), (yyvsp[(4) - (5)].decl), nullptr ); } 9184 9156 break; … … 9187 9159 9188 9160 /* Line 1806 of yacc.c */ 9189 #line 28 30"parser.yy"9161 #line 2827 "parser.yy" 9190 9162 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9191 9163 break; … … 9194 9166 9195 9167 /* Line 1806 of yacc.c */ 9196 #line 28 32"parser.yy"9168 #line 2829 "parser.yy" 9197 9169 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9198 9170 break; … … 9201 9173 9202 9174 /* Line 1806 of yacc.c */ 9203 #line 285 6"parser.yy"9175 #line 2853 "parser.yy" 9204 9176 { (yyval.en) = 0; } 9205 9177 break; … … 9208 9180 9209 9181 /* Line 1806 of yacc.c */ 9210 #line 285 8"parser.yy"9182 #line 2855 "parser.yy" 9211 9183 { (yyval.en) = (yyvsp[(2) - (2)].en); } 9212 9184 break; … … 9215 9187 9216 9188 /* Line 1806 of yacc.c */ 9217 #line 9 218"Parser/parser.cc"9189 #line 9190 "Parser/parser.cc" 9218 9190 default: break; 9219 9191 } … … 9446 9418 9447 9419 /* Line 2067 of yacc.c */ 9448 #line 28 61"parser.yy"9420 #line 2858 "parser.yy" 9449 9421 9450 9422 // ----end of grammar---- -
src/Parser/parser.yy
ra1e67dd rfe7b281 195 195 196 196 %type<decl> field_declaration field_declaration_list field_declarator field_declaring_list 197 %type<en> field field_list field_name 197 %type<en> field field_list 198 %type<tok> field_name 198 199 199 200 %type<decl> external_function_definition function_definition function_array function_declarator function_no_ptr function_ptr … … 378 379 { $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); } 379 380 | postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector 380 { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $5 ) ) ); }381 381 | postfix_expression '.' INTEGERconstant 382 { $$ = new ExpressionNode( build_fieldSel( $1, build_constantInteger( *$3 ) ) ); }383 382 | postfix_expression ARROW no_attr_identifier 384 383 { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); } 385 384 | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector 386 { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); }387 385 | postfix_expression ICR 388 386 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); } … … 420 418 // ambiguity with .0 so space required after field-selection, e.g. 421 419 // struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1; 420 { $$ = new ExpressionNode( build_varref( $1 ) ); } 422 421 | field_name '.' field 423 { $$ = new ExpressionNode( build_fieldSel( $ 1, maybeMoveBuild<Expression>( $3) ) ); }422 { $$ = new ExpressionNode( build_fieldSel( $3, build_varref( $1 ) ) ); } 424 423 | field_name '.' '[' push field_list pop ']' 425 { $$ = new ExpressionNode( build_fieldSel( $ 1, build_tuple( $5) ) ); }424 { $$ = new ExpressionNode( build_fieldSel( $5, build_varref( $1 ) ) ); } 426 425 | field_name ARROW field 427 { $$ = new ExpressionNode( build_pfieldSel( $ 1, maybeMoveBuild<Expression>( $3) ) ); }426 { $$ = new ExpressionNode( build_pfieldSel( $3, build_varref( $1 ) ) ); } 428 427 | field_name ARROW '[' push field_list pop ']' 429 { $$ = new ExpressionNode( build_pfieldSel( $ 1, build_tuple( $5) ) ); }428 { $$ = new ExpressionNode( build_pfieldSel( $5, build_varref( $1 ) ) ); } 430 429 ; 431 430 432 431 field_name: 433 432 no_attr_identifier 434 { $$ = new ExpressionNode( build_varref( $1 ) ); }435 433 // x.1, x.[0, 0.0] 436 434 | INTEGERconstant 437 { $$ = new ExpressionNode( build_constantInteger( *$1 ) ); }438 435 ; 439 436 -
src/ResolvExpr/Alternative.cc
ra1e67dd rfe7b281 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() : cost( Cost::zero ), cvtCost( Cost::zero ),expr( 0 ) {}22 Alternative::Alternative() : 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;52 37 return *this; 53 38 } … … 69 54 expr->print( os, indent ); 70 55 os << "(types:" << std::endl; 71 os << std::string( indent+4, ' ' ); 72 expr->get_result()->print( os, indent + 4 ); 73 os << std::endl << ")" << std::endl; 56 printAll( expr->get_results(), os, indent + 4 ); 57 os << ")" << std::endl; 74 58 } else { 75 59 os << "Null expression!" << std::endl; -
src/ResolvExpr/Alternative.h
ra1e67dd rfe7b281 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 );36 34 ~Alternative(); 37 35 38 36 void initialize( const Alternative &src, Alternative &dest ); 39 37 40 38 void print( std::ostream &os, int indent = 0 ) const; 41 39 42 40 Cost cost; 43 41 Cost cvtCost; -
src/ResolvExpr/AlternativeFinder.cc
ra1e67dd rfe7b281 38 38 #include "SynTree/TypeSubstitution.h" 39 39 #include "SymTab/Validate.h" 40 #include "Tuples/Tuples.h" 40 #include "Tuples/TupleAssignment.h" 41 #include "Tuples/NameMatcher.h" 41 42 #include "Common/utility.h" 42 43 #include "InitTweak/InitTweak.h" … … 63 64 } 64 65 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 73 66 namespace { 74 67 void printAlts( const AltList &list, std::ostream &os, int indent = 0 ) { … … 83 76 out.push_back( i->expr->clone() ); 84 77 } 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; 85 86 } 86 87 … … 100 101 PruneStruct current( candidate ); 101 102 std::string mangleName; 102 {103 Type * newType = candidate->expr->get_result()->clone();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(); 104 105 candidate->env.apply( newType ); 105 mangleName = SymTab::Mangler::mangle( newType );106 mangleName += SymTab::Mangler::mangle( newType ); 106 107 delete newType; 107 108 } … … 132 133 if ( ! target->second.isAmbiguous ) { 133 134 Alternative &alt = *target->second.candidate; 134 alt.env.applyFree( alt.expr->get_result() ); 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 } 135 138 *out++ = alt; 136 139 } 137 140 } 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 cost 149 Cost minCost = Cost::infinity; 150 for ( AltList::iterator i = begin; i != end; ++i ) { 151 if ( i->cost < minCost ) { 152 minCost = i->cost; 153 i->cost = i->cvtCost; 154 alternatives.clear(); 155 alternatives.push_back( *i ); 156 } else if ( i->cost == minCost ) { 157 i->cost = i->cvtCost; 158 alternatives.push_back( *i ); 159 } 160 } 161 std::copy( alternatives.begin(), alternatives.end(), out ); 162 } 163 164 template< typename InputIterator > 165 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) { 166 while ( begin != end ) { 167 result.simpleCombine( (*begin++).env ); 168 } 138 169 } 139 170 140 171 void renameTypes( Expression *expr ) { 141 expr->get_result()->accept( global_renamer ); 172 for ( std::list< Type* >::iterator i = expr->get_results().begin(); i != expr->get_results().end(); ++i ) { 173 (*i)->accept( global_renamer ); 174 } 142 175 } 143 176 } … … 171 204 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) { 172 205 if ( adjust ) { 173 adjustExprType ( i->expr->get_result(), i->env, indexer );206 adjustExprTypeList( i->expr->get_results().begin(), i->expr->get_results().end(), i->env, indexer ); 174 207 } 175 208 } … … 208 241 209 242 template< typename StructOrUnionType > 210 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 211 212 // by this point, member must be a name expr 213 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member ); 214 const std::string & name = nameExpr->get_name(); 243 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ) { 215 244 std::list< Declaration* > members; 216 245 aggInst->lookup( name, members ); … … 225 254 } 226 255 227 void AlternativeFinder::addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {228 if ( ConstantExpr * constantExpr = dynamic_cast< ConstantExpr * >( member ) ) {229 // get the value of the constant expression as an int, must be between 0 and the length of the tuple type to have meaning230 // xxx - this should be improved by memoizing the value of constant exprs231 // during parsing and reusing that information here.232 std::stringstream ss( constantExpr->get_constant()->get_value() );233 int val;234 std::string tmp;235 if ( ss >> val && ! (ss >> tmp) ) {236 if ( val >= 0 && (unsigned int)val < tupleType->size() ) {237 alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) );238 } // if239 } // if240 } // if241 }242 243 256 void AlternativeFinder::visit( ApplicationExpr *applicationExpr ) { 244 257 alternatives.push_back( Alternative( applicationExpr->clone(), env, Cost::zero ) ); … … 246 259 247 260 Cost computeConversionCost( Alternative &alt, const SymTab::Indexer &indexer ) { 248 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( alt.expr ); 249 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 250 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 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 ); 251 267 252 268 Cost convCost( 0, 0, 0 ); … … 254 270 std::list< DeclarationWithType* >::iterator formal = formals.begin(); 255 271 std::list< Expression* >& actuals = appExpr->get_args(); 256 257 std::list< Type * > formalTypes;258 std::list< Type * >::iterator formalType = formalTypes.end();259 260 272 for ( std::list< Expression* >::iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) { 261 262 273 PRINT( 263 274 std::cerr << "actual expression:" << std::endl; 264 275 (*actualExpr)->print( std::cerr, 8 ); 265 276 std::cerr << "--- results are" << std::endl; 266 (*actualExpr)->get_result()->print(std::cerr, 8 );277 printAll( (*actualExpr)->get_results(), std::cerr, 8 ); 267 278 ) 268 279 std::list< DeclarationWithType* >::iterator startFormal = formal; 269 280 Cost actualCost; 270 std::list< Type * > flatActualTypes; 271 flatten( (*actualExpr)->get_result(), back_inserter( flatActualTypes ) ); 272 for ( std::list< Type* >::iterator actualType = flatActualTypes.begin(); actualType != flatActualTypes.end(); ++actualType ) { 273 274 275 // tuple handling code 276 if ( formalType == formalTypes.end() ) { 277 // the type of the formal parameter may be a tuple type. To make this easier to work with, 278 // flatten the tuple type and traverse the resulting list of types, incrementing the formal 279 // iterator once its types have been extracted. Once a particular formal parameter's type has 280 // been exhausted load the next formal parameter's type. 281 if ( formal == formals.end() ) { 282 if ( function->get_isVarArgs() ) { 283 convCost += Cost( 1, 0, 0 ); 284 break; 285 } else { 286 return Cost::infinity; 287 } 281 for ( std::list< Type* >::iterator actual = (*actualExpr)->get_results().begin(); actual != (*actualExpr)->get_results().end(); ++actual ) { 282 if ( formal == formals.end() ) { 283 if ( function->get_isVarArgs() ) { 284 convCost += Cost( 1, 0, 0 ); 285 break; 286 } else { 287 return Cost::infinity; 288 288 } 289 formalTypes.clear();290 flatten( (*formal)->get_type(), back_inserter( formalTypes ) );291 formalType = formalTypes.begin();292 ++formal;293 289 } 294 295 290 PRINT( 296 291 std::cerr << std::endl << "converting "; 297 (*actual Type)->print( std::cerr, 8 );292 (*actual)->print( std::cerr, 8 ); 298 293 std::cerr << std::endl << " to "; 299 294 (*formal)->get_type()->print( std::cerr, 8 ); 300 295 ) 301 Cost newCost = conversionCost( *actual Type, *formalType, indexer, alt.env );296 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env ); 302 297 PRINT( 303 298 std::cerr << std::endl << "cost is" << newCost << std::endl; … … 310 305 actualCost += newCost; 311 306 312 convCost += Cost( 0, polyCost( *formalType, alt.env, indexer ) + polyCost( *actualType, alt.env, indexer ), 0 );313 314 formal Type++;307 convCost += Cost( 0, polyCost( (*formal)->get_type(), alt.env, indexer ) + polyCost( *actual, alt.env, indexer ), 0 ); 308 309 formal++; 315 310 } 316 311 if ( actualCost != Cost( 0, 0, 0 ) ) { … … 361 356 /// Adds type variables to the open variable set and marks their assertions 362 357 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ) { 363 for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {358 for ( std::list< TypeDecl* >::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) { 364 359 unifiableVars[ (*tyvar)->get_name() ] = (*tyvar)->get_kind(); 365 360 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) { … … 370 365 } 371 366 372 /// instantiate a single argument by matching actuals from [actualIt, actualEnd) against formalType, 373 /// producing expression(s) in out and their total cost in cost. 374 template< typename AltIterator, typename OutputIterator > 375 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 ) { 376 if ( TupleType * tupleType = dynamic_cast< TupleType * >( formalType ) ) { 377 // formalType is a TupleType - group actuals into a TupleExpr whose type unifies with the TupleType 378 TupleExpr * tupleExpr = new TupleExpr(); 379 for ( Type * type : *tupleType ) { 380 if ( ! instantiateArgument( type, defaultValue, actualIt, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( tupleExpr->get_exprs() ) ) ) { 381 delete tupleExpr; 382 return false; 383 } 384 } 385 tupleExpr->set_result( Tuples::makeTupleType( tupleExpr->get_exprs() ) ); 386 *out++ = tupleExpr; 387 } else if ( actualIt != actualEnd ) { 388 // both actualType and formalType are atomic (non-tuple) types - if they unify 389 // then accept actual as an argument, otherwise return false (fail to instantiate argument) 390 Expression * actual = actualIt->expr; 391 Type * actualType = actual->get_result(); 392 PRINT( 393 std::cerr << "formal type is "; 394 formalType->print( std::cerr ); 395 std::cerr << std::endl << "actual type is "; 396 actualType->print( std::cerr ); 397 std::cerr << std::endl; 398 ) 399 if ( ! unify( formalType, actualType, resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 400 return false; 401 } 402 // move the expression from the alternative to the output iterator 403 *out++ = actual; 404 actualIt->expr = nullptr; 405 cost += actualIt->cost; 406 ++actualIt; 407 } else { 408 // End of actuals - Handle default values 409 if ( SingleInit *si = dynamic_cast<SingleInit *>( defaultValue )) { 410 // so far, only constant expressions are accepted as default values 411 if ( ConstantExpr *cnstexpr = dynamic_cast<ConstantExpr *>( si->get_value()) ) { 412 if ( Constant *cnst = dynamic_cast<Constant *>( cnstexpr->get_constant() ) ) { 413 if ( unify( formalType, cnst->get_type(), resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 414 // xxx - Don't know if this is right 415 *out++ = cnstexpr->clone(); 416 return true; 417 } // if 418 } // if 419 } // if 420 } // if 421 return false; 422 } // if 423 return true; 424 } 425 426 bool AlternativeFinder::instantiateFunction( std::list< DeclarationWithType* >& formals, const AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave, AltList & out ) { 367 bool AlternativeFinder::instantiateFunction( std::list< DeclarationWithType* >& formals, /*const*/ AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave ) { 427 368 simpleCombineEnvironments( actuals.begin(), actuals.end(), resultEnv ); 428 369 // make sure we don't widen any existing bindings … … 432 373 resultEnv.extractOpenVars( openVars ); 433 374 434 // flatten actuals so that each actual has an atomic (non-tuple) type 435 AltList exploded; 436 Tuples::explode( actuals, back_inserter( exploded ) ); 437 438 AltList::iterator actualExpr = exploded.begin(); 439 AltList::iterator actualEnd = exploded.end(); 440 for ( DeclarationWithType * formal : formals ) { 441 // match flattened actuals with formal parameters - actuals will be grouped to match 442 // with formals as appropriate 443 Cost cost; 444 std::list< Expression * > newExprs; 445 ObjectDecl * obj = safe_dynamic_cast< ObjectDecl * >( formal ); 446 if ( ! instantiateArgument( obj->get_type(), obj->get_init(), actualExpr, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( newExprs ) ) ) { 447 deleteAll( newExprs ); 448 return false; 449 } 450 // success - produce argument as a new alternative 451 assert( newExprs.size() == 1 ); 452 out.push_back( Alternative( newExprs.front(), resultEnv, cost ) ); 453 } 454 if ( actualExpr != actualEnd ) { 455 // there are still actuals remaining, but we've run out of formal parameters to match against 456 // this is okay only if the function is variadic 457 if ( ! isVarArgs ) { 458 return false; 459 } 460 out.splice( out.end(), exploded, actualExpr, actualEnd ); 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; 461 416 } 462 417 return true; … … 545 500 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 546 501 Expression *varExpr = new VariableExpr( candDecl ); 547 delete varExpr->get_result(); 548 varExpr->set_result( adjType->clone() ); 502 deleteAll( varExpr->get_results() ); 503 varExpr->get_results().clear(); 504 varExpr->get_results().push_front( adjType->clone() ); 549 505 PRINT( 550 506 std::cerr << "satisfying assertion " << curDecl->get_uniqueId() << " "; … … 589 545 590 546 template< typename OutputIterator > 591 void AlternativeFinder::makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, constAltList &actualAlt, OutputIterator out ) {547 void AlternativeFinder::makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, AltList &actualAlt, OutputIterator out ) { 592 548 OpenVarSet openVars; 593 549 AssertionSet resultNeed, resultHave; 594 550 TypeEnvironment resultEnv; 595 551 makeUnifiableVars( funcType, openVars, resultNeed ); 596 AltList instantiatedActuals; // filled by instantiate function 597 if ( instantiateFunction( funcType->get_parameters(), actualAlt, funcType->get_isVarArgs(), openVars, resultEnv, resultNeed, resultHave, instantiatedActuals ) ) { 552 if ( instantiateFunction( funcType->get_parameters(), actualAlt, funcType->get_isVarArgs(), openVars, resultEnv, resultNeed, resultHave ) ) { 598 553 ApplicationExpr *appExpr = new ApplicationExpr( func.expr->clone() ); 599 Alternative newAlt( appExpr, resultEnv, sumCost( instantiatedActuals) );600 makeExprList( instantiatedActuals, appExpr->get_args() );554 Alternative newAlt( appExpr, resultEnv, sumCost( actualAlt ) ); 555 makeExprList( actualAlt, appExpr->get_args() ); 601 556 PRINT( 602 557 std::cerr << "need assertions:" << std::endl; … … 619 574 PointerType pt( Type::Qualifiers(), v.clone() ); 620 575 UntypedExpr *vexpr = untypedExpr->clone(); 621 vexpr-> set_result( pt.clone() );576 vexpr->get_results().push_front( pt.clone() ); 622 577 alternatives.push_back( Alternative( vexpr, env, Cost()) ); 623 578 return; … … 632 587 combos( argAlternatives.begin(), argAlternatives.end(), back_inserter( possibilities ) ); 633 588 634 // take care of possible tuple assignments 635 // if not tuple assignment, assignment is taken care of as a normal function call 636 Tuples::handleTupleAssignment( *this, untypedExpr, possibilities ); 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 ... 637 594 638 595 AltList candidates; … … 647 604 // check if the type is pointer to function 648 605 PointerType *pointer; 649 if ( ( pointer = dynamic_cast< PointerType* >( func->expr->get_result() ) ) ) {606 if ( func->expr->get_results().size() == 1 && ( pointer = dynamic_cast< PointerType* >( func->expr->get_results().front() ) ) ) { 650 607 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 651 608 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 683 640 // check if the type is pointer to function 684 641 PointerType *pointer; 685 if ( ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_result() ) ) ) { 642 if ( funcOp->expr->get_results().size() == 1 643 && ( pointer = dynamic_cast< PointerType* >( funcOp->expr->get_results().front() ) ) ) { 686 644 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 687 645 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 707 665 708 666 PRINT( 709 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( withFunc->expr ); 710 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 711 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 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 ); 712 673 std::cerr << "Case +++++++++++++" << std::endl; 713 674 std::cerr << "formals are:" << std::endl; … … 731 692 732 693 bool isLvalue( Expression *expr ) { 733 // xxx - recurse into tuples? 734 return expr->has_result() && expr->get_result()->get_isLvalue(); 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; 735 698 } 736 699 … … 746 709 747 710 void AlternativeFinder::visit( CastExpr *castExpr ) { 748 Type *& toType = castExpr->get_result(); 749 toType = resolveTypeof( toType, indexer ); 750 SymTab::validateType( toType, &indexer ); 751 adjustExprType( toType, env, indexer ); 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 752 716 753 717 AlternativeFinder finder( indexer, env ); … … 763 727 // that are cast directly. The candidate is invalid if it has fewer results than there are types to cast 764 728 // to. 765 int discardedValues = (*i).expr->get_result ()->size() - castExpr->get_result()->size();729 int discardedValues = (*i).expr->get_results().size() - castExpr->get_results().size(); 766 730 if ( discardedValues < 0 ) continue; 767 // xxx - may need to go into tuple types and extract relavent types and use unifyList 731 std::list< Type* >::iterator candidate_end = (*i).expr->get_results().begin(); 732 std::advance( candidate_end, castExpr->get_results().size() ); 768 733 // unification run for side-effects 769 unify( castExpr->get_result(), (*i).expr->get_result(), i->env, needAssertions, haveAssertions, openVars, indexer ); 770 Cost thisCost = castCost( (*i).expr->get_result(), castExpr->get_result(), indexer, i->env ); 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 ); 771 740 if ( thisCost != Cost::infinity ) { 772 741 // count one safe conversion for each value that is thrown away … … 791 760 792 761 for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) { 793 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() )) {794 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );795 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) {796 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );797 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( agg->expr->get_result() ) ) {798 addTupleMembers( tupleType, agg->expr, agg->cost, agg->env, memberExpr->get_member() );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 799 768 } // if 800 769 } // for … … 822 791 renameTypes( alternatives.back().expr ); 823 792 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { 824 NameExpr nameExpr( "" ); 825 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 793 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 826 794 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) { 827 NameExpr nameExpr( "" ); 828 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 795 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 829 796 } // if 830 797 } // for … … 927 894 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) ); 928 895 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 929 alternatives.back().expr-> set_result( (*i)->get_type()->clone() );896 alternatives.back().expr->get_results().push_back( (*i)->get_type()->clone() ); 930 897 } // for 931 898 } // if … … 950 917 finder.find( attrExpr->get_expr() ); 951 918 for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) { 952 if ( choice->expr->get_result ()->size() == 1 ) {953 resolveAttr(*i, function, choice->expr->get_result (), choice->env );919 if ( choice->expr->get_results().size() == 1 ) { 920 resolveAttr(*i, function, choice->expr->get_results().front(), choice->env ); 954 921 } // fi 955 922 } // for … … 993 960 AssertionSet needAssertions, haveAssertions; 994 961 Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost ); 995 Type* commonType;996 if ( unify ( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType) ) {962 std::list< Type* > commonTypes; 963 if ( unifyList( 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 ) ) { 997 964 ConditionalExpr *newExpr = new ConditionalExpr( first->expr->clone(), second->expr->clone(), third->expr->clone() ); 998 newExpr->set_result( commonType ? commonType : second->expr->get_result()->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 999 974 newAlt.expr = newExpr; 1000 975 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) ); … … 1024 999 TupleExpr *newExpr = new TupleExpr; 1025 1000 makeExprList( *i, newExpr->get_exprs() ); 1026 newExpr->set_result( Tuples::makeTupleType( 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 1027 1006 1028 1007 TypeEnvironment compositeEnv; … … 1045 1024 } 1046 1025 } 1047 1048 void AlternativeFinder::visit( TupleIndexExpr *tupleExpr ) {1049 alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );1050 }1051 1052 void AlternativeFinder::visit( TupleAssignExpr *tupleAssignExpr ) {1053 alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) );1054 }1055 1056 void AlternativeFinder::visit( UniqueExpr *unqExpr ) {1057 AlternativeFinder finder( indexer, env );1058 finder.findWithAdjustment( unqExpr->get_expr() );1059 for ( Alternative & alt : finder.alternatives ) {1060 // xxx - it's possible that this won't always do the right thing, i.e. two UniqueExprs1061 // with the same ID may resolve to different expressions. If this ever happens, it might be necessary1062 // to try to select an alternative here (i.e. error is there is not a unique min-cost expression).1063 // One other thought is to to resolve each ID once and map the IDs to resolved expressions,1064 // but this isn't as simple as it sounds since the alternative is not selected here, meaning it might1065 // require complicated tracking throughout the system.1066 1067 // brand the new UniqueExprs with the same id so that they are recognized as the same expression by the expansion pass1068 alternatives.push_back( Alternative( new UniqueExpr( alt.expr->clone(), unqExpr->get_id() ), env, Cost::zero ) );1069 }1070 }1071 1072 1026 } // namespace ResolvExpr 1073 1027 -
src/ResolvExpr/AlternativeFinder.h
ra1e67dd rfe7b281 67 67 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ); 68 68 virtual void visit( ConstructorExpr * ctorExpr ); 69 virtual void visit( TupleIndexExpr *tupleExpr ); 70 virtual void visit( TupleAssignExpr *tupleExpr ); 71 virtual void visit( UniqueExpr *unqExpr ); 72 /// Runs a new alternative finder on each element in [begin, end) 73 /// and writes each alternative finder to out. 69 public: // xxx - temporary hack - should make Tuples::TupleAssignment a friend 74 70 template< typename InputIterator, typename OutputIterator > 75 71 void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out ); 76 72 73 private: 77 74 /// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member 78 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); 79 /// Adds alternatives for member expressions where the left side has tuple type 80 void addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ); 75 template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, const std::string &name ); 81 76 /// Adds alternatives for offsetof expressions, given the base type and name of the member 82 77 template< typename StructOrUnionType > void addOffsetof( StructOrUnionType *aggInst, const std::string &name ); 83 bool instantiateFunction( std::list< DeclarationWithType* >& formals, const AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave, AltList & out);78 bool instantiateFunction( std::list< DeclarationWithType* >& formals, /*const*/ AltList &actuals, bool isVarArgs, OpenVarSet& openVars, TypeEnvironment &resultEnv, AssertionSet &resultNeed, AssertionSet &resultHave ); 84 79 template< typename OutputIterator > 85 void makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, constAltList &actualAlt, OutputIterator out );80 void makeFunctionAlternatives( const Alternative &func, FunctionType *funcType, AltList &actualAlt, OutputIterator out ); 86 81 template< typename OutputIterator > 87 82 void inferParameters( const AssertionSet &need, AssertionSet &have, const Alternative &newAlt, OpenVarSet &openVars, OutputIterator out ); … … 94 89 95 90 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ); 96 97 template< typename InputIterator, typename OutputIterator >98 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {99 AltList alternatives;100 101 // select the alternatives that have the minimum parameter cost102 Cost minCost = Cost::infinity;103 for ( InputIterator i = begin; i != end; ++i ) {104 if ( i->cost < minCost ) {105 minCost = i->cost;106 i->cost = i->cvtCost;107 alternatives.clear();108 alternatives.push_back( *i );109 } else if ( i->cost == minCost ) {110 i->cost = i->cvtCost;111 alternatives.push_back( *i );112 }113 }114 std::copy( alternatives.begin(), alternatives.end(), out );115 }116 117 Cost sumCost( const AltList &in );118 119 template< typename InputIterator >120 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {121 while ( begin != end ) {122 result.simpleCombine( (*begin++).env );123 }124 }125 91 } // namespace ResolvExpr 126 92 -
src/ResolvExpr/AlternativePrinter.cc
ra1e67dd rfe7b281 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 i->expr->get_result()->print(os );35 printAll( i->expr->get_results(), os ); 36 36 // i->print( os ); 37 37 os << std::endl; -
src/ResolvExpr/ConversionCost.cc
ra1e67dd rfe7b281 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() && destIt != destAsTuple->get_types().end()) {242 while ( srcIt != tupleType->get_types().end() ) { 243 243 Cost newCost = conversionCost( *srcIt++, *destIt++, indexer, env ); 244 244 if ( newCost == Cost::infinity ) { -
src/ResolvExpr/FindOpenVars.cc
ra1e67dd rfe7b281 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 ( Type::ForallList::const_iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {49 for ( std::list< TypeDecl* >::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 ( Type::ForallList::const_iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {58 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 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 ( Type::ForallList::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {127 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 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->has_result() && ! newExpr->get_result()->isVoid() ); 61 Type *newType = newExpr->get_result(); 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 62 69 delete typeofType; 63 70 return newType; -
src/ResolvExpr/Resolver.cc
ra1e67dd rfe7b281 19 19 #include "RenameVars.h" 20 20 #include "ResolveTypeof.h" 21 #include "typeops.h"22 21 #include "SynTree/Statement.h" 23 22 #include "SynTree/Type.h" … … 38 37 39 38 virtual void visit( FunctionDecl *functionDecl ); 40 virtual void visit( ObjectDecl * objectDecl );39 virtual void visit( ObjectDecl *functionDecl ); 41 40 virtual void visit( TypeDecl *typeDecl ); 42 41 virtual void visit( EnumDecl * enumDecl ); … … 68 67 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 69 68 void fallbackInit( ConstructorInit * ctorInit ); 70 Type *functionReturn;69 std::list< Type * > functionReturn; 71 70 Type *initContext; 72 71 Type *switchType; … … 158 157 const TypeEnvironment *newEnv = 0; 159 158 for ( AltList::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 160 if ( i->expr->get_result ()->size() == 1 && isIntegralType( i->expr->get_result() ) ) {159 if ( i->expr->get_results().size() == 1 && isIntegralType( i->expr->get_results().front() ) ) { 161 160 if ( newExpr ) { 162 161 throw SemanticError( "Too many interpretations for case control expression", untyped ); … … 235 234 Type *new_type = resolveTypeof( functionDecl->get_type(), *this ); 236 235 functionDecl->set_type( new_type ); 237 ValueGuard< Type * > oldFunctionReturn( functionReturn ); 238 functionReturn = ResolvExpr::extractResultType( functionDecl->get_functionType() ); 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 239 241 SymTab::Indexer::visit( functionDecl ); 242 functionReturn = oldFunctionReturn; 240 243 } 241 244 … … 335 338 void Resolver::visit( ReturnStmt *returnStmt ) { 336 339 if ( returnStmt->get_expr() ) { 337 CastExpr *castExpr = new CastExpr( returnStmt->get_expr(), functionReturn->clone() ); 340 CastExpr *castExpr = new CastExpr( returnStmt->get_expr() ); 341 cloneAll( functionReturn, castExpr->get_results() ); 338 342 Expression *newExpr = findSingleExpression( castExpr, *this ); 339 343 delete castExpr; … … 380 384 if ( isCharType( at->get_base() ) ) { 381 385 // check if the resolved type is char * 382 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result () ) ) {386 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_results().front() ) ) { 383 387 if ( isCharType( pt->get_base() ) ) { 384 388 // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello"; … … 442 446 (*iter)->accept( *this ); 443 447 } // 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 }450 448 } else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) { 451 449 resolveAggrInit( st->get_baseStruct(), iter, end ); -
src/ResolvExpr/TypeEnvironment.cc
ra1e67dd rfe7b281 158 158 } 159 159 160 void TypeEnvironment::add( const Type::ForallList&tyDecls ) {161 for ( Type::ForallList::const_iterator i = tyDecls.begin(); i != tyDecls.end(); ++i ) {160 void TypeEnvironment::add( const std::list< TypeDecl* > &tyDecls ) { 161 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 55 55 bool lookup( const std::string &var, EqvClass &eqvClass ) const; 56 56 void add( const EqvClass &eqvClass ); 57 void add( const Type::ForallList&tyDecls );57 void add( const std::list< TypeDecl* > &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
ra1e67dd rfe7b281 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 } // for611 return tupleType;612 }613 }614 600 } // namespace ResolvExpr 615 601 -
src/ResolvExpr/typeops.h
ra1e67dd rfe7b281 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 149 146 // in CommonType.cc 150 147 Type *commonType( Type *type1, Type *type2, bool widenFirst, bool widenSecond, const SymTab::Indexer &indexer, TypeEnvironment &env, const OpenVarSet &openVars ); … … 155 152 // in Occurs.cc 156 153 bool occurs( Type *type, std::string varName, const TypeEnvironment &env ); 157 158 // flatten tuple type into list of types159 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 }169 154 } // namespace ResolvExpr 170 155 -
src/SymTab/Autogen.cc
ra1e67dd rfe7b281 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_result();118 Type *& assignVarExprType = assignVarExpr->get_results().front(); 119 119 assignVarExprType = new PointerType( Type::Qualifiers(), assignVarExprType ); 120 assignVarExpr->set_result( assignVarExprType );121 120 ApplicationExpr * assignExpr = new ApplicationExpr( assignVarExpr ); 122 121 assignExpr->get_args().push_back( new VariableExpr( dstParam ) ); -
src/SymTab/Indexer.cc
ra1e67dd rfe7b281 40 40 41 41 namespace SymTab { 42 template< typename TreeType, typename VisitorType >43 inline void accept NewScope( TreeType *tree, VisitorType &visitor ) {42 template< typename Container, typename VisitorType > 43 inline void acceptAllNewScope( Container &container, VisitorType &visitor ) { 44 44 visitor.enterScope(); 45 maybeAccept( tree, visitor );45 acceptAll( container, 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 * > ¶ms = 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 NewScope( applicationExpr->get_result(), *this );339 acceptAllNewScope( applicationExpr->get_results(), *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 NewScope( untypedExpr->get_result(), *this );345 acceptAllNewScope( untypedExpr->get_results(), *this ); 346 346 acceptAll( untypedExpr->get_args(), *this ); 347 347 } 348 348 349 349 void Indexer::visit( NameExpr *nameExpr ) { 350 accept NewScope( nameExpr->get_result(), *this );350 acceptAllNewScope( nameExpr->get_results(), *this ); 351 351 } 352 352 353 353 void Indexer::visit( AddressExpr *addressExpr ) { 354 accept NewScope( addressExpr->get_result(), *this );354 acceptAllNewScope( addressExpr->get_results(), *this ); 355 355 maybeAccept( addressExpr->get_arg(), *this ); 356 356 } 357 357 358 358 void Indexer::visit( LabelAddressExpr *labAddressExpr ) { 359 accept NewScope( labAddressExpr->get_result(), *this );359 acceptAllNewScope( labAddressExpr->get_results(), *this ); 360 360 maybeAccept( labAddressExpr->get_arg(), *this ); 361 361 } 362 362 363 363 void Indexer::visit( CastExpr *castExpr ) { 364 accept NewScope( castExpr->get_result(), *this );364 acceptAllNewScope( castExpr->get_results(), *this ); 365 365 maybeAccept( castExpr->get_arg(), *this ); 366 366 } 367 367 368 368 void Indexer::visit( UntypedMemberExpr *memberExpr ) { 369 accept NewScope( memberExpr->get_result(), *this );369 acceptAllNewScope( memberExpr->get_results(), *this ); 370 370 maybeAccept( memberExpr->get_aggregate(), *this ); 371 371 } 372 372 373 373 void Indexer::visit( MemberExpr *memberExpr ) { 374 accept NewScope( memberExpr->get_result(), *this );374 acceptAllNewScope( memberExpr->get_results(), *this ); 375 375 maybeAccept( memberExpr->get_aggregate(), *this ); 376 376 } 377 377 378 378 void Indexer::visit( VariableExpr *variableExpr ) { 379 accept NewScope( variableExpr->get_result(), *this );379 acceptAllNewScope( variableExpr->get_results(), *this ); 380 380 } 381 381 382 382 void Indexer::visit( ConstantExpr *constantExpr ) { 383 accept NewScope( constantExpr->get_result(), *this );383 acceptAllNewScope( constantExpr->get_results(), *this ); 384 384 maybeAccept( constantExpr->get_constant(), *this ); 385 385 } 386 386 387 387 void Indexer::visit( SizeofExpr *sizeofExpr ) { 388 accept NewScope( sizeofExpr->get_result(), *this );388 acceptAllNewScope( sizeofExpr->get_results(), *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 NewScope( alignofExpr->get_result(), *this );397 acceptAllNewScope( alignofExpr->get_results(), *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 NewScope( offsetofExpr->get_result(), *this );406 acceptAllNewScope( offsetofExpr->get_results(), *this ); 407 407 maybeAccept( offsetofExpr->get_type(), *this ); 408 408 } 409 409 410 410 void Indexer::visit( OffsetofExpr *offsetofExpr ) { 411 accept NewScope( offsetofExpr->get_result(), *this );411 acceptAllNewScope( offsetofExpr->get_results(), *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 NewScope( offsetPackExpr->get_result(), *this );417 acceptAllNewScope( offsetPackExpr->get_results(), *this ); 418 418 maybeAccept( offsetPackExpr->get_type(), *this ); 419 419 } 420 420 421 421 void Indexer::visit( AttrExpr *attrExpr ) { 422 accept NewScope( attrExpr->get_result(), *this );422 acceptAllNewScope( attrExpr->get_results(), *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 NewScope( logicalExpr->get_result(), *this );431 acceptAllNewScope( logicalExpr->get_results(), *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 NewScope( conditionalExpr->get_result(), *this );437 acceptAllNewScope( conditionalExpr->get_results(), *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 NewScope( commaExpr->get_result(), *this );444 acceptAllNewScope( commaExpr->get_results(), *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 NewScope( tupleExpr->get_result(), *this );450 acceptAllNewScope( tupleExpr->get_results(), *this ); 451 451 acceptAll( tupleExpr->get_exprs(), *this ); 452 452 } 453 453 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(); 454 void Indexer::visit( SolvedTupleExpr *tupleExpr ) { 455 acceptAllNewScope( tupleExpr->get_results(), *this ); 456 acceptAll( tupleExpr->get_exprs(), *this ); 460 457 } 461 458 462 459 void Indexer::visit( TypeExpr *typeExpr ) { 463 accept NewScope( typeExpr->get_result(), *this );460 acceptAllNewScope( typeExpr->get_results(), *this ); 464 461 maybeAccept( typeExpr->get_type(), *this ); 465 462 } … … 472 469 473 470 void Indexer::visit( UntypedValofExpr *valofExpr ) { 474 accept NewScope( valofExpr->get_result(), *this );471 acceptAllNewScope( valofExpr->get_results(), *this ); 475 472 maybeAccept( valofExpr->get_body(), *this ); 476 473 } -
src/SymTab/Indexer.h
ra1e67dd rfe7b281 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 ); 66 68 virtual void visit( TypeExpr *typeExpr ); 67 69 virtual void visit( AsmExpr *asmExpr ); 68 70 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
ra1e67dd rfe7b281 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 ( Type::ForallList::iterator i = type->get_forall().begin(); i != type->get_forall().end(); ++i ) {260 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 23 23 // - All enumeration constants have type EnumInstType. 24 24 // 25 // - The type "void" never occurs in lists of function parameter or return types . A function26 // taking no arguments has no argument types .25 // - The type "void" never occurs in lists of function parameter or return types; neither do tuple types. A function 26 // taking no arguments has no argument types, and tuples are flattened. 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 ( Type::ForallList::iterator type = func->get_forall().begin(); type != func->get_forall().end(); ++type ) {431 for ( std::list< TypeDecl * >::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
ra1e67dd rfe7b281 19 19 20 20 AddressExpr::AddressExpr( Expression *arg, Expression *_aname ) : Expression( _aname ), arg( arg ) { 21 if ( arg->has_result()) {22 set_result( new PointerType( Type::Qualifiers(), arg->get_result()->clone() ) );23 } 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 } // for 24 24 } 25 25 … … 35 35 if ( arg ) { 36 36 os << std::string( indent+2, ' ' ); 37 arg->print( os, indent+2 );37 arg->print( os, indent+2 ); 38 38 } // if 39 39 } -
src/SynTree/ApplicationExpr.cc
ra1e67dd rfe7b281 21 21 #include "TypeSubstitution.h" 22 22 #include "Common/utility.h" 23 #include "ResolvExpr/typeops.h" 23 24 24 25 25 ParamEntry::ParamEntry( const ParamEntry &other ) : … … 43 43 44 44 ApplicationExpr::ApplicationExpr( Expression *funcExpr ) : function( funcExpr ) { 45 PointerType *pointer = safe_dynamic_cast< PointerType* >( funcExpr->get_result() ); 46 FunctionType *function = safe_dynamic_cast< FunctionType* >( pointer->get_base() ); 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 ); 47 49 48 set_result( ResolvExpr::extractResultType( function ) );49 50 assert( has_result() );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 } // for 51 53 } 52 54 -
src/SynTree/CommaExpr.cc
ra1e67dd rfe7b281 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 set_result( maybeClone( arg2->get_result() ) ); 26 // get_type->set_isLvalue( false ); 25 cloneAll( arg2->get_results(), get_results() ); 26 // for ( Type *& type : get_results() ) { 27 // type->set_isLvalue( false ); 28 // } 27 29 } 28 30 -
src/SynTree/Expression.cc
ra1e67dd rfe7b281 31 31 32 32 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 ) { 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 ); 36 37 } 37 38 … … 39 40 delete env; 40 41 delete argName; // xxx -- there's a problem in cloning ConstantExpr I still don't know how to fix 41 delete result; 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 42 51 } 43 52 … … 59 68 60 69 ConstantExpr::ConstantExpr( Constant _c, Expression *_aname ) : Expression( _aname ), constant( _c ) { 61 set_result( constant.get_type()->clone() );70 add_result( constant.get_type()->clone() ); 62 71 } 63 72 … … 76 85 assert( var ); 77 86 assert( var->get_type() ); 78 Type * type = var->get_type()->clone(); 79 type->set_isLvalue( true ); 80 set_result( 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 81 91 } 82 92 … … 100 110 SizeofExpr::SizeofExpr( Expression *expr_, Expression *_aname ) : 101 111 Expression( _aname ), expr(expr_), type(0), isType(false) { 102 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );112 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 103 113 } 104 114 105 115 SizeofExpr::SizeofExpr( Type *type_, Expression *_aname ) : 106 116 Expression( _aname ), expr(0), type(type_), isType(true) { 107 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );117 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 108 118 } 109 119 … … 131 141 AlignofExpr::AlignofExpr( Expression *expr_, Expression *_aname ) : 132 142 Expression( _aname ), expr(expr_), type(0), isType(false) { 133 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );143 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 134 144 } 135 145 136 146 AlignofExpr::AlignofExpr( Type *type_, Expression *_aname ) : 137 147 Expression( _aname ), expr(0), type(type_), isType(true) { 138 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );148 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 139 149 } 140 150 … … 162 172 UntypedOffsetofExpr::UntypedOffsetofExpr( Type *type_, const std::string &member_, Expression *_aname ) : 163 173 Expression( _aname ), type(type_), member(member_) { 164 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );174 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 165 175 } 166 176 … … 187 197 OffsetofExpr::OffsetofExpr( Type *type_, DeclarationWithType *member_, Expression *_aname ) : 188 198 Expression( _aname ), type(type_), member(member_) { 189 set_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );199 add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ); 190 200 } 191 201 … … 219 229 220 230 OffsetPackExpr::OffsetPackExpr( StructInstType *type_, Expression *aname_ ) : Expression( aname_ ), type( type_ ) { 221 set_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) );231 add_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) ); 222 232 } 223 233 … … 274 284 275 285 CastExpr::CastExpr( Expression *arg_, Type *toType, Expression *_aname ) : Expression( _aname ), arg(arg_) { 276 set_result(toType);286 add_result(toType); 277 287 } 278 288 279 289 CastExpr::CastExpr( Expression *arg_, Expression *_aname ) : Expression( _aname ), arg(arg_) { 280 set_result( new VoidType( Type::Qualifiers() ) );281 290 } 282 291 … … 294 303 arg->print(os, indent+2); 295 304 os << std::endl << std::string( indent, ' ' ) << "to:" << std::endl; 296 os << std::string( indent+2, ' ' ); 297 if ( result->isVoid() ) { 298 os << "nothing"; 305 if ( results.empty() ) { 306 os << std::string( indent+2, ' ' ) << "nothing" << std::endl; 299 307 } else { 300 result->print( os, indent+2);308 printAll(results, os, indent+2); 301 309 } // if 302 os << std::endl; 303 Expression::print( os, indent ); 304 } 305 306 UntypedMemberExpr::UntypedMemberExpr( Expression * _member, Expression *_aggregate, Expression *_aname ) : 310 Expression::print( os, indent ); 311 } 312 313 UntypedMemberExpr::UntypedMemberExpr( std::string _member, Expression *_aggregate, Expression *_aname ) : 307 314 Expression( _aname ), member(_member), aggregate(_aggregate) {} 308 315 309 316 UntypedMemberExpr::UntypedMemberExpr( const UntypedMemberExpr &other ) : 310 Expression( other ), member( maybeClone( other.member )), aggregate( maybeClone( other.aggregate ) ) {317 Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) { 311 318 } 312 319 313 320 UntypedMemberExpr::~UntypedMemberExpr() { 314 321 delete aggregate; 315 delete member;316 322 } 317 323 318 324 void UntypedMemberExpr::print( std::ostream &os, int indent ) const { 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, ' ' ); 325 os << "Untyped Member Expression, with field: " << get_member(); 323 326 324 327 Expression *agg = get_aggregate(); 325 os << " from aggregate: " << std::endl;328 os << ", from aggregate: "; 326 329 if (agg != 0) { 327 os << std::string( indent + 4, ' ' );328 agg->print(os, indent + 4);330 os << std::string( indent + 2, ' ' ); 331 agg->print(os, indent + 2); 329 332 } 330 333 os << std::string( indent+2, ' ' ); … … 335 338 MemberExpr::MemberExpr( DeclarationWithType *_member, Expression *_aggregate, Expression *_aname ) : 336 339 Expression( _aname ), member(_member), aggregate(_aggregate) { 337 set_result( member->get_type()->clone() ); 338 get_result()->set_isLvalue( true ); 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 339 344 } 340 345 … … 367 372 } 368 373 369 UntypedExpr::UntypedExpr( Expression *_function, const std::list<Expression *> &_args, Expression *_aname ) : 370 Expression( _aname ), function(_function), args(_args) {}374 375 UntypedExpr::UntypedExpr( Expression *_function, Expression *_aname ) : Expression( _aname ), function( _function ) {} 371 376 372 377 UntypedExpr::UntypedExpr( const UntypedExpr &other ) : … … 374 379 cloneAll( other.args, args ); 375 380 } 381 382 UntypedExpr::UntypedExpr( Expression *_function, std::list<Expression *> &_args, Expression *_aname ) : 383 Expression( _aname ), function(_function), args(_args) {} 376 384 377 385 UntypedExpr::~UntypedExpr() { … … 411 419 LogicalExpr::LogicalExpr( Expression *arg1_, Expression *arg2_, bool andp, Expression *_aname ) : 412 420 Expression( _aname ), arg1(arg1_), arg2(arg2_), isAnd(andp) { 413 set_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );421 add_result( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 414 422 } 415 423 … … 469 477 ImplicitCopyCtorExpr::ImplicitCopyCtorExpr( ApplicationExpr * callExpr ) : callExpr( callExpr ) { 470 478 assert( callExpr ); 471 assert( callExpr->has_result() ); 472 set_result( callExpr->get_result()->clone() ); 479 cloneAll( callExpr->get_results(), results ); 473 480 } 474 481 … … 503 510 Expression * arg = InitTweak::getCallArg( callExpr, 0 ); 504 511 assert( arg ); 505 set_result( maybeClone( arg->get_result() ));512 cloneAll( arg->get_results(), results ); 506 513 } 507 514 … … 523 530 524 531 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( 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() ) {} 532 add_result( type->clone() ); 533 } 534 535 CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {} 530 536 531 537 CompoundLiteralExpr::~CompoundLiteralExpr() { … … 536 542 void CompoundLiteralExpr::print( std::ostream &os, int indent ) const { 537 543 os << "Compound Literal Expression: " << std::endl; 538 os << std::string( indent+2, ' ' ); 539 type->print( os, indent + 2 ); 540 os << std::string( indent+2, ' ' ); 541 initializer->print( os, indent + 2 ); 544 if ( type ) type->print( os, indent + 2 ); 545 if ( initializer ) initializer->print( os, indent + 2 ); 542 546 } 543 547 … … 553 557 554 558 RangeExpr::RangeExpr( Expression *low, Expression *high ) : low( low ), high( high ) {} 555 RangeExpr::RangeExpr( const RangeExpr &other ) : Expression( other ),low( other.low->clone() ), high( other.high->clone() ) {}559 RangeExpr::RangeExpr( const RangeExpr &other ) : low( other.low->clone() ), high( other.high->clone() ) {} 556 560 void RangeExpr::print( std::ostream &os, int indent ) const { 557 os << "Range Expression: ";561 os << std::string( indent, ' ' ) << "Range Expression: "; 558 562 low->print( os, indent ); 559 563 os << " ... "; 560 564 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 long long UniqueExpr::count = 0;583 UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( new Expression* ), id( idVal ) {584 assert( count != -1 );585 if ( id == -1 ) id = count++;586 set_expr( expr );587 assert( expr );588 if ( expr->get_result() ) {589 set_result( expr->get_result()->clone() );590 }591 }592 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ), id( other.id ) {593 }594 UniqueExpr::~UniqueExpr() {595 if ( expr.unique() ) {596 delete *expr;597 }598 }599 void UniqueExpr::print( std::ostream &os, int indent ) const {600 os << "Unique Expression with id:" << id << std::endl << std::string( indent+2, ' ' );601 get_expr()->print( os, indent+2 );602 565 } 603 566 -
src/SynTree/Expression.h
ra1e67dd rfe7b281 32 32 virtual ~Expression(); 33 33 34 Type *& get_result() { return result; } 35 void set_result( Type *newValue ) { result = newValue; } 36 bool has_result() const { return result != nullptr; } 34 std::list<Type *>& get_results() { return results; } 35 void add_result( Type *t ); 37 36 38 37 TypeSubstitution *get_env() const { return env; } … … 48 47 virtual void print( std::ostream &os, int indent = 0 ) const; 49 48 protected: 50 Type * result;49 std::list<Type *> results; 51 50 TypeSubstitution *env; 52 51 Expression* argName; // if expression is used as an argument, it can be "designated" by this name … … 99 98 class UntypedExpr : public Expression { 100 99 public: 101 UntypedExpr( Expression *function, const std::list<Expression *> &args = std::list< Expression * >(),Expression *_aname = nullptr );100 UntypedExpr( Expression *function, Expression *_aname = nullptr ); 102 101 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( Expression *member, Expression *aggregate, Expression *_aname = nullptr );202 UntypedMemberExpr( std::string member, Expression *aggregate, Expression *_aname = nullptr ); 203 203 UntypedMemberExpr( const UntypedMemberExpr &other ); 204 204 virtual ~UntypedMemberExpr(); 205 205 206 Expression *get_member() const { return member; }207 void set_member( Expression *newValue ) { member = newValue; }206 std::string get_member() const { return member; } 207 void set_member( const std::string &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 Expression *member;216 std::string 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 on 504 class SolvedTupleExpr : public Expression { 505 public: 506 SolvedTupleExpr( Expression *_aname = nullptr ) : Expression( _aname ) {} 507 SolvedTupleExpr( std::list<Expression *> &, Expression *_aname = nullptr ); 508 SolvedTupleExpr( const SolvedTupleExpr &other ); 509 virtual ~SolvedTupleExpr() {} 510 511 std::list<Expression*> &get_exprs() { return exprs; } 512 513 virtual SolvedTupleExpr *clone() const { return new SolvedTupleExpr( *this ); } 514 virtual void accept( Visitor &v ) { v.visit( this ); } 515 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 516 virtual void print( std::ostream &os, int indent = 0 ) const; 517 private: 518 std::list<Expression*> exprs; 519 }; 520 485 521 /// TypeExpr represents a type used in an expression (e.g. as a type generator parameter) 486 522 class TypeExpr : public Expression { … … 582 618 CompoundLiteralExpr( Type * type, Initializer * initializer ); 583 619 CompoundLiteralExpr( const CompoundLiteralExpr &other ); 584 virtual~CompoundLiteralExpr();620 ~CompoundLiteralExpr(); 585 621 586 622 Type * get_type() const { return type; } … … 634 670 private: 635 671 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 analyzer657 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 analyzer678 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 expression699 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 tempDecls714 std::list< ObjectDecl * > tempDecls; // temporaries for address of lhs exprs715 };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, long long idVal = -1 );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 int get_id() const { return id; }745 746 virtual UniqueExpr *clone() const { return new UniqueExpr( *this ); }747 virtual void accept( Visitor &v ) { v.visit( this ); }748 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }749 virtual void print( std::ostream &os, int indent = 0 ) const;750 private:751 std::shared_ptr< Expression * > expr;752 int id;753 static long long count;754 672 }; 755 673 -
src/SynTree/Initializer.h
ra1e67dd rfe7b281 23 23 24 24 #include <cassert> 25 26 const std::list<Expression*> noDesignators;27 25 28 26 // Initializer: base class for object initializers (provide default values) -
src/SynTree/Mutator.cc
ra1e67dd rfe7b281 178 178 179 179 Expression *Mutator::mutate( ApplicationExpr *applicationExpr ) { 180 applicationExpr->set_result( maybeMutate( applicationExpr->get_result(), *this ));180 mutateAll( applicationExpr->get_results(), *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 untypedExpr->set_result( maybeMutate( untypedExpr->get_result(), *this ));187 mutateAll( untypedExpr->get_results(), *this ); 188 188 mutateAll( untypedExpr->get_args(), *this ); 189 189 return untypedExpr; … … 191 191 192 192 Expression *Mutator::mutate( NameExpr *nameExpr ) { 193 nameExpr->set_result( maybeMutate( nameExpr->get_result(), *this ));193 mutateAll( nameExpr->get_results(), *this ); 194 194 return nameExpr; 195 195 } 196 196 197 197 Expression *Mutator::mutate( AddressExpr *addressExpr ) { 198 addressExpr->set_result( maybeMutate( addressExpr->get_result(), *this ));198 mutateAll( addressExpr->get_results(), *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 labelAddressExpr->set_result( maybeMutate( labelAddressExpr->get_result(), *this ));204 mutateAll( labelAddressExpr->get_results(), *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 castExpr->set_result( maybeMutate( castExpr->get_result(), *this ));210 mutateAll( castExpr->get_results(), *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 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 ) ); 216 mutateAll( memberExpr->get_results(), *this ); 224 217 memberExpr->set_aggregate( maybeMutate( memberExpr->get_aggregate(), *this ) ); 225 218 return memberExpr; 226 219 } 227 220 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 228 227 Expression *Mutator::mutate( VariableExpr *variableExpr ) { 229 variableExpr->set_result( maybeMutate( variableExpr->get_result(), *this ));228 mutateAll( variableExpr->get_results(), *this ); 230 229 return variableExpr; 231 230 } 232 231 233 232 Expression *Mutator::mutate( ConstantExpr *constantExpr ) { 234 constantExpr->set_result( maybeMutate( constantExpr->get_result(), *this ));233 mutateAll( constantExpr->get_results(), *this ); 235 234 // maybeMutate( constantExpr->get_constant(), *this ) 236 235 return constantExpr; … … 238 237 239 238 Expression *Mutator::mutate( SizeofExpr *sizeofExpr ) { 240 sizeofExpr->set_result( maybeMutate( sizeofExpr->get_result(), *this ));239 mutateAll( sizeofExpr->get_results(), *this ); 241 240 if ( sizeofExpr->get_isType() ) { 242 241 sizeofExpr->set_type( maybeMutate( sizeofExpr->get_type(), *this ) ); … … 248 247 249 248 Expression *Mutator::mutate( AlignofExpr *alignofExpr ) { 250 alignofExpr->set_result( maybeMutate( alignofExpr->get_result(), *this ));249 mutateAll( alignofExpr->get_results(), *this ); 251 250 if ( alignofExpr->get_isType() ) { 252 251 alignofExpr->set_type( maybeMutate( alignofExpr->get_type(), *this ) ); … … 258 257 259 258 Expression *Mutator::mutate( UntypedOffsetofExpr *offsetofExpr ) { 260 offsetofExpr->set_result( maybeMutate( offsetofExpr->get_result(), *this ));259 mutateAll( offsetofExpr->get_results(), *this ); 261 260 offsetofExpr->set_type( maybeMutate( offsetofExpr->get_type(), *this ) ); 262 261 return offsetofExpr; … … 264 263 265 264 Expression *Mutator::mutate( OffsetofExpr *offsetofExpr ) { 266 offsetofExpr->set_result( maybeMutate( offsetofExpr->get_result(), *this ));265 mutateAll( offsetofExpr->get_results(), *this ); 267 266 offsetofExpr->set_type( maybeMutate( offsetofExpr->get_type(), *this ) ); 268 267 offsetofExpr->set_member( maybeMutate( offsetofExpr->get_member(), *this ) ); … … 271 270 272 271 Expression *Mutator::mutate( OffsetPackExpr *offsetPackExpr ) { 273 offsetPackExpr->set_result( maybeMutate( offsetPackExpr->get_result(), *this ));272 mutateAll( offsetPackExpr->get_results(), *this ); 274 273 offsetPackExpr->set_type( maybeMutate( offsetPackExpr->get_type(), *this ) ); 275 274 return offsetPackExpr; … … 277 276 278 277 Expression *Mutator::mutate( AttrExpr *attrExpr ) { 279 attrExpr->set_result( maybeMutate( attrExpr->get_result(), *this ));278 mutateAll( attrExpr->get_results(), *this ); 280 279 if ( attrExpr->get_isType() ) { 281 280 attrExpr->set_type( maybeMutate( attrExpr->get_type(), *this ) ); … … 287 286 288 287 Expression *Mutator::mutate( LogicalExpr *logicalExpr ) { 289 logicalExpr->set_result( maybeMutate( logicalExpr->get_result(), *this ));288 mutateAll( logicalExpr->get_results(), *this ); 290 289 logicalExpr->set_arg1( maybeMutate( logicalExpr->get_arg1(), *this ) ); 291 290 logicalExpr->set_arg2( maybeMutate( logicalExpr->get_arg2(), *this ) ); … … 294 293 295 294 Expression *Mutator::mutate( ConditionalExpr *conditionalExpr ) { 296 conditionalExpr->set_result( maybeMutate( conditionalExpr->get_result(), *this ));295 mutateAll( conditionalExpr->get_results(), *this ); 297 296 conditionalExpr->set_arg1( maybeMutate( conditionalExpr->get_arg1(), *this ) ); 298 297 conditionalExpr->set_arg2( maybeMutate( conditionalExpr->get_arg2(), *this ) ); … … 302 301 303 302 Expression *Mutator::mutate( CommaExpr *commaExpr ) { 304 commaExpr->set_result( maybeMutate( commaExpr->get_result(), *this ));303 mutateAll( commaExpr->get_results(), *this ); 305 304 commaExpr->set_arg1( maybeMutate( commaExpr->get_arg1(), *this ) ); 306 305 commaExpr->set_arg2( maybeMutate( commaExpr->get_arg2(), *this ) ); … … 308 307 } 309 308 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 310 321 Expression *Mutator::mutate( TypeExpr *typeExpr ) { 311 typeExpr->set_result( maybeMutate( typeExpr->get_result(), *this ));322 mutateAll( typeExpr->get_results(), *this ); 312 323 typeExpr->set_type( maybeMutate( typeExpr->get_type(), *this ) ); 313 324 return typeExpr; … … 329 340 330 341 Expression* Mutator::mutate( ConstructorExpr *ctorExpr ) { 331 ctorExpr->set_result( maybeMutate( ctorExpr->get_result(), *this ));342 mutateAll( ctorExpr->get_results(), *this ); 332 343 ctorExpr->set_callExpr( maybeMutate( ctorExpr->get_callExpr(), *this ) ); 333 344 return ctorExpr; … … 335 346 336 347 Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) { 337 compLitExpr->set_result( maybeMutate( compLitExpr->get_result(), *this ));348 mutateAll( compLitExpr->get_results(), *this ); 338 349 compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) ); 339 350 compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) ); … … 342 353 343 354 Expression *Mutator::mutate( UntypedValofExpr *valofExpr ) { 344 valofExpr->set_result( maybeMutate( valofExpr->get_result(), *this ));355 mutateAll( valofExpr->get_results(), *this ); 345 356 return valofExpr; 346 357 } … … 350 361 rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) ); 351 362 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;390 363 } 391 364 -
src/SynTree/Mutator.h
ra1e67dd rfe7b281 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 ); 73 75 virtual Expression* mutate( TypeExpr *typeExpr ); 74 76 virtual Expression* mutate( AsmExpr *asmExpr ); … … 78 80 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 79 81 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 );86 82 87 83 virtual Type* mutate( VoidType *basicType ); -
src/SynTree/ReferenceToType.cc
ra1e67dd rfe7b281 56 56 } 57 57 } // namespace 58 59 StructInstType::StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct ) : Parent( tq, baseStruct->get_name() ), baseStruct( baseStruct ) {}60 58 61 59 std::string StructInstType::typeString() const { return "struct"; } -
src/SynTree/SynTree.h
ra1e67dd rfe7b281 76 76 class ConditionalExpr; 77 77 class CommaExpr; 78 class TupleExpr; 79 class SolvedTupleExpr; 78 80 class TypeExpr; 79 81 class AsmExpr; … … 83 85 class UntypedValofExpr; 84 86 class RangeExpr; 85 class TupleExpr;86 class TupleIndexExpr;87 class MemberTupleExpr;88 class TupleAssignExpr;89 class StmtExpr;90 class UniqueExpr;91 87 92 88 class Type; -
src/SynTree/TupleExpr.cc
ra1e67dd rfe7b281 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"21 18 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 } 19 TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) { 28 20 } 29 21 … … 37 29 38 30 void TupleExpr::print( std::ostream &os, int indent ) const { 39 os << "Tuple:" << std::endl;31 os << std::string( indent, ' ' ) << "Tuple:" << std::endl; 40 32 printAll( exprs, os, indent+2 ); 41 33 Expression::print( os, indent ); 42 34 } 43 35 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() ); 36 SolvedTupleExpr::SolvedTupleExpr( std::list<Expression *> &_exprs, Expression *_aname ) : Expression( _aname ) { 37 std::copy(_exprs.begin(), _exprs.end(), back_inserter(exprs)); 49 38 } 50 39 51 TupleIndexExpr::TupleIndexExpr( const TupleIndexExpr &other ) : Expression( other ), tuple( other.tuple->clone() ), index( other.index ) { 40 SolvedTupleExpr::SolvedTupleExpr( const SolvedTupleExpr &other ) : Expression( other ) { 41 cloneAll( other.exprs, exprs ); 52 42 } 53 43 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; 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 ); 63 47 Expression::print( os, indent ); 64 48 } 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 tempDecls96 }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 112 49 113 50 // Local Variables: // -
src/SynTree/TupleType.cc
ra1e67dd rfe7b281 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 , const std::list< Type * > & types ) : Type( tq ), types( types) {19 TupleType::TupleType( const Type::Qualifiers &tq ) : Type( tq ) { 20 20 } 21 21 -
src/SynTree/Type.h
ra1e67dd rfe7b281 20 20 #include "Visitor.h" 21 21 #include "Mutator.h" 22 #include "Common/utility.h"23 22 24 23 class Type { … … 28 27 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 ) {} 29 28 30 Qualifiers &operator&=( const Qualifiers &other );31 29 Qualifiers &operator+=( const Qualifiers &other ); 32 30 Qualifiers &operator-=( const Qualifiers &other ); … … 65 63 void set_isAtomic( bool newValue ) { tq.isAtomic = newValue; } 66 64 void set_isAttribute( bool newValue ) { tq.isAttribute = newValue; } 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; } 65 std::list<TypeDecl*>& get_forall() { return forall; } 74 66 75 67 virtual Type *clone() const = 0; … … 79 71 private: 80 72 Qualifiers tq; 81 ForallListforall;73 std::list<TypeDecl*> forall; 82 74 }; 83 75 … … 85 77 public: 86 78 VoidType( const Type::Qualifiers &tq ); 87 88 virtual unsigned size() const { return 0; };89 79 90 80 virtual VoidType *clone() const { return new VoidType( *this ); } … … 244 234 public: 245 235 StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {} 246 StructInstType( const Type::Qualifiers &tq, StructDecl * baseStruct );247 236 StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {} 248 237 … … 359 348 class TupleType : public Type { 360 349 public: 361 TupleType( const Type::Qualifiers &tq , const std::list< Type * > & types = std::list< Type * >());350 TupleType( const Type::Qualifiers &tq ); 362 351 TupleType( const TupleType& ); 363 352 virtual ~TupleType(); 364 353 365 typedef std::list<Type*> value_type;366 typedef value_type::iterator iterator;367 368 354 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(); }373 355 374 356 virtual TupleType *clone() const { return new TupleType( *this ); } … … 460 442 }; 461 443 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 471 444 inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) { 472 445 isConst |= other.isConst; -
src/SynTree/TypeSubstitution.cc
ra1e67dd rfe7b281 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 ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {151 for ( std::list< TypeDecl* >::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 ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {165 for ( std::list< TypeDecl* >::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
ra1e67dd rfe7b281 150 150 151 151 void Visitor::visit( ApplicationExpr *applicationExpr ) { 152 maybeAccept( applicationExpr->get_result(), *this );152 acceptAll( applicationExpr->get_results(), *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 maybeAccept( untypedExpr->get_result(), *this );158 acceptAll( untypedExpr->get_results(), *this ); 159 159 acceptAll( untypedExpr->get_args(), *this ); 160 160 } 161 161 162 162 void Visitor::visit( NameExpr *nameExpr ) { 163 maybeAccept( nameExpr->get_result(), *this );163 acceptAll( nameExpr->get_results(), *this ); 164 164 } 165 165 166 166 void Visitor::visit( AddressExpr *addressExpr ) { 167 maybeAccept( addressExpr->get_result(), *this );167 acceptAll( addressExpr->get_results(), *this ); 168 168 maybeAccept( addressExpr->get_arg(), *this ); 169 169 } 170 170 171 171 void Visitor::visit( LabelAddressExpr *labAddressExpr ) { 172 maybeAccept( labAddressExpr->get_result(), *this );172 acceptAll( labAddressExpr->get_results(), *this ); 173 173 maybeAccept( labAddressExpr->get_arg(), *this ); 174 174 } 175 175 176 176 void Visitor::visit( CastExpr *castExpr ) { 177 maybeAccept( castExpr->get_result(), *this );177 acceptAll( castExpr->get_results(), *this ); 178 178 maybeAccept( castExpr->get_arg(), *this ); 179 179 } 180 180 181 181 void Visitor::visit( UntypedMemberExpr *memberExpr ) { 182 maybeAccept( memberExpr->get_result(), *this );182 acceptAll( memberExpr->get_results(), *this ); 183 183 maybeAccept( memberExpr->get_aggregate(), *this ); 184 maybeAccept( memberExpr->get_member(), *this );185 184 } 186 185 187 186 void Visitor::visit( MemberExpr *memberExpr ) { 188 maybeAccept( memberExpr->get_result(), *this );187 acceptAll( memberExpr->get_results(), *this ); 189 188 maybeAccept( memberExpr->get_aggregate(), *this ); 190 189 } 191 190 192 191 void Visitor::visit( VariableExpr *variableExpr ) { 193 maybeAccept( variableExpr->get_result(), *this );192 acceptAll( variableExpr->get_results(), *this ); 194 193 } 195 194 196 195 void Visitor::visit( ConstantExpr *constantExpr ) { 197 maybeAccept( constantExpr->get_result(), *this );196 acceptAll( constantExpr->get_results(), *this ); 198 197 maybeAccept( constantExpr->get_constant(), *this ); 199 198 } 200 199 201 200 void Visitor::visit( SizeofExpr *sizeofExpr ) { 202 maybeAccept( sizeofExpr->get_result(), *this );201 acceptAll( sizeofExpr->get_results(), *this ); 203 202 if ( sizeofExpr->get_isType() ) { 204 203 maybeAccept( sizeofExpr->get_type(), *this ); … … 209 208 210 209 void Visitor::visit( AlignofExpr *alignofExpr ) { 211 maybeAccept( alignofExpr->get_result(), *this );210 acceptAll( alignofExpr->get_results(), *this ); 212 211 if ( alignofExpr->get_isType() ) { 213 212 maybeAccept( alignofExpr->get_type(), *this ); … … 218 217 219 218 void Visitor::visit( UntypedOffsetofExpr *offsetofExpr ) { 220 maybeAccept( offsetofExpr->get_result(), *this );219 acceptAll( offsetofExpr->get_results(), *this ); 221 220 maybeAccept( offsetofExpr->get_type(), *this ); 222 221 } 223 222 224 223 void Visitor::visit( OffsetofExpr *offsetofExpr ) { 225 maybeAccept( offsetofExpr->get_result(), *this );224 acceptAll( offsetofExpr->get_results(), *this ); 226 225 maybeAccept( offsetofExpr->get_type(), *this ); 227 226 maybeAccept( offsetofExpr->get_member(), *this ); … … 229 228 230 229 void Visitor::visit( OffsetPackExpr *offsetPackExpr ) { 231 maybeAccept( offsetPackExpr->get_result(), *this );230 acceptAll( offsetPackExpr->get_results(), *this ); 232 231 maybeAccept( offsetPackExpr->get_type(), *this ); 233 232 } 234 233 235 234 void Visitor::visit( AttrExpr *attrExpr ) { 236 maybeAccept( attrExpr->get_result(), *this );235 acceptAll( attrExpr->get_results(), *this ); 237 236 if ( attrExpr->get_isType() ) { 238 237 maybeAccept( attrExpr->get_type(), *this ); … … 243 242 244 243 void Visitor::visit( LogicalExpr *logicalExpr ) { 245 maybeAccept( logicalExpr->get_result(), *this );244 acceptAll( logicalExpr->get_results(), *this ); 246 245 maybeAccept( logicalExpr->get_arg1(), *this ); 247 246 maybeAccept( logicalExpr->get_arg2(), *this ); … … 249 248 250 249 void Visitor::visit( ConditionalExpr *conditionalExpr ) { 251 maybeAccept( conditionalExpr->get_result(), *this );250 acceptAll( conditionalExpr->get_results(), *this ); 252 251 maybeAccept( conditionalExpr->get_arg1(), *this ); 253 252 maybeAccept( conditionalExpr->get_arg2(), *this ); … … 256 255 257 256 void Visitor::visit( CommaExpr *commaExpr ) { 258 maybeAccept( commaExpr->get_result(), *this );257 acceptAll( commaExpr->get_results(), *this ); 259 258 maybeAccept( commaExpr->get_arg1(), *this ); 260 259 maybeAccept( commaExpr->get_arg2(), *this ); 261 260 } 262 261 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 263 272 void Visitor::visit( TypeExpr *typeExpr ) { 264 maybeAccept( typeExpr->get_result(), *this );273 acceptAll( typeExpr->get_results(), *this ); 265 274 maybeAccept( typeExpr->get_type(), *this ); 266 275 } … … 279 288 280 289 void Visitor::visit( ConstructorExpr * ctorExpr ) { 281 maybeAccept( ctorExpr->get_result(), *this );290 acceptAll( ctorExpr->get_results(), *this ); 282 291 maybeAccept( ctorExpr->get_callExpr(), *this ); 283 292 } 284 293 285 294 void Visitor::visit( CompoundLiteralExpr *compLitExpr ) { 286 maybeAccept( compLitExpr->get_result(), *this );295 acceptAll( compLitExpr->get_results(), *this ); 287 296 maybeAccept( compLitExpr->get_type(), *this ); 288 297 maybeAccept( compLitExpr->get_initializer(), *this ); … … 290 299 291 300 void Visitor::visit( UntypedValofExpr *valofExpr ) { 292 maybeAccept( valofExpr->get_result(), *this );301 acceptAll( valofExpr->get_results(), *this ); 293 302 maybeAccept( valofExpr->get_body(), *this ); 294 303 } … … 297 306 maybeAccept( rangeExpr->get_low(), *this ); 298 307 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 );331 308 } 332 309 -
src/SynTree/Visitor.h
ra1e67dd rfe7b281 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 ); 73 75 virtual void visit( TypeExpr *typeExpr ); 74 76 virtual void visit( AsmExpr *asmExpr ); … … 78 80 virtual void visit( UntypedValofExpr *valofExpr ); 79 81 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 );86 82 87 83 virtual void visit( VoidType *basicType ); -
src/Tuples/TupleAssignment.cc
ra1e67dd rfe7b281 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 "SynTree/Initializer.h" 21 #include "Tuples.h" 20 #include "TupleAssignment.h" 22 21 #include "Common/SemanticError.h" 23 #include "InitTweak/InitTweak.h"24 22 25 23 #include <functional> … … 29 27 #include <cassert> 30 28 #include <set> 31 #include <unordered_set>32 29 33 30 namespace Tuples { 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 ) { 31 TupleAssignSpotter::TupleAssignSpotter( ResolvExpr::AlternativeFinder *f = 0 ) 32 : currentFinder(f), matcher(0), hasMatched( false ) {} 33 34 bool TupleAssignSpotter::pointsToTuple( Expression *expr ) { 35 // 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; 39 return false; 40 } 41 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 72 50 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 ) { 87 // also check for function returning tuple of reference types 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 } 93 return false; 94 } 95 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 { 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 123 150 // mass assignment 124 matcher.reset( new MassAssignMatcher( *this, *ali ) ); 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() ) ); 125 178 } 126 match(); 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() ) ); 127 189 } 128 190 } 129 191 } 130 192 } 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 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 267 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 ); 148 373 } 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? 241 if ( lhs.size() == rhs.size() ) { 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 } 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; 254 408 } 255 409 } // namespace Tuples -
src/Tuples/module.mk
ra1e67dd rfe7b281 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/ TupleExpansion.cc18 Tuples/NameMatcher.cc -
src/main.cc
ra1e67dd rfe7b281 42 42 #include "Common/UnimplementedError.h" 43 43 #include "../config.h" 44 #include "Tuples/Tuples.h"45 44 46 45 using namespace std; … … 232 231 OPTPRINT( "tweakInit" ) 233 232 InitTweak::genInit( translationUnit ); 234 OPTPRINT( "expandMemberTuples" ); 235 Tuples::expandMemberTuples( translationUnit ); 233 236 234 if ( libcfap ) { 237 235 // generate the bodies of cfa library functions … … 250 248 return 0; 251 249 } // if 252 253 OPTPRINT( "expandUniqueExpr" ); // xxx - is this the right place for this? want to expand ASAP so that subsequent passes don't need to worry about double-visiting a unique expr254 Tuples::expandUniqueExpr( translationUnit );255 250 256 251 // fix ObjectDecl - replaces ConstructorInit nodes … … 277 272 OPTPRINT( "box" ) 278 273 GenPoly::box( translationUnit ); 279 OPTPRINT( "expandTuples" ); // xxx - is this the right place for this?280 Tuples::expandTuples( translationUnit );281 274 282 275 // print tree right before code generation
Note:
See TracChangeset
for help on using the changeset viewer.