Changes in / [3f0c6a5:47a8d17]
- 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) (538 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) (9 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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) … … 364 365 ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \ 365 366 ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \ 366 ControlStruct/ForExprMutator.cc GenPoly/Box.cc \ 367 ControlStruct/ForExprMutator.cc \ 368 ControlStruct/LabelTypeChecker.cc GenPoly/Box.cc \ 367 369 GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \ 368 370 GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \ … … 404 406 SynTree/AddStmtVisitor.cc SynTree/TypeSubstitution.cc \ 405 407 SynTree/Attribute.cc Tuples/TupleAssignment.cc \ 406 Tuples/ TupleExpansion.cc408 Tuples/NameMatcher.cc 407 409 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \ 408 410 ${cfa_cpplib_PROGRAMS}} … … 539 541 ControlStruct/$(DEPDIR)/$(am__dirstamp) 540 542 ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT): \ 543 ControlStruct/$(am__dirstamp) \ 544 ControlStruct/$(DEPDIR)/$(am__dirstamp) 545 ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT): \ 541 546 ControlStruct/$(am__dirstamp) \ 542 547 ControlStruct/$(DEPDIR)/$(am__dirstamp) … … 772 777 Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT): \ 773 778 Tuples/$(am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp) 774 Tuples/driver_cfa_cpp- TupleExpansion.$(OBJEXT):\775 Tuples/$( am__dirstamp) Tuples/$(DEPDIR)/$(am__dirstamp)779 Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT): Tuples/$(am__dirstamp) \ 780 Tuples/$(DEPDIR)/$(am__dirstamp) 776 781 driver/$(am__dirstamp): 777 782 @$(MKDIR_P) driver … … 795 800 -rm -f ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) 796 801 -rm -f ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) 802 -rm -f ControlStruct/driver_cfa_cpp-LabelTypeChecker.$(OBJEXT) 797 803 -rm -f ControlStruct/driver_cfa_cpp-MLEMutator.$(OBJEXT) 798 804 -rm -f ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) … … 881 887 -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) 882 888 -rm -f SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT) 889 -rm -f Tuples/driver_cfa_cpp-NameMatcher.$(OBJEXT) 883 890 -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) 884 -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)885 891 886 892 distclean-compile: … … 901 907 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@ 902 908 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelGenerator.Po@am__quote@ 909 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po@am__quote@ 903 910 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-MLEMutator.Po@am__quote@ 904 911 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-Mutate.Po@am__quote@ … … 987 994 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-VoidType.Po@am__quote@ 988 995 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-ZeroOneType.Po@am__quote@ 996 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po@am__quote@ 989 997 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@ 990 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@991 998 992 999 .cc.o: … … 1230 1237 @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` 1231 1238 1239 ControlStruct/driver_cfa_cpp-LabelTypeChecker.o: ControlStruct/LabelTypeChecker.cc 1240 @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 1241 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po 1242 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ControlStruct/LabelTypeChecker.cc' object='ControlStruct/driver_cfa_cpp-LabelTypeChecker.o' libtool=no @AMDEPBACKSLASH@ 1243 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1244 @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 1245 1246 ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj: ControlStruct/LabelTypeChecker.cc 1247 @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` 1248 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelTypeChecker.Po 1249 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ControlStruct/LabelTypeChecker.cc' object='ControlStruct/driver_cfa_cpp-LabelTypeChecker.obj' libtool=no @AMDEPBACKSLASH@ 1250 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1251 @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` 1252 1232 1253 GenPoly/driver_cfa_cpp-Box.o: GenPoly/Box.cc 1233 1254 @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 … … 2420 2441 @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` 2421 2442 2422 Tuples/driver_cfa_cpp- TupleExpansion.o: Tuples/TupleExpansion.cc2423 @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.cc2424 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp- TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po2425 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/ TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.o' libtool=no @AMDEPBACKSLASH@2426 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2427 @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.cc2428 2429 Tuples/driver_cfa_cpp- TupleExpansion.obj: Tuples/TupleExpansion.cc2430 @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`2431 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp- TupleExpansion.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po2432 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/ TupleExpansion.cc' object='Tuples/driver_cfa_cpp-TupleExpansion.obj' libtool=no @AMDEPBACKSLASH@2433 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2434 @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`2443 Tuples/driver_cfa_cpp-NameMatcher.o: Tuples/NameMatcher.cc 2444 @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 2445 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po 2446 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.o' libtool=no @AMDEPBACKSLASH@ 2447 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2448 @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 2449 2450 Tuples/driver_cfa_cpp-NameMatcher.obj: Tuples/NameMatcher.cc 2451 @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` 2452 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Tpo Tuples/$(DEPDIR)/driver_cfa_cpp-NameMatcher.Po 2453 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Tuples/NameMatcher.cc' object='Tuples/driver_cfa_cpp-NameMatcher.obj' libtool=no @AMDEPBACKSLASH@ 2454 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2455 @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` 2435 2456 2436 2457 .ll.cc: -
src/Parser/ExpressionNode.cc
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 1026 1026 static const yytype_uint16 yyrline[] = 1027 1027 { 1028 0, 30 5, 305, 309, 316, 317, 318, 319, 320, 324,1029 32 5, 326, 330, 331, 335, 336, 340, 341, 345, 349,1030 35 0, 361, 363, 365, 366, 368, 373, 374, 380, 382,1031 38 4, 386, 388, 390, 392, 394, 396, 398, 407, 408,1032 41 4, 415, 419, 420, 424, 425, 427, 429, 431, 433,1033 43 5, 440, 442, 444, 448, 450, 454, 457, 459, 461,1034 46 6, 479, 481, 483, 485, 487, 489, 491, 493, 495,1035 49 7, 499, 506, 507, 513, 514, 515, 516, 520, 521,1036 52 8, 529, 531, 533, 538, 539, 541, 546, 547, 549,1037 55 4, 555, 557, 559, 561, 566, 567, 569, 574, 575,1038 5 80, 581, 586, 587, 592, 593, 598, 599, 604, 605,1039 60 8, 615, 620, 621, 629, 630, 634, 635, 636, 637,1040 63 8, 639, 640, 641, 642, 643, 644, 645, 655, 657,1041 66 2, 663, 668, 669, 675, 676, 682, 683, 684, 685,1042 68 6, 687, 688, 689, 690, 700, 707, 709, 719, 720,1043 72 5, 727, 733, 735, 739, 740, 745, 750, 753, 755,1044 75 7, 767, 769, 780, 781, 783, 787, 789, 793, 794,1045 79 9, 800, 804, 809, 810, 814, 816, 822, 823, 827,1046 82 9, 831, 833, 839, 840, 844, 846, 851, 853, 855,1047 8 60, 862, 867, 869, 873, 876, 880, 883, 887, 889,1048 89 1, 893, 898, 900, 902, 907, 909, 911, 913, 915,1049 9 20, 922, 924, 926, 931, 943, 944, 949, 951, 956,1050 9 60, 962, 964, 966, 968, 974, 975, 981, 982, 986,1051 98 7, 992, 994, 1000, 1001, 1003, 1008, 1013, 1023, 1025,1052 102 9, 1030, 1035, 1037, 1041, 1042, 1046, 1048, 1052, 1053,1053 105 7, 1058, 1062, 1063, 1078, 1079, 1080, 1081, 1082, 1086,1054 109 1, 1098, 1108, 1113, 1118, 1126, 1131, 1136, 1141, 1146,1055 117 6, 1181, 1188, 1190, 1197, 1202, 1207, 1218, 1223, 1228,1056 123 3, 1238, 1247, 1252, 1260, 1261, 1262, 1263, 1269, 1274,1057 128 2, 1283, 1284, 1285, 1289, 1290, 1291, 1292, 1297, 1298,1058 130 7, 1308, 1313, 1314, 1319, 1321, 1323, 1325, 1327, 1330,1059 132 9, 1341, 1342, 1344, 1354, 1355, 1360, 1362, 1364, 1366,1060 136 8, 1371, 1373, 1376, 1381, 1383, 1385, 1387, 1389, 1391,1061 139 3, 1395, 1397, 1399, 1401, 1403, 1405, 1411, 1412, 1414,1062 141 6, 1418, 1423, 1424, 1430, 1431, 1433, 1435, 1440, 1442,1063 144 4, 1446, 1451, 1452, 1454, 1456, 1461, 1462, 1464, 1469,1064 14 70, 1472, 1474, 1479, 1481, 1483, 1488, 1489, 1493, 1495,1065 150 1, 1500, 1504, 1506, 1511, 1513, 1519, 1520, 1525, 1526,1066 152 8, 1529, 1538, 1539, 1541, 1543, 1548, 1550, 1556, 1557,1067 155 9, 1562, 1565, 1570, 1571, 1576, 1581, 1585, 1587, 1593,1068 159 2, 1599, 1601, 1607, 1608, 1616, 1617, 1621, 1622, 1623,1069 162 5, 1627, 1634, 1635, 1637, 1639, 1644, 1645, 1651, 1652,1070 165 6, 1657, 1662, 1663, 1664, 1666, 1674, 1675, 1677, 1680,1071 168 2, 1686, 1687, 1688, 1690, 1692, 1696, 1701, 1709, 1710,1072 171 9, 1721, 1726, 1727, 1728, 1732, 1733, 1734, 1738, 1739,1073 17 40, 1744, 1745, 1746, 1751, 1752, 1753, 1754, 1760, 1761,1074 176 3, 1768, 1769, 1774, 1775, 1776, 1777, 1778, 1793, 1794,1075 179 9, 1800, 1806, 1808, 1811, 1813, 1815, 1838, 1839, 1841,1076 184 3, 1848, 1849, 1851, 1856, 1861, 1862, 1868, 1867, 1871,1077 187 5, 1877, 1879, 1885, 1886, 1891, 1896, 1898, 1903, 1905,1078 190 6, 1908, 1913, 1915, 1917, 1922, 1924, 1929, 1934, 1942,1079 194 8, 1947, 1961, 1962, 1967, 1968, 1972, 1977, 1982, 1990,1080 199 5, 2006, 2007, 2012, 2013, 2019, 2020, 2024, 2025, 2026,1081 202 9, 2028, 2039, 2048, 2054, 2060, 2069, 2075, 2081, 2087,1082 209 3, 2101, 2107, 2115, 2121, 2130, 2131, 2132, 2136, 2140,1083 214 2, 2147, 2148, 2152, 2153, 2158, 2164, 2165, 2168, 2170,1084 217 1, 2175, 2176, 2177, 2178, 2212, 2214, 2215, 2217, 2222,1085 222 7, 2232, 2234, 2236, 2241, 2243, 2245, 2247, 2252, 2254,1086 226 3, 2265, 2266, 2271, 2273, 2275, 2280, 2282, 2284, 2289,1087 229 1, 2293, 2302, 2303, 2304, 2308, 2310, 2312, 2317, 2319,1088 232 1, 2326, 2328, 2330, 2345, 2347, 2348, 2350, 2355, 2356,1089 236 1, 2363, 2365, 2370, 2372, 2374, 2376, 2381, 2383, 2385,1090 239 5, 2397, 2398, 2400, 2405, 2407, 2409, 2414, 2416, 2418,1091 24 20, 2425, 2427, 2429, 2460, 2462, 2463, 2465, 2470, 2475,1092 248 3, 2485, 2487, 2492, 2494, 2499, 2501, 2515, 2516, 2518,1093 252 3, 2525, 2527, 2529, 2531, 2536, 2537, 2539, 2541, 2546,1094 254 8, 2550, 2556, 2558, 2560, 2564, 2566, 2568, 2570, 2584,1095 258 5, 2587, 2592, 2594, 2596, 2598, 2600, 2605, 2606, 2608,1096 26 10, 2615, 2617, 2619, 2625, 2626, 2628, 2637, 2640, 2642,1097 264 5, 2647, 2649, 2662, 2663, 2665, 2670, 2672, 2674, 2676,1098 267 8, 2683, 2684, 2686, 2688, 2693, 2695, 2703, 2704, 2705,1099 27 10, 2711, 2715, 2717, 2719, 2721, 2723, 2725, 2732, 2734,1100 273 6, 2738, 2740, 2743, 2745, 2747, 2749, 2751, 2756, 2758,1101 27 60, 2765, 2791, 2792, 2794, 2798, 2799, 2803, 2805, 2807,1102 280 9, 2811, 2813, 2820, 2822, 2824, 2826, 2828, 2830, 2835,1103 284 2, 2844, 2862, 2864, 2869, 28701028 0, 306, 306, 310, 317, 318, 319, 320, 321, 325, 1029 326, 327, 331, 332, 336, 337, 341, 342, 346, 350, 1030 351, 362, 364, 366, 367, 369, 374, 375, 381, 383, 1031 385, 386, 387, 389, 390, 392, 394, 396, 405, 406, 1032 412, 413, 417, 418, 422, 424, 426, 428, 430, 432, 1033 434, 439, 441, 443, 447, 449, 453, 456, 458, 460, 1034 465, 478, 480, 482, 484, 486, 488, 490, 492, 494, 1035 496, 498, 505, 506, 512, 513, 514, 515, 519, 520, 1036 527, 528, 530, 532, 537, 538, 540, 545, 546, 548, 1037 553, 554, 556, 558, 560, 565, 566, 568, 573, 574, 1038 579, 580, 585, 586, 591, 592, 597, 598, 603, 604, 1039 607, 614, 619, 620, 628, 629, 633, 634, 635, 636, 1040 637, 638, 639, 640, 641, 642, 643, 644, 654, 656, 1041 661, 662, 667, 668, 674, 675, 681, 682, 683, 684, 1042 685, 686, 687, 688, 689, 699, 706, 708, 718, 719, 1043 724, 726, 732, 734, 738, 739, 744, 749, 752, 754, 1044 756, 766, 768, 779, 780, 782, 786, 788, 792, 793, 1045 798, 799, 803, 808, 809, 813, 815, 821, 822, 826, 1046 828, 830, 832, 838, 839, 843, 845, 850, 852, 854, 1047 859, 861, 866, 868, 872, 875, 879, 882, 886, 888, 1048 890, 892, 897, 899, 901, 906, 908, 910, 912, 914, 1049 919, 921, 923, 925, 930, 942, 943, 948, 950, 955, 1050 959, 961, 963, 965, 967, 973, 974, 980, 981, 985, 1051 986, 991, 993, 999, 1000, 1002, 1007, 1012, 1022, 1024, 1052 1028, 1029, 1034, 1036, 1040, 1041, 1045, 1047, 1051, 1052, 1053 1056, 1057, 1061, 1062, 1077, 1078, 1079, 1080, 1081, 1085, 1054 1090, 1097, 1107, 1112, 1117, 1125, 1130, 1135, 1140, 1145, 1055 1175, 1180, 1187, 1189, 1196, 1201, 1206, 1217, 1222, 1227, 1056 1232, 1237, 1246, 1251, 1259, 1260, 1261, 1262, 1268, 1273, 1057 1281, 1282, 1283, 1284, 1288, 1289, 1290, 1291, 1296, 1297, 1058 1306, 1307, 1312, 1313, 1318, 1320, 1322, 1324, 1326, 1329, 1059 1328, 1340, 1341, 1343, 1353, 1354, 1359, 1361, 1363, 1365, 1060 1367, 1370, 1372, 1375, 1380, 1382, 1384, 1386, 1388, 1390, 1061 1392, 1394, 1396, 1398, 1400, 1402, 1404, 1410, 1411, 1413, 1062 1415, 1417, 1422, 1423, 1429, 1430, 1432, 1434, 1439, 1441, 1063 1443, 1445, 1450, 1451, 1453, 1455, 1460, 1461, 1463, 1468, 1064 1469, 1471, 1473, 1478, 1480, 1482, 1487, 1488, 1492, 1494, 1065 1500, 1499, 1503, 1505, 1510, 1512, 1518, 1519, 1524, 1525, 1066 1527, 1528, 1537, 1538, 1540, 1542, 1547, 1549, 1555, 1556, 1067 1558, 1561, 1564, 1569, 1570, 1575, 1580, 1584, 1586, 1592, 1068 1591, 1598, 1600, 1606, 1607, 1615, 1616, 1620, 1621, 1622, 1069 1624, 1626, 1633, 1634, 1636, 1638, 1643, 1644, 1650, 1651, 1070 1655, 1656, 1661, 1662, 1663, 1665, 1673, 1674, 1676, 1679, 1071 1681, 1685, 1686, 1687, 1689, 1691, 1695, 1700, 1708, 1709, 1072 1718, 1720, 1725, 1726, 1727, 1731, 1732, 1733, 1737, 1738, 1073 1739, 1743, 1744, 1745, 1750, 1751, 1752, 1753, 1759, 1760, 1074 1762, 1767, 1768, 1773, 1774, 1775, 1776, 1777, 1792, 1793, 1075 1798, 1799, 1805, 1807, 1810, 1812, 1814, 1837, 1838, 1840, 1076 1842, 1847, 1848, 1850, 1855, 1860, 1861, 1867, 1866, 1870, 1077 1874, 1876, 1878, 1884, 1885, 1890, 1895, 1897, 1902, 1904, 1078 1905, 1907, 1912, 1914, 1916, 1921, 1923, 1928, 1933, 1941, 1079 1947, 1946, 1960, 1961, 1966, 1967, 1971, 1976, 1981, 1989, 1080 1994, 2005, 2006, 2011, 2012, 2018, 2019, 2023, 2024, 2025, 1081 2028, 2027, 2038, 2047, 2053, 2059, 2068, 2074, 2080, 2086, 1082 2092, 2100, 2106, 2114, 2120, 2129, 2130, 2131, 2135, 2139, 1083 2141, 2146, 2147, 2151, 2152, 2157, 2163, 2164, 2167, 2169, 1084 2170, 2174, 2175, 2176, 2177, 2211, 2213, 2214, 2216, 2221, 1085 2226, 2231, 2233, 2235, 2240, 2242, 2244, 2246, 2251, 2253, 1086 2262, 2264, 2265, 2270, 2272, 2274, 2279, 2281, 2283, 2288, 1087 2290, 2292, 2301, 2302, 2303, 2307, 2309, 2311, 2316, 2318, 1088 2320, 2325, 2327, 2329, 2344, 2346, 2347, 2349, 2354, 2355, 1089 2360, 2362, 2364, 2369, 2371, 2373, 2375, 2380, 2382, 2384, 1090 2394, 2396, 2397, 2399, 2404, 2406, 2408, 2413, 2415, 2417, 1091 2419, 2424, 2426, 2428, 2459, 2461, 2462, 2464, 2469, 2474, 1092 2482, 2484, 2486, 2491, 2493, 2498, 2500, 2514, 2515, 2517, 1093 2522, 2524, 2526, 2528, 2530, 2535, 2536, 2538, 2540, 2545, 1094 2547, 2549, 2555, 2557, 2559, 2563, 2565, 2567, 2569, 2583, 1095 2584, 2586, 2591, 2593, 2595, 2597, 2599, 2604, 2605, 2607, 1096 2609, 2614, 2616, 2618, 2624, 2625, 2627, 2636, 2639, 2641, 1097 2644, 2646, 2648, 2661, 2662, 2664, 2669, 2671, 2673, 2675, 1098 2677, 2682, 2683, 2685, 2687, 2692, 2694, 2702, 2703, 2704, 1099 2709, 2710, 2714, 2716, 2718, 2720, 2722, 2724, 2731, 2733, 1100 2735, 2737, 2739, 2742, 2744, 2746, 2748, 2750, 2755, 2757, 1101 2759, 2764, 2790, 2791, 2793, 2797, 2798, 2802, 2804, 2806, 1102 2808, 2810, 2812, 2819, 2821, 2823, 2825, 2827, 2829, 2834, 1103 2841, 2843, 2861, 2863, 2868, 2869 1104 1104 }; 1105 1105 #endif … … 4851 4851 4852 4852 /* Line 1806 of yacc.c */ 4853 #line 30 5"parser.yy"4853 #line 306 "parser.yy" 4854 4854 { typedefTable.enterScope(); } 4855 4855 break; … … 4858 4858 4859 4859 /* Line 1806 of yacc.c */ 4860 #line 3 09"parser.yy"4860 #line 310 "parser.yy" 4861 4861 { typedefTable.leaveScope(); } 4862 4862 break; … … 4865 4865 4866 4866 /* Line 1806 of yacc.c */ 4867 #line 31 6"parser.yy"4867 #line 317 "parser.yy" 4868 4868 { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); } 4869 4869 break; 4870 4870 4871 4871 case 5: 4872 4873 /* Line 1806 of yacc.c */4874 #line 317 "parser.yy"4875 { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); }4876 break;4877 4878 case 6:4879 4872 4880 4873 /* Line 1806 of yacc.c */ … … 4883 4876 break; 4884 4877 4885 case 7:4878 case 6: 4886 4879 4887 4880 /* Line 1806 of yacc.c */ … … 4890 4883 break; 4891 4884 4885 case 7: 4886 4887 /* Line 1806 of yacc.c */ 4888 #line 320 "parser.yy" 4889 { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); } 4890 break; 4891 4892 4892 case 8: 4893 4893 4894 4894 /* Line 1806 of yacc.c */ 4895 #line 32 0"parser.yy"4895 #line 321 "parser.yy" 4896 4896 { (yyval.en) = new ExpressionNode( build_constantChar( *(yyvsp[(1) - (1)].tok) ) ); } 4897 4897 break; … … 4900 4900 4901 4901 /* Line 1806 of yacc.c */ 4902 #line 34 5"parser.yy"4902 #line 346 "parser.yy" 4903 4903 { (yyval.constant) = build_constantStr( *(yyvsp[(1) - (1)].str) ); } 4904 4904 break; … … 4907 4907 4908 4908 /* Line 1806 of yacc.c */ 4909 #line 3 49"parser.yy"4909 #line 350 "parser.yy" 4910 4910 { (yyval.str) = (yyvsp[(1) - (1)].tok); } 4911 4911 break; … … 4914 4914 4915 4915 /* Line 1806 of yacc.c */ 4916 #line 35 1"parser.yy"4916 #line 352 "parser.yy" 4917 4917 { 4918 4918 appendStr( (yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].tok) ); // append 2nd juxtaposed string to 1st … … 4925 4925 4926 4926 /* Line 1806 of yacc.c */ 4927 #line 36 2"parser.yy"4927 #line 363 "parser.yy" 4928 4928 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 4929 4929 break; … … 4932 4932 4933 4933 /* Line 1806 of yacc.c */ 4934 #line 36 4"parser.yy"4934 #line 365 "parser.yy" 4935 4935 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 4936 4936 break; … … 4939 4939 4940 4940 /* Line 1806 of yacc.c */ 4941 #line 36 7"parser.yy"4941 #line 368 "parser.yy" 4942 4942 { (yyval.en) = (yyvsp[(2) - (3)].en); } 4943 4943 break; … … 4946 4946 4947 4947 /* Line 1806 of yacc.c */ 4948 #line 3 69"parser.yy"4948 #line 370 "parser.yy" 4949 4949 { (yyval.en) = new ExpressionNode( build_valexpr( (yyvsp[(2) - (3)].sn) ) ); } 4950 4950 break; … … 4953 4953 4954 4954 /* Line 1806 of yacc.c */ 4955 #line 3 79"parser.yy"4955 #line 380 "parser.yy" 4956 4956 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Index, (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ) ); } 4957 4957 break; … … 4960 4960 4961 4961 /* Line 1806 of yacc.c */ 4962 #line 38 1"parser.yy"4962 #line 382 "parser.yy" 4963 4963 { (yyval.en) = new ExpressionNode( build_func( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ) ); } 4964 4964 break; … … 4967 4967 4968 4968 /* Line 1806 of yacc.c */ 4969 #line 38 3"parser.yy"4969 #line 384 "parser.yy" 4970 4970 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 4971 4971 break; 4972 4972 4973 case 30:4974 4975 /* Line 1806 of yacc.c */4976 #line 385 "parser.yy"4977 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }4978 break;4979 4980 case 31:4981 4982 /* Line 1806 of yacc.c */4983 #line 387 "parser.yy"4984 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (2)].en), build_constantInteger( *(yyvsp[(2) - (2)].tok) ) ) ); }4985 break;4986 4987 4973 case 32: 4988 4974 4989 4975 /* Line 1806 of yacc.c */ 4990 #line 38 9"parser.yy"4976 #line 388 "parser.yy" 4991 4977 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); } 4992 4978 break; 4993 4979 4994 case 3 3:4980 case 34: 4995 4981 4996 4982 /* Line 1806 of yacc.c */ 4997 4983 #line 391 "parser.yy" 4998 { (yyval.en) = new ExpressionNode( build_ pfieldSel( (yyvsp[(1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en)) ) ); }4999 break; 5000 5001 case 3 4:4984 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); } 4985 break; 4986 4987 case 35: 5002 4988 5003 4989 /* Line 1806 of yacc.c */ 5004 4990 #line 393 "parser.yy" 5005 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds:: IncrPost, (yyvsp[(1) - (2)].en) ) ); }5006 break; 5007 5008 case 3 5:4991 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); } 4992 break; 4993 4994 case 36: 5009 4995 5010 4996 /* Line 1806 of yacc.c */ 5011 4997 #line 395 "parser.yy" 5012 { (yyval.en) = new ExpressionNode( build_ unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); }5013 break; 5014 5015 case 3 6:4998 { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); } 4999 break; 5000 5001 case 37: 5016 5002 5017 5003 /* Line 1806 of yacc.c */ 5018 5004 #line 397 "parser.yy" 5019 { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); }5020 break;5021 5022 case 37:5023 5024 /* Line 1806 of yacc.c */5025 #line 399 "parser.yy"5026 5005 { 5027 5006 Token fn; … … 5034 5013 5035 5014 /* Line 1806 of yacc.c */ 5036 #line 40 9"parser.yy"5015 #line 407 "parser.yy" 5037 5016 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 5038 5017 break; … … 5041 5020 5042 5021 /* Line 1806 of yacc.c */ 5043 #line 41 4"parser.yy"5022 #line 412 "parser.yy" 5044 5023 { (yyval.en) = 0; } 5045 5024 break; … … 5048 5027 5049 5028 /* Line 1806 of yacc.c */ 5050 #line 4 20"parser.yy"5029 #line 418 "parser.yy" 5051 5030 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5052 5031 break; 5053 5032 5033 case 44: 5034 5035 /* Line 1806 of yacc.c */ 5036 #line 423 "parser.yy" 5037 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); } 5038 break; 5039 5054 5040 case 45: 5055 5041 5056 5042 /* Line 1806 of yacc.c */ 5057 #line 42 6"parser.yy"5058 { (yyval.en) = new ExpressionNode( build_fieldSel( new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (2)].tok) ) ), maybeMoveBuild<Expression>( (yyvsp[(2) - (2)].en) ) ) ); }5043 #line 425 "parser.yy" 5044 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(2) - (2)].en), build_varref( (yyvsp[(1) - (2)].tok) ) ) ); } 5059 5045 break; 5060 5046 … … 5062 5048 5063 5049 /* Line 1806 of yacc.c */ 5064 #line 42 8"parser.yy"5065 { (yyval.en) = new ExpressionNode( build_fieldSel( new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (6)].tok) ) ), build_tuple( (yyvsp[(4) - (6)].en) ) ) ); }5050 #line 427 "parser.yy" 5051 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(4) - (6)].en), build_varref( (yyvsp[(1) - (6)].tok) ) ) ); } 5066 5052 break; 5067 5053 … … 5069 5055 5070 5056 /* Line 1806 of yacc.c */ 5071 #line 4 30"parser.yy"5072 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[( 1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); }5057 #line 429 "parser.yy" 5058 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5073 5059 break; 5074 5060 … … 5076 5062 5077 5063 /* Line 1806 of yacc.c */ 5078 #line 43 2"parser.yy"5079 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[( 1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }5064 #line 431 "parser.yy" 5065 { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5080 5066 break; 5081 5067 … … 5083 5069 5084 5070 /* Line 1806 of yacc.c */ 5085 #line 43 4"parser.yy"5086 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[( 1) - (3)].en), maybeMoveBuild<Expression>( (yyvsp[(3) - (3)].en) ) ) ); }5071 #line 433 "parser.yy" 5072 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); } 5087 5073 break; 5088 5074 … … 5090 5076 5091 5077 /* Line 1806 of yacc.c */ 5092 #line 43 6"parser.yy"5093 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[( 1) - (7)].en), build_tuple( (yyvsp[(5) - (7)].en) ) ) ); }5078 #line 435 "parser.yy" 5079 { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); } 5094 5080 break; 5095 5081 … … 5097 5083 5098 5084 /* Line 1806 of yacc.c */ 5099 #line 44 1"parser.yy"5100 { (yyval. en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (2)].tok) )); }5085 #line 440 "parser.yy" 5086 { (yyval.tok) = (yyvsp[(1) - (2)].tok); } 5101 5087 break; 5102 5088 … … 5104 5090 5105 5091 /* Line 1806 of yacc.c */ 5106 #line 44 3"parser.yy"5107 { (yyval. en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (2)].tok) )); }5092 #line 442 "parser.yy" 5093 { (yyval.tok) = (yyvsp[(1) - (2)].tok); } 5108 5094 break; 5109 5095 … … 5111 5097 5112 5098 /* Line 1806 of yacc.c */ 5113 #line 44 5"parser.yy"5114 { (yyval. en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) )); }5099 #line 444 "parser.yy" 5100 { (yyval.tok) = (yyvsp[(1) - (2)].tok); } 5115 5101 break; 5116 5102 … … 5118 5104 5119 5105 /* Line 1806 of yacc.c */ 5120 #line 45 8"parser.yy"5106 #line 457 "parser.yy" 5121 5107 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5122 5108 break; … … 5125 5111 5126 5112 /* Line 1806 of yacc.c */ 5127 #line 4 60"parser.yy"5113 #line 459 "parser.yy" 5128 5114 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 5129 5115 break; … … 5132 5118 5133 5119 /* Line 1806 of yacc.c */ 5134 #line 46 2"parser.yy"5120 #line 461 "parser.yy" 5135 5121 { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); } 5136 5122 break; … … 5139 5125 5140 5126 /* Line 1806 of yacc.c */ 5141 #line 46 7"parser.yy"5127 #line 466 "parser.yy" 5142 5128 { 5143 5129 switch ( (yyvsp[(1) - (2)].op) ) { … … 5157 5143 5158 5144 /* Line 1806 of yacc.c */ 5159 #line 4 80"parser.yy"5145 #line 479 "parser.yy" 5160 5146 { (yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) ); } 5161 5147 break; … … 5164 5150 5165 5151 /* Line 1806 of yacc.c */ 5166 #line 48 2"parser.yy"5152 #line 481 "parser.yy" 5167 5153 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Incr, (yyvsp[(2) - (2)].en) ) ); } 5168 5154 break; … … 5171 5157 5172 5158 /* Line 1806 of yacc.c */ 5173 #line 48 4"parser.yy"5159 #line 483 "parser.yy" 5174 5160 { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Decr, (yyvsp[(2) - (2)].en) ) ); } 5175 5161 break; … … 5178 5164 5179 5165 /* Line 1806 of yacc.c */ 5180 #line 48 6"parser.yy"5166 #line 485 "parser.yy" 5181 5167 { (yyval.en) = new ExpressionNode( build_sizeOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5182 5168 break; … … 5185 5171 5186 5172 /* Line 1806 of yacc.c */ 5187 #line 48 8"parser.yy"5173 #line 487 "parser.yy" 5188 5174 { (yyval.en) = new ExpressionNode( build_sizeOftype( (yyvsp[(3) - (4)].decl) ) ); } 5189 5175 break; … … 5192 5178 5193 5179 /* Line 1806 of yacc.c */ 5194 #line 4 90"parser.yy"5180 #line 489 "parser.yy" 5195 5181 { (yyval.en) = new ExpressionNode( build_alignOfexpr( (yyvsp[(2) - (2)].en) ) ); } 5196 5182 break; … … 5199 5185 5200 5186 /* Line 1806 of yacc.c */ 5201 #line 49 2"parser.yy"5187 #line 491 "parser.yy" 5202 5188 { (yyval.en) = new ExpressionNode( build_alignOftype( (yyvsp[(3) - (4)].decl) ) ); } 5203 5189 break; … … 5206 5192 5207 5193 /* Line 1806 of yacc.c */ 5208 #line 49 4"parser.yy"5194 #line 493 "parser.yy" 5209 5195 { (yyval.en) = new ExpressionNode( build_offsetOf( (yyvsp[(3) - (6)].decl), build_varref( (yyvsp[(5) - (6)].tok) ) ) ); } 5210 5196 break; … … 5213 5199 5214 5200 /* Line 1806 of yacc.c */ 5215 #line 49 6"parser.yy"5201 #line 495 "parser.yy" 5216 5202 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (1)].tok) ), nullptr ) ); } 5217 5203 break; … … 5220 5206 5221 5207 /* Line 1806 of yacc.c */ 5222 #line 49 8"parser.yy"5208 #line 497 "parser.yy" 5223 5209 { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ) ); } 5224 5210 break; … … 5227 5213 5228 5214 /* Line 1806 of yacc.c */ 5229 #line 500"parser.yy"5215 #line 499 "parser.yy" 5230 5216 { (yyval.en) = new ExpressionNode( build_attrtype( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].decl) ) ); } 5231 5217 break; … … 5234 5220 5235 5221 /* Line 1806 of yacc.c */ 5222 #line 505 "parser.yy" 5223 { (yyval.op) = OperKinds::PointTo; } 5224 break; 5225 5226 case 73: 5227 5228 /* Line 1806 of yacc.c */ 5236 5229 #line 506 "parser.yy" 5237 { (yyval.op) = OperKinds::PointTo; }5238 break;5239 5240 case 73:5241 5242 /* Line 1806 of yacc.c */5243 #line 507 "parser.yy"5244 5230 { (yyval.op) = OperKinds::AddressOf; } 5245 5231 break; … … 5248 5234 5249 5235 /* Line 1806 of yacc.c */ 5236 #line 512 "parser.yy" 5237 { (yyval.op) = OperKinds::UnPlus; } 5238 break; 5239 5240 case 75: 5241 5242 /* Line 1806 of yacc.c */ 5250 5243 #line 513 "parser.yy" 5251 { (yyval.op) = OperKinds::Un Plus; }5252 break; 5253 5254 case 7 5:5244 { (yyval.op) = OperKinds::UnMinus; } 5245 break; 5246 5247 case 76: 5255 5248 5256 5249 /* Line 1806 of yacc.c */ 5257 5250 #line 514 "parser.yy" 5258 { (yyval.op) = OperKinds:: UnMinus; }5259 break; 5260 5261 case 7 6:5251 { (yyval.op) = OperKinds::Neg; } 5252 break; 5253 5254 case 77: 5262 5255 5263 5256 /* Line 1806 of yacc.c */ 5264 5257 #line 515 "parser.yy" 5265 { (yyval.op) = OperKinds::Neg; }5266 break;5267 5268 case 77:5269 5270 /* Line 1806 of yacc.c */5271 #line 516 "parser.yy"5272 5258 { (yyval.op) = OperKinds::BitNeg; } 5273 5259 break; … … 5276 5262 5277 5263 /* Line 1806 of yacc.c */ 5278 #line 52 2"parser.yy"5264 #line 521 "parser.yy" 5279 5265 { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); } 5280 5266 break; … … 5283 5269 5284 5270 /* Line 1806 of yacc.c */ 5285 #line 5 30"parser.yy"5271 #line 529 "parser.yy" 5286 5272 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5287 5273 break; … … 5290 5276 5291 5277 /* Line 1806 of yacc.c */ 5292 #line 53 2"parser.yy"5278 #line 531 "parser.yy" 5293 5279 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5294 5280 break; … … 5297 5283 5298 5284 /* Line 1806 of yacc.c */ 5299 #line 53 4"parser.yy"5285 #line 533 "parser.yy" 5300 5286 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5301 5287 break; … … 5304 5290 5305 5291 /* Line 1806 of yacc.c */ 5306 #line 5 40"parser.yy"5292 #line 539 "parser.yy" 5307 5293 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5308 5294 break; … … 5311 5297 5312 5298 /* Line 1806 of yacc.c */ 5313 #line 54 2"parser.yy"5299 #line 541 "parser.yy" 5314 5300 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5315 5301 break; … … 5318 5304 5319 5305 /* Line 1806 of yacc.c */ 5320 #line 54 8"parser.yy"5306 #line 547 "parser.yy" 5321 5307 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5322 5308 break; … … 5325 5311 5326 5312 /* Line 1806 of yacc.c */ 5327 #line 5 50"parser.yy"5313 #line 549 "parser.yy" 5328 5314 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5329 5315 break; … … 5332 5318 5333 5319 /* Line 1806 of yacc.c */ 5334 #line 55 6"parser.yy"5320 #line 555 "parser.yy" 5335 5321 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5336 5322 break; … … 5339 5325 5340 5326 /* Line 1806 of yacc.c */ 5341 #line 55 8"parser.yy"5327 #line 557 "parser.yy" 5342 5328 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5343 5329 break; … … 5346 5332 5347 5333 /* Line 1806 of yacc.c */ 5348 #line 5 60"parser.yy"5334 #line 559 "parser.yy" 5349 5335 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5350 5336 break; … … 5353 5339 5354 5340 /* Line 1806 of yacc.c */ 5355 #line 56 2"parser.yy"5341 #line 561 "parser.yy" 5356 5342 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5357 5343 break; … … 5360 5346 5361 5347 /* Line 1806 of yacc.c */ 5362 #line 56 8"parser.yy"5348 #line 567 "parser.yy" 5363 5349 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5364 5350 break; … … 5367 5353 5368 5354 /* Line 1806 of yacc.c */ 5369 #line 5 70"parser.yy"5355 #line 569 "parser.yy" 5370 5356 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5371 5357 break; … … 5374 5360 5375 5361 /* Line 1806 of yacc.c */ 5376 #line 57 6"parser.yy"5362 #line 575 "parser.yy" 5377 5363 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5378 5364 break; … … 5381 5367 5382 5368 /* Line 1806 of yacc.c */ 5383 #line 58 2"parser.yy"5369 #line 581 "parser.yy" 5384 5370 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5385 5371 break; … … 5388 5374 5389 5375 /* Line 1806 of yacc.c */ 5390 #line 58 8"parser.yy"5376 #line 587 "parser.yy" 5391 5377 { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5392 5378 break; … … 5395 5381 5396 5382 /* Line 1806 of yacc.c */ 5397 #line 59 4"parser.yy"5383 #line 593 "parser.yy" 5398 5384 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); } 5399 5385 break; … … 5402 5388 5403 5389 /* Line 1806 of yacc.c */ 5404 #line 600"parser.yy"5390 #line 599 "parser.yy" 5405 5391 { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); } 5406 5392 break; … … 5409 5395 5410 5396 /* Line 1806 of yacc.c */ 5411 #line 60 6"parser.yy"5397 #line 605 "parser.yy" 5412 5398 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); } 5413 5399 break; … … 5416 5402 5417 5403 /* Line 1806 of yacc.c */ 5418 #line 60 9"parser.yy"5404 #line 608 "parser.yy" 5419 5405 { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); } 5420 5406 break; … … 5423 5409 5424 5410 /* Line 1806 of yacc.c */ 5425 #line 62 2"parser.yy"5411 #line 621 "parser.yy" 5426 5412 { (yyval.en) = new ExpressionNode( build_binary_ptr( (yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5427 5413 break; … … 5430 5416 5431 5417 /* Line 1806 of yacc.c */ 5432 #line 62 9"parser.yy"5418 #line 628 "parser.yy" 5433 5419 { (yyval.en) = nullptr; } 5434 5420 break; … … 5437 5423 5438 5424 /* Line 1806 of yacc.c */ 5425 #line 633 "parser.yy" 5426 { (yyval.op) = OperKinds::Assign; } 5427 break; 5428 5429 case 117: 5430 5431 /* Line 1806 of yacc.c */ 5439 5432 #line 634 "parser.yy" 5440 { (yyval.op) = OperKinds::A ssign; }5441 break; 5442 5443 case 11 7:5433 { (yyval.op) = OperKinds::AtAssn; } 5434 break; 5435 5436 case 118: 5444 5437 5445 5438 /* Line 1806 of yacc.c */ 5446 5439 #line 635 "parser.yy" 5447 { (yyval.op) = OperKinds:: AtAssn; }5448 break; 5449 5450 case 11 8:5440 { (yyval.op) = OperKinds::MulAssn; } 5441 break; 5442 5443 case 119: 5451 5444 5452 5445 /* Line 1806 of yacc.c */ 5453 5446 #line 636 "parser.yy" 5454 { (yyval.op) = OperKinds:: MulAssn; }5455 break; 5456 5457 case 1 19:5447 { (yyval.op) = OperKinds::DivAssn; } 5448 break; 5449 5450 case 120: 5458 5451 5459 5452 /* Line 1806 of yacc.c */ 5460 5453 #line 637 "parser.yy" 5461 { (yyval.op) = OperKinds:: DivAssn; }5462 break; 5463 5464 case 12 0:5454 { (yyval.op) = OperKinds::ModAssn; } 5455 break; 5456 5457 case 121: 5465 5458 5466 5459 /* Line 1806 of yacc.c */ 5467 5460 #line 638 "parser.yy" 5468 { (yyval.op) = OperKinds:: ModAssn; }5469 break; 5470 5471 case 12 1:5461 { (yyval.op) = OperKinds::PlusAssn; } 5462 break; 5463 5464 case 122: 5472 5465 5473 5466 /* Line 1806 of yacc.c */ 5474 5467 #line 639 "parser.yy" 5475 { (yyval.op) = OperKinds:: PlusAssn; }5476 break; 5477 5478 case 12 2:5468 { (yyval.op) = OperKinds::MinusAssn; } 5469 break; 5470 5471 case 123: 5479 5472 5480 5473 /* Line 1806 of yacc.c */ 5481 5474 #line 640 "parser.yy" 5482 { (yyval.op) = OperKinds:: MinusAssn; }5483 break; 5484 5485 case 12 3:5475 { (yyval.op) = OperKinds::LSAssn; } 5476 break; 5477 5478 case 124: 5486 5479 5487 5480 /* Line 1806 of yacc.c */ 5488 5481 #line 641 "parser.yy" 5489 { (yyval.op) = OperKinds:: LSAssn; }5490 break; 5491 5492 case 12 4:5482 { (yyval.op) = OperKinds::RSAssn; } 5483 break; 5484 5485 case 125: 5493 5486 5494 5487 /* Line 1806 of yacc.c */ 5495 5488 #line 642 "parser.yy" 5496 { (yyval.op) = OperKinds:: RSAssn; }5497 break; 5498 5499 case 12 5:5489 { (yyval.op) = OperKinds::AndAssn; } 5490 break; 5491 5492 case 126: 5500 5493 5501 5494 /* Line 1806 of yacc.c */ 5502 5495 #line 643 "parser.yy" 5503 { (yyval.op) = OperKinds:: AndAssn; }5504 break; 5505 5506 case 12 6:5496 { (yyval.op) = OperKinds::ERAssn; } 5497 break; 5498 5499 case 127: 5507 5500 5508 5501 /* Line 1806 of yacc.c */ 5509 5502 #line 644 "parser.yy" 5510 { (yyval.op) = OperKinds::ERAssn; }5511 break;5512 5513 case 127:5514 5515 /* Line 1806 of yacc.c */5516 #line 645 "parser.yy"5517 5503 { (yyval.op) = OperKinds::OrAssn; } 5518 5504 break; … … 5521 5507 5522 5508 /* Line 1806 of yacc.c */ 5523 #line 65 6"parser.yy"5509 #line 655 "parser.yy" 5524 5510 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( (yyvsp[(4) - (6)].en) ) ) ); } 5525 5511 break; … … 5528 5514 5529 5515 /* Line 1806 of yacc.c */ 5530 #line 65 8"parser.yy"5516 #line 657 "parser.yy" 5531 5517 { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_last( (yyvsp[(5) - (7)].en) ) ) ); } 5532 5518 break; … … 5535 5521 5536 5522 /* Line 1806 of yacc.c */ 5537 #line 66 4"parser.yy"5523 #line 663 "parser.yy" 5538 5524 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 5539 5525 break; … … 5542 5528 5543 5529 /* Line 1806 of yacc.c */ 5544 #line 6 70"parser.yy"5530 #line 669 "parser.yy" 5545 5531 { (yyval.en) = new ExpressionNode( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5546 5532 break; … … 5549 5535 5550 5536 /* Line 1806 of yacc.c */ 5551 #line 67 5"parser.yy"5537 #line 674 "parser.yy" 5552 5538 { (yyval.en) = 0; } 5553 5539 break; … … 5556 5542 5557 5543 /* Line 1806 of yacc.c */ 5558 #line 68 4"parser.yy"5544 #line 683 "parser.yy" 5559 5545 { (yyval.sn) = (yyvsp[(1) - (1)].sn); } 5560 5546 break; … … 5563 5549 5564 5550 /* Line 1806 of yacc.c */ 5565 #line 69 1"parser.yy"5551 #line 690 "parser.yy" 5566 5552 { 5567 5553 Token fn; … … 5574 5560 5575 5561 /* Line 1806 of yacc.c */ 5576 #line 70 1"parser.yy"5562 #line 700 "parser.yy" 5577 5563 { 5578 5564 (yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) ); … … 5583 5569 5584 5570 /* Line 1806 of yacc.c */ 5585 #line 70 8"parser.yy"5571 #line 707 "parser.yy" 5586 5572 { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); } 5587 5573 break; … … 5590 5576 5591 5577 /* Line 1806 of yacc.c */ 5592 #line 71 5"parser.yy"5578 #line 714 "parser.yy" 5593 5579 { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); } 5594 5580 break; … … 5597 5583 5598 5584 /* Line 1806 of yacc.c */ 5599 #line 72 1"parser.yy"5585 #line 720 "parser.yy" 5600 5586 { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } } 5601 5587 break; … … 5604 5590 5605 5591 /* Line 1806 of yacc.c */ 5606 #line 72 6"parser.yy"5592 #line 725 "parser.yy" 5607 5593 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5608 5594 break; … … 5611 5597 5612 5598 /* Line 1806 of yacc.c */ 5613 #line 72 8"parser.yy"5599 #line 727 "parser.yy" 5614 5600 { // mark all fields in list 5615 5601 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 5622 5608 5623 5609 /* Line 1806 of yacc.c */ 5624 #line 73 4"parser.yy"5610 #line 733 "parser.yy" 5625 5611 { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); } 5626 5612 break; … … 5629 5615 5630 5616 /* Line 1806 of yacc.c */ 5631 #line 74 1"parser.yy"5617 #line 740 "parser.yy" 5632 5618 { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } } 5633 5619 break; … … 5636 5622 5637 5623 /* Line 1806 of yacc.c */ 5638 #line 74 6"parser.yy"5624 #line 745 "parser.yy" 5639 5625 { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); } 5640 5626 break; … … 5643 5629 5644 5630 /* Line 1806 of yacc.c */ 5645 #line 75 2"parser.yy"5631 #line 751 "parser.yy" 5646 5632 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); } 5647 5633 break; … … 5650 5636 5651 5637 /* Line 1806 of yacc.c */ 5652 #line 75 4"parser.yy"5638 #line 753 "parser.yy" 5653 5639 { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); } 5654 5640 break; … … 5657 5643 5658 5644 /* Line 1806 of yacc.c */ 5659 #line 75 6"parser.yy"5645 #line 755 "parser.yy" 5660 5646 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5661 5647 break; … … 5664 5650 5665 5651 /* Line 1806 of yacc.c */ 5666 #line 75 8"parser.yy"5652 #line 757 "parser.yy" 5667 5653 { 5668 5654 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5679 5665 5680 5666 /* Line 1806 of yacc.c */ 5681 #line 76 8"parser.yy"5667 #line 767 "parser.yy" 5682 5668 { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5683 5669 break; … … 5686 5672 5687 5673 /* Line 1806 of yacc.c */ 5688 #line 7 70"parser.yy"5674 #line 769 "parser.yy" 5689 5675 { 5690 5676 StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) ); … … 5696 5682 5697 5683 /* Line 1806 of yacc.c */ 5698 #line 7 80"parser.yy"5684 #line 779 "parser.yy" 5699 5685 { (yyval.en) = (yyvsp[(1) - (1)].en); } 5700 5686 break; … … 5703 5689 5704 5690 /* Line 1806 of yacc.c */ 5705 #line 78 2"parser.yy"5691 #line 781 "parser.yy" 5706 5692 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 5707 5693 break; … … 5710 5696 5711 5697 /* Line 1806 of yacc.c */ 5712 #line 78 7"parser.yy"5698 #line 786 "parser.yy" 5713 5699 { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); } 5714 5700 break; … … 5717 5703 5718 5704 /* Line 1806 of yacc.c */ 5719 #line 78 9"parser.yy"5705 #line 788 "parser.yy" 5720 5706 { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); } 5721 5707 break; … … 5724 5710 5725 5711 /* Line 1806 of yacc.c */ 5712 #line 792 "parser.yy" 5713 { (yyval.sn) = (yyvsp[(2) - (3)].sn); } 5714 break; 5715 5716 case 169: 5717 5718 /* Line 1806 of yacc.c */ 5726 5719 #line 793 "parser.yy" 5727 { (yyval.sn) = (yyvsp[(2) - (3)].sn); }5728 break;5729 5730 case 169:5731 5732 /* Line 1806 of yacc.c */5733 #line 794 "parser.yy"5734 5720 { (yyval.sn) = new StatementNode( build_default() ); } 5735 5721 break; … … 5738 5724 5739 5725 /* Line 1806 of yacc.c */ 5740 #line 800"parser.yy"5726 #line 799 "parser.yy" 5741 5727 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) )); } 5742 5728 break; … … 5745 5731 5746 5732 /* Line 1806 of yacc.c */ 5747 #line 80 4"parser.yy"5733 #line 803 "parser.yy" 5748 5734 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5749 5735 break; … … 5752 5738 5753 5739 /* Line 1806 of yacc.c */ 5754 #line 80 9"parser.yy"5740 #line 808 "parser.yy" 5755 5741 { (yyval.sn) = 0; } 5756 5742 break; … … 5759 5745 5760 5746 /* Line 1806 of yacc.c */ 5761 #line 81 5"parser.yy"5747 #line 814 "parser.yy" 5762 5748 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); } 5763 5749 break; … … 5766 5752 5767 5753 /* Line 1806 of yacc.c */ 5768 #line 81 7"parser.yy"5754 #line 816 "parser.yy" 5769 5755 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); } 5770 5756 break; … … 5773 5759 5774 5760 /* Line 1806 of yacc.c */ 5775 #line 82 2"parser.yy"5761 #line 821 "parser.yy" 5776 5762 { (yyval.sn) = 0; } 5777 5763 break; … … 5780 5766 5781 5767 /* Line 1806 of yacc.c */ 5782 #line 82 8"parser.yy"5768 #line 827 "parser.yy" 5783 5769 { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); } 5784 5770 break; … … 5787 5773 5788 5774 /* Line 1806 of yacc.c */ 5789 #line 8 30"parser.yy"5775 #line 829 "parser.yy" 5790 5776 { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); } 5791 5777 break; … … 5794 5780 5795 5781 /* Line 1806 of yacc.c */ 5796 #line 83 2"parser.yy"5782 #line 831 "parser.yy" 5797 5783 { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); } 5798 5784 break; … … 5801 5787 5802 5788 /* Line 1806 of yacc.c */ 5803 #line 83 4"parser.yy"5789 #line 833 "parser.yy" 5804 5790 { (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) ) ) ) ) ) ); } 5805 5791 break; … … 5808 5794 5809 5795 /* Line 1806 of yacc.c */ 5810 #line 83 9"parser.yy"5796 #line 838 "parser.yy" 5811 5797 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 5812 5798 break; … … 5815 5801 5816 5802 /* Line 1806 of yacc.c */ 5817 #line 84 5"parser.yy"5803 #line 844 "parser.yy" 5818 5804 { (yyval.sn) = 0; } 5819 5805 break; … … 5822 5808 5823 5809 /* Line 1806 of yacc.c */ 5824 #line 84 7"parser.yy"5810 #line 846 "parser.yy" 5825 5811 { (yyval.sn) = 0; } 5826 5812 break; … … 5829 5815 5830 5816 /* Line 1806 of yacc.c */ 5831 #line 85 2"parser.yy"5817 #line 851 "parser.yy" 5832 5818 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); } 5833 5819 break; … … 5836 5822 5837 5823 /* Line 1806 of yacc.c */ 5838 #line 85 4"parser.yy"5824 #line 853 "parser.yy" 5839 5825 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn), true ) ); } 5840 5826 break; … … 5843 5829 5844 5830 /* Line 1806 of yacc.c */ 5845 #line 85 6"parser.yy"5831 #line 855 "parser.yy" 5846 5832 { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); } 5847 5833 break; … … 5850 5836 5851 5837 /* Line 1806 of yacc.c */ 5852 #line 86 1"parser.yy"5838 #line 860 "parser.yy" 5853 5839 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); } 5854 5840 break; … … 5857 5843 5858 5844 /* Line 1806 of yacc.c */ 5859 #line 86 3"parser.yy"5845 #line 862 "parser.yy" 5860 5846 { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); } 5861 5847 break; … … 5864 5850 5865 5851 /* Line 1806 of yacc.c */ 5866 #line 86 8"parser.yy"5852 #line 867 "parser.yy" 5867 5853 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); } 5868 5854 break; … … 5871 5857 5872 5858 /* Line 1806 of yacc.c */ 5873 #line 87 2"parser.yy"5859 #line 871 "parser.yy" 5874 5860 { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); } 5875 5861 break; … … 5878 5864 5879 5865 /* Line 1806 of yacc.c */ 5880 #line 87 5"parser.yy"5866 #line 874 "parser.yy" 5881 5867 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Continue ) ); } 5882 5868 break; … … 5885 5871 5886 5872 /* Line 1806 of yacc.c */ 5887 #line 87 9"parser.yy"5873 #line 878 "parser.yy" 5888 5874 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); } 5889 5875 break; … … 5892 5878 5893 5879 /* Line 1806 of yacc.c */ 5894 #line 88 2"parser.yy"5880 #line 881 "parser.yy" 5895 5881 { (yyval.sn) = new StatementNode( build_branch( BranchStmt::Break ) ); } 5896 5882 break; … … 5899 5885 5900 5886 /* Line 1806 of yacc.c */ 5901 #line 88 6"parser.yy"5887 #line 885 "parser.yy" 5902 5888 { (yyval.sn) = new StatementNode( build_branch( (yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); } 5903 5889 break; … … 5906 5892 5907 5893 /* Line 1806 of yacc.c */ 5908 #line 88 8"parser.yy"5894 #line 887 "parser.yy" 5909 5895 { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); } 5910 5896 break; … … 5913 5899 5914 5900 /* Line 1806 of yacc.c */ 5915 #line 8 90"parser.yy"5901 #line 889 "parser.yy" 5916 5902 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 5917 5903 break; … … 5920 5906 5921 5907 /* Line 1806 of yacc.c */ 5922 #line 89 2"parser.yy"5908 #line 891 "parser.yy" 5923 5909 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); } 5924 5910 break; … … 5927 5913 5928 5914 /* Line 1806 of yacc.c */ 5929 #line 89 4"parser.yy"5915 #line 893 "parser.yy" 5930 5916 { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); } 5931 5917 break; … … 5934 5920 5935 5921 /* Line 1806 of yacc.c */ 5936 #line 89 9"parser.yy"5922 #line 898 "parser.yy" 5937 5923 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); } 5938 5924 break; … … 5941 5927 5942 5928 /* Line 1806 of yacc.c */ 5943 #line 90 1"parser.yy"5929 #line 900 "parser.yy" 5944 5930 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); } 5945 5931 break; … … 5948 5934 5949 5935 /* Line 1806 of yacc.c */ 5950 #line 90 3"parser.yy"5936 #line 902 "parser.yy" 5951 5937 { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); } 5952 5938 break; … … 5955 5941 5956 5942 /* Line 1806 of yacc.c */ 5957 #line 9 10"parser.yy"5943 #line 909 "parser.yy" 5958 5944 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 5959 5945 break; … … 5962 5948 5963 5949 /* Line 1806 of yacc.c */ 5964 #line 91 2"parser.yy"5950 #line 911 "parser.yy" 5965 5951 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 5966 5952 break; … … 5969 5955 5970 5956 /* Line 1806 of yacc.c */ 5971 #line 91 4"parser.yy"5957 #line 913 "parser.yy" 5972 5958 { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); } 5973 5959 break; … … 5976 5962 5977 5963 /* Line 1806 of yacc.c */ 5978 #line 91 6"parser.yy"5964 #line 915 "parser.yy" 5979 5965 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); } 5980 5966 break; … … 5983 5969 5984 5970 /* Line 1806 of yacc.c */ 5985 #line 92 1"parser.yy"5971 #line 920 "parser.yy" 5986 5972 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 5987 5973 break; … … 5990 5976 5991 5977 /* Line 1806 of yacc.c */ 5992 #line 92 3"parser.yy"5978 #line 922 "parser.yy" 5993 5979 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 5994 5980 break; … … 5997 5983 5998 5984 /* Line 1806 of yacc.c */ 5999 #line 92 5"parser.yy"5985 #line 924 "parser.yy" 6000 5986 { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); } 6001 5987 break; … … 6004 5990 6005 5991 /* Line 1806 of yacc.c */ 6006 #line 92 7"parser.yy"5992 #line 926 "parser.yy" 6007 5993 { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); } 6008 5994 break; … … 6011 5997 6012 5998 /* Line 1806 of yacc.c */ 6013 #line 93 2"parser.yy"5999 #line 931 "parser.yy" 6014 6000 { 6015 6001 (yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) ); … … 6020 6006 6021 6007 /* Line 1806 of yacc.c */ 6022 #line 94 5"parser.yy"6008 #line 944 "parser.yy" 6023 6009 { 6024 6010 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6030 6016 6031 6017 /* Line 1806 of yacc.c */ 6032 #line 9 50"parser.yy"6018 #line 949 "parser.yy" 6033 6019 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 6034 6020 break; … … 6037 6023 6038 6024 /* Line 1806 of yacc.c */ 6039 #line 95 2"parser.yy"6025 #line 951 "parser.yy" 6040 6026 { 6041 6027 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6047 6033 6048 6034 /* Line 1806 of yacc.c */ 6049 #line 96 1"parser.yy"6035 #line 960 "parser.yy" 6050 6036 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); } 6051 6037 break; … … 6054 6040 6055 6041 /* Line 1806 of yacc.c */ 6056 #line 96 3"parser.yy"6042 #line 962 "parser.yy" 6057 6043 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); } 6058 6044 break; … … 6061 6047 6062 6048 /* Line 1806 of yacc.c */ 6063 #line 96 5"parser.yy"6049 #line 964 "parser.yy" 6064 6050 { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); } 6065 6051 break; … … 6068 6054 6069 6055 /* Line 1806 of yacc.c */ 6070 #line 96 7"parser.yy"6056 #line 966 "parser.yy" 6071 6057 { (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) ) ); } 6072 6058 break; … … 6075 6061 6076 6062 /* Line 1806 of yacc.c */ 6077 #line 96 9"parser.yy"6063 #line 968 "parser.yy" 6078 6064 { (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) ) ); } 6079 6065 break; … … 6082 6068 6083 6069 /* Line 1806 of yacc.c */ 6084 #line 97 4"parser.yy"6070 #line 973 "parser.yy" 6085 6071 { (yyval.flag) = false; } 6086 6072 break; … … 6089 6075 6090 6076 /* Line 1806 of yacc.c */ 6091 #line 97 6"parser.yy"6077 #line 975 "parser.yy" 6092 6078 { (yyval.flag) = true; } 6093 6079 break; … … 6096 6082 6097 6083 /* Line 1806 of yacc.c */ 6098 #line 98 1"parser.yy"6084 #line 980 "parser.yy" 6099 6085 { (yyval.en) = 0; } 6100 6086 break; … … 6103 6089 6104 6090 /* Line 1806 of yacc.c */ 6105 #line 98 8"parser.yy"6091 #line 987 "parser.yy" 6106 6092 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); } 6107 6093 break; … … 6110 6096 6111 6097 /* Line 1806 of yacc.c */ 6112 #line 99 3"parser.yy"6098 #line 992 "parser.yy" 6113 6099 { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); } 6114 6100 break; … … 6117 6103 6118 6104 /* Line 1806 of yacc.c */ 6119 #line 99 5"parser.yy"6105 #line 994 "parser.yy" 6120 6106 { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); } 6121 6107 break; … … 6124 6110 6125 6111 /* Line 1806 of yacc.c */ 6126 #line 1000"parser.yy"6112 #line 999 "parser.yy" 6127 6113 { (yyval.en) = 0; } 6128 6114 break; … … 6131 6117 6132 6118 /* Line 1806 of yacc.c */ 6133 #line 100 2"parser.yy"6119 #line 1001 "parser.yy" 6134 6120 { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); } 6135 6121 break; … … 6138 6124 6139 6125 /* Line 1806 of yacc.c */ 6140 #line 100 4"parser.yy"6126 #line 1003 "parser.yy" 6141 6127 { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( (yyvsp[(3) - (3)].constant) ) ); } 6142 6128 break; … … 6145 6131 6146 6132 /* Line 1806 of yacc.c */ 6147 #line 100 9"parser.yy"6133 #line 1008 "parser.yy" 6148 6134 { 6149 6135 (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) ); … … 6155 6141 6156 6142 /* Line 1806 of yacc.c */ 6157 #line 101 4"parser.yy"6143 #line 1013 "parser.yy" 6158 6144 { 6159 6145 (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) ); … … 6165 6151 6166 6152 /* Line 1806 of yacc.c */ 6167 #line 102 4"parser.yy"6153 #line 1023 "parser.yy" 6168 6154 { (yyval.decl) = 0; } 6169 6155 break; … … 6172 6158 6173 6159 /* Line 1806 of yacc.c */ 6174 #line 103 1"parser.yy"6160 #line 1030 "parser.yy" 6175 6161 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6176 6162 break; … … 6179 6165 6180 6166 /* Line 1806 of yacc.c */ 6181 #line 103 6"parser.yy"6167 #line 1035 "parser.yy" 6182 6168 { (yyval.decl) = 0; } 6183 6169 break; … … 6186 6172 6187 6173 /* Line 1806 of yacc.c */ 6188 #line 104 3"parser.yy"6174 #line 1042 "parser.yy" 6189 6175 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 6190 6176 break; 6191 6177 6192 6178 case 250: 6179 6180 /* Line 1806 of yacc.c */ 6181 #line 1056 "parser.yy" 6182 {} 6183 break; 6184 6185 case 251: 6193 6186 6194 6187 /* Line 1806 of yacc.c */ … … 6197 6190 break; 6198 6191 6199 case 251:6200 6201 /* Line 1806 of yacc.c */6202 #line 1058 "parser.yy"6203 {}6204 break;6205 6206 6192 case 259: 6207 6193 6208 6194 /* Line 1806 of yacc.c */ 6209 #line 108 7"parser.yy"6195 #line 1086 "parser.yy" 6210 6196 { 6211 6197 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6217 6203 6218 6204 /* Line 1806 of yacc.c */ 6219 #line 109 4"parser.yy"6205 #line 1093 "parser.yy" 6220 6206 { 6221 6207 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6227 6213 6228 6214 /* Line 1806 of yacc.c */ 6229 #line 109 9"parser.yy"6215 #line 1098 "parser.yy" 6230 6216 { 6231 6217 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID ); … … 6237 6223 6238 6224 /* Line 1806 of yacc.c */ 6239 #line 110 9"parser.yy"6225 #line 1108 "parser.yy" 6240 6226 { 6241 6227 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6247 6233 6248 6234 /* Line 1806 of yacc.c */ 6249 #line 111 4"parser.yy"6235 #line 1113 "parser.yy" 6250 6236 { 6251 6237 typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) ); … … 6257 6243 6258 6244 /* Line 1806 of yacc.c */ 6259 #line 111 9"parser.yy"6245 #line 1118 "parser.yy" 6260 6246 { 6261 6247 typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) ); … … 6267 6253 6268 6254 /* Line 1806 of yacc.c */ 6269 #line 112 7"parser.yy"6255 #line 1126 "parser.yy" 6270 6256 { 6271 6257 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6277 6263 6278 6264 /* Line 1806 of yacc.c */ 6279 #line 113 2"parser.yy"6265 #line 1131 "parser.yy" 6280 6266 { 6281 6267 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6287 6273 6288 6274 /* Line 1806 of yacc.c */ 6289 #line 113 7"parser.yy"6275 #line 1136 "parser.yy" 6290 6276 { 6291 6277 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6297 6283 6298 6284 /* Line 1806 of yacc.c */ 6299 #line 114 2"parser.yy"6285 #line 1141 "parser.yy" 6300 6286 { 6301 6287 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6307 6293 6308 6294 /* Line 1806 of yacc.c */ 6309 #line 114 7"parser.yy"6295 #line 1146 "parser.yy" 6310 6296 { 6311 6297 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 6317 6303 6318 6304 /* Line 1806 of yacc.c */ 6319 #line 117 8"parser.yy"6305 #line 1177 "parser.yy" 6320 6306 { 6321 6307 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6326 6312 6327 6313 /* Line 1806 of yacc.c */ 6328 #line 118 2"parser.yy"6314 #line 1181 "parser.yy" 6329 6315 { 6330 6316 (yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true ); … … 6335 6321 6336 6322 /* Line 1806 of yacc.c */ 6337 #line 118 9"parser.yy"6323 #line 1188 "parser.yy" 6338 6324 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 6339 6325 break; … … 6342 6328 6343 6329 /* Line 1806 of yacc.c */ 6344 #line 119 3"parser.yy"6330 #line 1192 "parser.yy" 6345 6331 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); } 6346 6332 break; … … 6349 6335 6350 6336 /* Line 1806 of yacc.c */ 6351 #line 119 8"parser.yy"6337 #line 1197 "parser.yy" 6352 6338 { 6353 6339 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6359 6345 6360 6346 /* Line 1806 of yacc.c */ 6361 #line 120 3"parser.yy"6347 #line 1202 "parser.yy" 6362 6348 { 6363 6349 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6369 6355 6370 6356 /* Line 1806 of yacc.c */ 6371 #line 120 8"parser.yy"6357 #line 1207 "parser.yy" 6372 6358 { 6373 6359 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD ); … … 6379 6365 6380 6366 /* Line 1806 of yacc.c */ 6381 #line 121 9"parser.yy"6367 #line 1218 "parser.yy" 6382 6368 { 6383 6369 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6389 6375 6390 6376 /* Line 1806 of yacc.c */ 6391 #line 122 4"parser.yy"6377 #line 1223 "parser.yy" 6392 6378 { 6393 6379 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6399 6385 6400 6386 /* Line 1806 of yacc.c */ 6401 #line 122 9"parser.yy"6387 #line 1228 "parser.yy" 6402 6388 { 6403 6389 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6409 6395 6410 6396 /* Line 1806 of yacc.c */ 6411 #line 123 4"parser.yy"6397 #line 1233 "parser.yy" 6412 6398 { 6413 6399 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6419 6405 6420 6406 /* Line 1806 of yacc.c */ 6421 #line 123 9"parser.yy"6407 #line 1238 "parser.yy" 6422 6408 { 6423 6409 typedefTable.addToEnclosingScope( TypedefTable::TD ); … … 6429 6415 6430 6416 /* Line 1806 of yacc.c */ 6431 #line 124 8"parser.yy"6417 #line 1247 "parser.yy" 6432 6418 { 6433 6419 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD ); … … 6439 6425 6440 6426 /* Line 1806 of yacc.c */ 6441 #line 125 3"parser.yy"6427 #line 1252 "parser.yy" 6442 6428 { 6443 6429 typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD ); … … 6449 6435 6450 6436 /* Line 1806 of yacc.c */ 6451 #line 12 70"parser.yy"6437 #line 1269 "parser.yy" 6452 6438 { 6453 6439 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6459 6445 6460 6446 /* Line 1806 of yacc.c */ 6461 #line 127 5"parser.yy"6447 #line 1274 "parser.yy" 6462 6448 { 6463 6449 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 6469 6455 6470 6456 /* Line 1806 of yacc.c */ 6471 #line 129 7"parser.yy"6457 #line 1296 "parser.yy" 6472 6458 { (yyval.decl) = 0; } 6473 6459 break; … … 6476 6462 6477 6463 /* Line 1806 of yacc.c */ 6478 #line 130 9"parser.yy"6464 #line 1308 "parser.yy" 6479 6465 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6480 6466 break; … … 6483 6469 6484 6470 /* Line 1806 of yacc.c */ 6485 #line 13 20"parser.yy"6471 #line 1319 "parser.yy" 6486 6472 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); } 6487 6473 break; … … 6490 6476 6491 6477 /* Line 1806 of yacc.c */ 6492 #line 132 2"parser.yy"6478 #line 1321 "parser.yy" 6493 6479 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); } 6494 6480 break; … … 6497 6483 6498 6484 /* Line 1806 of yacc.c */ 6499 #line 132 4"parser.yy"6485 #line 1323 "parser.yy" 6500 6486 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); } 6501 6487 break; … … 6504 6490 6505 6491 /* Line 1806 of yacc.c */ 6506 #line 132 6"parser.yy"6492 #line 1325 "parser.yy" 6507 6493 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); } 6508 6494 break; … … 6511 6497 6512 6498 /* Line 1806 of yacc.c */ 6513 #line 132 8"parser.yy"6499 #line 1327 "parser.yy" 6514 6500 { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); } 6515 6501 break; … … 6518 6504 6519 6505 /* Line 1806 of yacc.c */ 6520 #line 13 30"parser.yy"6506 #line 1329 "parser.yy" 6521 6507 { 6522 6508 typedefTable.enterScope(); … … 6527 6513 6528 6514 /* Line 1806 of yacc.c */ 6529 #line 133 4"parser.yy"6515 #line 1333 "parser.yy" 6530 6516 { 6531 6517 typedefTable.leaveScope(); … … 6537 6523 6538 6524 /* Line 1806 of yacc.c */ 6539 #line 134 3"parser.yy"6525 #line 1342 "parser.yy" 6540 6526 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6541 6527 break; … … 6544 6530 6545 6531 /* Line 1806 of yacc.c */ 6546 #line 134 5"parser.yy"6532 #line 1344 "parser.yy" 6547 6533 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6548 6534 break; … … 6551 6537 6552 6538 /* Line 1806 of yacc.c */ 6553 #line 135 6"parser.yy"6539 #line 1355 "parser.yy" 6554 6540 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6555 6541 break; … … 6558 6544 6559 6545 /* Line 1806 of yacc.c */ 6560 #line 136 1"parser.yy"6546 #line 1360 "parser.yy" 6561 6547 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); } 6562 6548 break; … … 6565 6551 6566 6552 /* Line 1806 of yacc.c */ 6567 #line 136 3"parser.yy"6553 #line 1362 "parser.yy" 6568 6554 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); } 6569 6555 break; … … 6572 6558 6573 6559 /* Line 1806 of yacc.c */ 6574 #line 136 5"parser.yy"6560 #line 1364 "parser.yy" 6575 6561 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); } 6576 6562 break; … … 6579 6565 6580 6566 /* Line 1806 of yacc.c */ 6581 #line 136 7"parser.yy"6567 #line 1366 "parser.yy" 6582 6568 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); } 6583 6569 break; … … 6586 6572 6587 6573 /* Line 1806 of yacc.c */ 6588 #line 13 70"parser.yy"6574 #line 1369 "parser.yy" 6589 6575 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isInline = true; } 6590 6576 break; … … 6593 6579 6594 6580 /* Line 1806 of yacc.c */ 6595 #line 137 2"parser.yy"6581 #line 1371 "parser.yy" 6596 6582 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); } 6597 6583 break; … … 6600 6586 6601 6587 /* Line 1806 of yacc.c */ 6602 #line 137 5"parser.yy"6588 #line 1374 "parser.yy" 6603 6589 { (yyval.decl) = new DeclarationNode; (yyval.decl)->isNoreturn = true; } 6604 6590 break; … … 6607 6593 6608 6594 /* Line 1806 of yacc.c */ 6609 #line 137 7"parser.yy"6595 #line 1376 "parser.yy" 6610 6596 { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); } 6611 6597 break; … … 6614 6600 6615 6601 /* Line 1806 of yacc.c */ 6616 #line 138 2"parser.yy"6602 #line 1381 "parser.yy" 6617 6603 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); } 6618 6604 break; … … 6621 6607 6622 6608 /* Line 1806 of yacc.c */ 6623 #line 138 4"parser.yy"6609 #line 1383 "parser.yy" 6624 6610 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); } 6625 6611 break; … … 6628 6614 6629 6615 /* Line 1806 of yacc.c */ 6630 #line 138 6"parser.yy"6616 #line 1385 "parser.yy" 6631 6617 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); } 6632 6618 break; … … 6635 6621 6636 6622 /* Line 1806 of yacc.c */ 6637 #line 138 8"parser.yy"6623 #line 1387 "parser.yy" 6638 6624 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); } 6639 6625 break; … … 6642 6628 6643 6629 /* Line 1806 of yacc.c */ 6644 #line 13 90"parser.yy"6630 #line 1389 "parser.yy" 6645 6631 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Long ); } 6646 6632 break; … … 6649 6635 6650 6636 /* Line 1806 of yacc.c */ 6651 #line 139 2"parser.yy"6637 #line 1391 "parser.yy" 6652 6638 { (yyval.decl) = DeclarationNode::newLength( DeclarationNode::Short ); } 6653 6639 break; … … 6656 6642 6657 6643 /* Line 1806 of yacc.c */ 6658 #line 139 4"parser.yy"6644 #line 1393 "parser.yy" 6659 6645 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Signed ); } 6660 6646 break; … … 6663 6649 6664 6650 /* Line 1806 of yacc.c */ 6665 #line 139 6"parser.yy"6651 #line 1395 "parser.yy" 6666 6652 { (yyval.decl) = DeclarationNode::newSignedNess( DeclarationNode::Unsigned ); } 6667 6653 break; … … 6670 6656 6671 6657 /* Line 1806 of yacc.c */ 6672 #line 139 8"parser.yy"6658 #line 1397 "parser.yy" 6673 6659 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); } 6674 6660 break; … … 6677 6663 6678 6664 /* Line 1806 of yacc.c */ 6679 #line 1 400"parser.yy"6665 #line 1399 "parser.yy" 6680 6666 { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); } 6681 6667 break; … … 6684 6670 6685 6671 /* Line 1806 of yacc.c */ 6686 #line 140 2"parser.yy"6672 #line 1401 "parser.yy" 6687 6673 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Complex ); } 6688 6674 break; … … 6691 6677 6692 6678 /* Line 1806 of yacc.c */ 6693 #line 140 4"parser.yy"6679 #line 1403 "parser.yy" 6694 6680 { (yyval.decl) = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); } 6695 6681 break; … … 6698 6684 6699 6685 /* Line 1806 of yacc.c */ 6700 #line 140 6"parser.yy"6686 #line 1405 "parser.yy" 6701 6687 { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); } 6702 6688 break; … … 6705 6691 6706 6692 /* Line 1806 of yacc.c */ 6707 #line 141 3"parser.yy"6693 #line 1412 "parser.yy" 6708 6694 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6709 6695 break; … … 6712 6698 6713 6699 /* Line 1806 of yacc.c */ 6714 #line 141 5"parser.yy"6700 #line 1414 "parser.yy" 6715 6701 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6716 6702 break; … … 6719 6705 6720 6706 /* Line 1806 of yacc.c */ 6721 #line 141 7"parser.yy"6707 #line 1416 "parser.yy" 6722 6708 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6723 6709 break; … … 6726 6712 6727 6713 /* Line 1806 of yacc.c */ 6728 #line 141 9"parser.yy"6714 #line 1418 "parser.yy" 6729 6715 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); } 6730 6716 break; … … 6733 6719 6734 6720 /* Line 1806 of yacc.c */ 6735 #line 142 5"parser.yy"6721 #line 1424 "parser.yy" 6736 6722 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6737 6723 break; … … 6740 6726 6741 6727 /* Line 1806 of yacc.c */ 6742 #line 143 2"parser.yy"6728 #line 1431 "parser.yy" 6743 6729 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6744 6730 break; … … 6747 6733 6748 6734 /* Line 1806 of yacc.c */ 6749 #line 143 4"parser.yy"6735 #line 1433 "parser.yy" 6750 6736 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6751 6737 break; … … 6754 6740 6755 6741 /* Line 1806 of yacc.c */ 6756 #line 143 6"parser.yy"6742 #line 1435 "parser.yy" 6757 6743 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); } 6758 6744 break; … … 6761 6747 6762 6748 /* Line 1806 of yacc.c */ 6763 #line 144 1"parser.yy"6749 #line 1440 "parser.yy" 6764 6750 { (yyval.decl) = (yyvsp[(3) - (4)].decl); } 6765 6751 break; … … 6768 6754 6769 6755 /* Line 1806 of yacc.c */ 6770 #line 144 3"parser.yy"6756 #line 1442 "parser.yy" 6771 6757 { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); } 6772 6758 break; … … 6775 6761 6776 6762 /* Line 1806 of yacc.c */ 6777 #line 144 5"parser.yy"6763 #line 1444 "parser.yy" 6778 6764 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); } 6779 6765 break; … … 6782 6768 6783 6769 /* Line 1806 of yacc.c */ 6784 #line 144 7"parser.yy"6770 #line 1446 "parser.yy" 6785 6771 { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 6786 6772 break; … … 6789 6775 6790 6776 /* Line 1806 of yacc.c */ 6791 #line 145 3"parser.yy"6777 #line 1452 "parser.yy" 6792 6778 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6793 6779 break; … … 6796 6782 6797 6783 /* Line 1806 of yacc.c */ 6798 #line 145 5"parser.yy"6784 #line 1454 "parser.yy" 6799 6785 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6800 6786 break; … … 6803 6789 6804 6790 /* Line 1806 of yacc.c */ 6805 #line 145 7"parser.yy"6791 #line 1456 "parser.yy" 6806 6792 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6807 6793 break; … … 6810 6796 6811 6797 /* Line 1806 of yacc.c */ 6812 #line 146 3"parser.yy"6798 #line 1462 "parser.yy" 6813 6799 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6814 6800 break; … … 6817 6803 6818 6804 /* Line 1806 of yacc.c */ 6819 #line 146 5"parser.yy"6805 #line 1464 "parser.yy" 6820 6806 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6821 6807 break; … … 6824 6810 6825 6811 /* Line 1806 of yacc.c */ 6826 #line 147 1"parser.yy"6812 #line 1470 "parser.yy" 6827 6813 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6828 6814 break; … … 6831 6817 6832 6818 /* Line 1806 of yacc.c */ 6833 #line 147 3"parser.yy"6819 #line 1472 "parser.yy" 6834 6820 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6835 6821 break; … … 6838 6824 6839 6825 /* Line 1806 of yacc.c */ 6840 #line 147 5"parser.yy"6826 #line 1474 "parser.yy" 6841 6827 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 6842 6828 break; … … 6845 6831 6846 6832 /* Line 1806 of yacc.c */ 6847 #line 14 80"parser.yy"6833 #line 1479 "parser.yy" 6848 6834 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); } 6849 6835 break; … … 6852 6838 6853 6839 /* Line 1806 of yacc.c */ 6854 #line 148 2"parser.yy"6840 #line 1481 "parser.yy" 6855 6841 { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 6856 6842 break; … … 6859 6845 6860 6846 /* Line 1806 of yacc.c */ 6861 #line 148 4"parser.yy"6847 #line 1483 "parser.yy" 6862 6848 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 6863 6849 break; … … 6866 6852 6867 6853 /* Line 1806 of yacc.c */ 6868 #line 149 4"parser.yy"6854 #line 1493 "parser.yy" 6869 6855 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), nullptr, nullptr, (yyvsp[(3) - (4)].decl), true ); } 6870 6856 break; … … 6873 6859 6874 6860 /* Line 1806 of yacc.c */ 6875 #line 149 6"parser.yy"6861 #line 1495 "parser.yy" 6876 6862 { 6877 6863 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 6883 6869 6884 6870 /* Line 1806 of yacc.c */ 6885 #line 150 1"parser.yy"6871 #line 1500 "parser.yy" 6886 6872 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 6887 6873 break; … … 6890 6876 6891 6877 /* Line 1806 of yacc.c */ 6892 #line 150 3"parser.yy"6878 #line 1502 "parser.yy" 6893 6879 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), nullptr, (yyvsp[(5) - (6)].decl), true ); } 6894 6880 break; … … 6897 6883 6898 6884 /* Line 1806 of yacc.c */ 6899 #line 150 5"parser.yy"6885 #line 1504 "parser.yy" 6900 6886 { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), nullptr, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); } 6901 6887 break; … … 6904 6890 6905 6891 /* Line 1806 of yacc.c */ 6906 #line 150 7"parser.yy"6892 #line 1506 "parser.yy" 6907 6893 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 6908 6894 break; … … 6911 6897 6912 6898 /* Line 1806 of yacc.c */ 6913 #line 151 2"parser.yy"6899 #line 1511 "parser.yy" 6914 6900 { (yyval.aggKey) = DeclarationNode::Struct; } 6915 6901 break; … … 6918 6904 6919 6905 /* Line 1806 of yacc.c */ 6920 #line 151 4"parser.yy"6906 #line 1513 "parser.yy" 6921 6907 { (yyval.aggKey) = DeclarationNode::Union; } 6922 6908 break; … … 6925 6911 6926 6912 /* Line 1806 of yacc.c */ 6927 #line 151 9"parser.yy"6913 #line 1518 "parser.yy" 6928 6914 { (yyval.decl) = 0; } 6929 6915 break; … … 6932 6918 6933 6919 /* Line 1806 of yacc.c */ 6934 #line 152 1"parser.yy"6920 #line 1520 "parser.yy" 6935 6921 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 6936 6922 break; … … 6939 6925 6940 6926 /* Line 1806 of yacc.c */ 6941 #line 152 7"parser.yy"6927 #line 1526 "parser.yy" 6942 6928 { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); } 6943 6929 break; … … 6946 6932 6947 6933 /* Line 1806 of yacc.c */ 6948 #line 15 30"parser.yy"6934 #line 1529 "parser.yy" 6949 6935 { // mark all fields in list 6950 6936 for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 6957 6943 6958 6944 /* Line 1806 of yacc.c */ 6959 #line 15 40"parser.yy"6945 #line 1539 "parser.yy" 6960 6946 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); } 6961 6947 break; … … 6964 6950 6965 6951 /* Line 1806 of yacc.c */ 6966 #line 154 2"parser.yy"6952 #line 1541 "parser.yy" 6967 6953 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); } 6968 6954 break; … … 6971 6957 6972 6958 /* Line 1806 of yacc.c */ 6973 #line 154 4"parser.yy"6959 #line 1543 "parser.yy" 6974 6960 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); } 6975 6961 break; … … 6978 6964 6979 6965 /* Line 1806 of yacc.c */ 6980 #line 154 9"parser.yy"6966 #line 1548 "parser.yy" 6981 6967 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 6982 6968 break; … … 6985 6971 6986 6972 /* Line 1806 of yacc.c */ 6987 #line 155 1"parser.yy"6973 #line 1550 "parser.yy" 6988 6974 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); } 6989 6975 break; … … 6992 6978 6993 6979 /* Line 1806 of yacc.c */ 6994 #line 155 6"parser.yy"6980 #line 1555 "parser.yy" 6995 6981 { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ } 6996 6982 break; … … 6999 6985 7000 6986 /* Line 1806 of yacc.c */ 7001 #line 155 8"parser.yy"6987 #line 1557 "parser.yy" 7002 6988 { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); } 7003 6989 break; … … 7006 6992 7007 6993 /* Line 1806 of yacc.c */ 7008 #line 156 1"parser.yy"6994 #line 1560 "parser.yy" 7009 6995 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); } 7010 6996 break; … … 7013 6999 7014 7000 /* Line 1806 of yacc.c */ 7015 #line 156 4"parser.yy"7001 #line 1563 "parser.yy" 7016 7002 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); } 7017 7003 break; … … 7020 7006 7021 7007 /* Line 1806 of yacc.c */ 7022 #line 15 70"parser.yy"7008 #line 1569 "parser.yy" 7023 7009 { (yyval.en) = 0; } 7024 7010 break; … … 7027 7013 7028 7014 /* Line 1806 of yacc.c */ 7029 #line 157 2"parser.yy"7015 #line 1571 "parser.yy" 7030 7016 { (yyval.en) = (yyvsp[(1) - (1)].en); } 7031 7017 break; … … 7034 7020 7035 7021 /* Line 1806 of yacc.c */ 7036 #line 157 7"parser.yy"7022 #line 1576 "parser.yy" 7037 7023 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7038 7024 break; … … 7041 7027 7042 7028 /* Line 1806 of yacc.c */ 7043 #line 158 6"parser.yy"7029 #line 1585 "parser.yy" 7044 7030 { (yyval.decl) = DeclarationNode::newEnum( nullptr, (yyvsp[(3) - (5)].decl) ); } 7045 7031 break; … … 7048 7034 7049 7035 /* Line 1806 of yacc.c */ 7050 #line 158 8"parser.yy"7036 #line 1587 "parser.yy" 7051 7037 { 7052 7038 typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); … … 7058 7044 7059 7045 /* Line 1806 of yacc.c */ 7060 #line 159 3"parser.yy"7046 #line 1592 "parser.yy" 7061 7047 { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); } 7062 7048 break; … … 7065 7051 7066 7052 /* Line 1806 of yacc.c */ 7067 #line 159 5"parser.yy"7053 #line 1594 "parser.yy" 7068 7054 { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); } 7069 7055 break; … … 7072 7058 7073 7059 /* Line 1806 of yacc.c */ 7074 #line 1 600"parser.yy"7060 #line 1599 "parser.yy" 7075 7061 { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); } 7076 7062 break; … … 7079 7065 7080 7066 /* Line 1806 of yacc.c */ 7081 #line 160 2"parser.yy"7067 #line 1601 "parser.yy" 7082 7068 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); } 7083 7069 break; … … 7086 7072 7087 7073 /* Line 1806 of yacc.c */ 7088 #line 160 7"parser.yy"7074 #line 1606 "parser.yy" 7089 7075 { (yyval.en) = 0; } 7090 7076 break; … … 7093 7079 7094 7080 /* Line 1806 of yacc.c */ 7095 #line 160 9"parser.yy"7081 #line 1608 "parser.yy" 7096 7082 { (yyval.en) = (yyvsp[(2) - (2)].en); } 7097 7083 break; … … 7100 7086 7101 7087 /* Line 1806 of yacc.c */ 7102 #line 161 6"parser.yy"7088 #line 1615 "parser.yy" 7103 7089 { (yyval.decl) = 0; } 7104 7090 break; … … 7107 7093 7108 7094 /* Line 1806 of yacc.c */ 7109 #line 162 4"parser.yy"7095 #line 1623 "parser.yy" 7110 7096 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7111 7097 break; … … 7114 7100 7115 7101 /* Line 1806 of yacc.c */ 7116 #line 162 6"parser.yy"7102 #line 1625 "parser.yy" 7117 7103 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7118 7104 break; … … 7121 7107 7122 7108 /* Line 1806 of yacc.c */ 7123 #line 162 8"parser.yy"7109 #line 1627 "parser.yy" 7124 7110 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7125 7111 break; … … 7128 7114 7129 7115 /* Line 1806 of yacc.c */ 7130 #line 163 6"parser.yy"7116 #line 1635 "parser.yy" 7131 7117 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7132 7118 break; … … 7135 7121 7136 7122 /* Line 1806 of yacc.c */ 7137 #line 163 8"parser.yy"7123 #line 1637 "parser.yy" 7138 7124 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7139 7125 break; … … 7142 7128 7143 7129 /* Line 1806 of yacc.c */ 7144 #line 16 40"parser.yy"7130 #line 1639 "parser.yy" 7145 7131 { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); } 7146 7132 break; … … 7149 7135 7150 7136 /* Line 1806 of yacc.c */ 7151 #line 164 6"parser.yy"7137 #line 1645 "parser.yy" 7152 7138 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7153 7139 break; … … 7156 7142 7157 7143 /* Line 1806 of yacc.c */ 7158 #line 165 1"parser.yy"7144 #line 1650 "parser.yy" 7159 7145 { (yyval.decl) = 0; } 7160 7146 break; … … 7163 7149 7164 7150 /* Line 1806 of yacc.c */ 7165 #line 165 8"parser.yy"7151 #line 1657 "parser.yy" 7166 7152 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); } 7167 7153 break; … … 7170 7156 7171 7157 /* Line 1806 of yacc.c */ 7172 #line 166 5"parser.yy"7158 #line 1664 "parser.yy" 7173 7159 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7174 7160 break; … … 7177 7163 7178 7164 /* Line 1806 of yacc.c */ 7179 #line 166 7"parser.yy"7165 #line 1666 "parser.yy" 7180 7166 { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); } 7181 7167 break; … … 7184 7170 7185 7171 /* Line 1806 of yacc.c */ 7186 #line 167 6"parser.yy"7172 #line 1675 "parser.yy" 7187 7173 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); } 7188 7174 break; … … 7191 7177 7192 7178 /* Line 1806 of yacc.c */ 7193 #line 167 9"parser.yy"7179 #line 1678 "parser.yy" 7194 7180 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); } 7195 7181 break; … … 7198 7184 7199 7185 /* Line 1806 of yacc.c */ 7200 #line 168 1"parser.yy"7186 #line 1680 "parser.yy" 7201 7187 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); } 7202 7188 break; … … 7205 7191 7206 7192 /* Line 1806 of yacc.c */ 7207 #line 169 1"parser.yy"7193 #line 1690 "parser.yy" 7208 7194 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7209 7195 break; … … 7212 7198 7213 7199 /* Line 1806 of yacc.c */ 7214 #line 169 7"parser.yy"7200 #line 1696 "parser.yy" 7215 7201 { 7216 7202 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7222 7208 7223 7209 /* Line 1806 of yacc.c */ 7224 #line 170 2"parser.yy"7210 #line 1701 "parser.yy" 7225 7211 { 7226 7212 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7232 7218 7233 7219 /* Line 1806 of yacc.c */ 7234 #line 171 1"parser.yy"7220 #line 1710 "parser.yy" 7235 7221 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7236 7222 break; … … 7239 7225 7240 7226 /* Line 1806 of yacc.c */ 7241 #line 17 20"parser.yy"7227 #line 1719 "parser.yy" 7242 7228 { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); } 7243 7229 break; … … 7246 7232 7247 7233 /* Line 1806 of yacc.c */ 7248 #line 172 2"parser.yy"7234 #line 1721 "parser.yy" 7249 7235 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); } 7250 7236 break; … … 7253 7239 7254 7240 /* Line 1806 of yacc.c */ 7255 #line 174 7"parser.yy"7241 #line 1746 "parser.yy" 7256 7242 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7257 7243 break; … … 7260 7246 7261 7247 /* Line 1806 of yacc.c */ 7262 #line 175 5"parser.yy"7248 #line 1754 "parser.yy" 7263 7249 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); } 7264 7250 break; … … 7267 7253 7268 7254 /* Line 1806 of yacc.c */ 7269 #line 17 60"parser.yy"7255 #line 1759 "parser.yy" 7270 7256 { (yyval.in) = 0; } 7271 7257 break; … … 7274 7260 7275 7261 /* Line 1806 of yacc.c */ 7276 #line 176 2"parser.yy"7262 #line 1761 "parser.yy" 7277 7263 { (yyval.in) = (yyvsp[(2) - (2)].in); } 7278 7264 break; … … 7281 7267 7282 7268 /* Line 1806 of yacc.c */ 7283 #line 176 4"parser.yy"7269 #line 1763 "parser.yy" 7284 7270 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); } 7285 7271 break; … … 7288 7274 7289 7275 /* Line 1806 of yacc.c */ 7276 #line 1767 "parser.yy" 7277 { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); } 7278 break; 7279 7280 case 462: 7281 7282 /* Line 1806 of yacc.c */ 7290 7283 #line 1768 "parser.yy" 7291 { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }7292 break;7293 7294 case 462:7295 7296 /* Line 1806 of yacc.c */7297 #line 1769 "parser.yy"7298 7284 { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); } 7299 7285 break; … … 7302 7288 7303 7289 /* Line 1806 of yacc.c */ 7304 #line 177 4"parser.yy"7290 #line 1773 "parser.yy" 7305 7291 { (yyval.in) = 0; } 7306 7292 break; … … 7309 7295 7310 7296 /* Line 1806 of yacc.c */ 7297 #line 1775 "parser.yy" 7298 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); } 7299 break; 7300 7301 case 466: 7302 7303 /* Line 1806 of yacc.c */ 7311 7304 #line 1776 "parser.yy" 7312 { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }7313 break;7314 7315 case 466:7316 7317 /* Line 1806 of yacc.c */7318 #line 1777 "parser.yy"7319 7305 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); } 7320 7306 break; … … 7323 7309 7324 7310 /* Line 1806 of yacc.c */ 7325 #line 177 9"parser.yy"7311 #line 1778 "parser.yy" 7326 7312 { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_last( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); } 7327 7313 break; … … 7330 7316 7331 7317 /* Line 1806 of yacc.c */ 7332 #line 179 5"parser.yy"7318 #line 1794 "parser.yy" 7333 7319 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) ) ); } 7334 7320 break; … … 7337 7323 7338 7324 /* Line 1806 of yacc.c */ 7339 #line 180 1"parser.yy"7325 #line 1800 "parser.yy" 7340 7326 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_last( (yyvsp[(2) - (2)].en) ) ); } 7341 7327 break; … … 7344 7330 7345 7331 /* Line 1806 of yacc.c */ 7346 #line 180 7"parser.yy"7332 #line 1806 "parser.yy" 7347 7333 { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); } 7348 7334 break; … … 7351 7337 7352 7338 /* Line 1806 of yacc.c */ 7353 #line 18 10"parser.yy"7339 #line 1809 "parser.yy" 7354 7340 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7355 7341 break; … … 7358 7344 7359 7345 /* Line 1806 of yacc.c */ 7360 #line 181 2"parser.yy"7346 #line 1811 "parser.yy" 7361 7347 { (yyval.en) = (yyvsp[(3) - (5)].en); } 7362 7348 break; … … 7365 7351 7366 7352 /* Line 1806 of yacc.c */ 7367 #line 181 4"parser.yy"7353 #line 1813 "parser.yy" 7368 7354 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ); } 7369 7355 break; … … 7372 7358 7373 7359 /* Line 1806 of yacc.c */ 7374 #line 181 6"parser.yy"7360 #line 1815 "parser.yy" 7375 7361 { (yyval.en) = (yyvsp[(4) - (6)].en); } 7376 7362 break; … … 7379 7365 7380 7366 /* Line 1806 of yacc.c */ 7381 #line 18 40"parser.yy"7367 #line 1839 "parser.yy" 7382 7368 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7383 7369 break; … … 7386 7372 7387 7373 /* Line 1806 of yacc.c */ 7388 #line 184 2"parser.yy"7374 #line 1841 "parser.yy" 7389 7375 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7390 7376 break; … … 7393 7379 7394 7380 /* Line 1806 of yacc.c */ 7395 #line 184 4"parser.yy"7381 #line 1843 "parser.yy" 7396 7382 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); } 7397 7383 break; … … 7400 7386 7401 7387 /* Line 1806 of yacc.c */ 7402 #line 18 50"parser.yy"7388 #line 1849 "parser.yy" 7403 7389 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7404 7390 break; … … 7407 7393 7408 7394 /* Line 1806 of yacc.c */ 7409 #line 185 2"parser.yy"7395 #line 1851 "parser.yy" 7410 7396 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7411 7397 break; … … 7414 7400 7415 7401 /* Line 1806 of yacc.c */ 7416 #line 185 7"parser.yy"7402 #line 1856 "parser.yy" 7417 7403 { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); } 7418 7404 break; … … 7421 7407 7422 7408 /* Line 1806 of yacc.c */ 7423 #line 186 3"parser.yy"7409 #line 1862 "parser.yy" 7424 7410 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); } 7425 7411 break; … … 7428 7414 7429 7415 /* Line 1806 of yacc.c */ 7430 #line 186 8"parser.yy"7416 #line 1867 "parser.yy" 7431 7417 { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); } 7432 7418 break; … … 7435 7421 7436 7422 /* Line 1806 of yacc.c */ 7437 #line 18 70"parser.yy"7423 #line 1869 "parser.yy" 7438 7424 { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); } 7439 7425 break; … … 7442 7428 7443 7429 /* Line 1806 of yacc.c */ 7444 #line 187 6"parser.yy"7430 #line 1875 "parser.yy" 7445 7431 { (yyval.tclass) = DeclarationNode::Otype; } 7446 7432 break; … … 7449 7435 7450 7436 /* Line 1806 of yacc.c */ 7451 #line 187 8"parser.yy"7437 #line 1877 "parser.yy" 7452 7438 { (yyval.tclass) = DeclarationNode::Ftype; } 7453 7439 break; … … 7456 7442 7457 7443 /* Line 1806 of yacc.c */ 7458 #line 18 80"parser.yy"7444 #line 1879 "parser.yy" 7459 7445 { (yyval.tclass) = DeclarationNode::Dtype; } 7460 7446 break; … … 7463 7449 7464 7450 /* Line 1806 of yacc.c */ 7465 #line 188 5"parser.yy"7451 #line 1884 "parser.yy" 7466 7452 { (yyval.decl) = 0; } 7467 7453 break; … … 7470 7456 7471 7457 /* Line 1806 of yacc.c */ 7472 #line 188 7"parser.yy"7458 #line 1886 "parser.yy" 7473 7459 { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); } 7474 7460 break; … … 7477 7463 7478 7464 /* Line 1806 of yacc.c */ 7479 #line 189 2"parser.yy"7465 #line 1891 "parser.yy" 7480 7466 { 7481 7467 typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) ); … … 7487 7473 7488 7474 /* Line 1806 of yacc.c */ 7489 #line 189 7"parser.yy"7475 #line 1896 "parser.yy" 7490 7476 { (yyval.decl) = (yyvsp[(4) - (5)].decl); } 7491 7477 break; … … 7494 7480 7495 7481 /* Line 1806 of yacc.c */ 7496 #line 189 9"parser.yy"7482 #line 1898 "parser.yy" 7497 7483 { (yyval.decl) = 0; } 7498 7484 break; … … 7501 7487 7502 7488 /* Line 1806 of yacc.c */ 7503 #line 190 4"parser.yy"7489 #line 1903 "parser.yy" 7504 7490 { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); } 7505 7491 break; … … 7508 7494 7509 7495 /* Line 1806 of yacc.c */ 7510 #line 190 7"parser.yy"7496 #line 1906 "parser.yy" 7511 7497 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( build_typevalue( (yyvsp[(3) - (3)].decl) ) ) ) ); } 7512 7498 break; … … 7515 7501 7516 7502 /* Line 1806 of yacc.c */ 7517 #line 190 9"parser.yy"7503 #line 1908 "parser.yy" 7518 7504 { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); } 7519 7505 break; … … 7522 7508 7523 7509 /* Line 1806 of yacc.c */ 7524 #line 191 4"parser.yy"7510 #line 1913 "parser.yy" 7525 7511 { (yyval.decl) = (yyvsp[(2) - (2)].decl); } 7526 7512 break; … … 7529 7515 7530 7516 /* Line 1806 of yacc.c */ 7531 #line 191 6"parser.yy"7517 #line 1915 "parser.yy" 7532 7518 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); } 7533 7519 break; … … 7536 7522 7537 7523 /* Line 1806 of yacc.c */ 7538 #line 191 8"parser.yy"7524 #line 1917 "parser.yy" 7539 7525 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); } 7540 7526 break; … … 7543 7529 7544 7530 /* Line 1806 of yacc.c */ 7545 #line 192 3"parser.yy"7531 #line 1922 "parser.yy" 7546 7532 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); } 7547 7533 break; … … 7550 7536 7551 7537 /* Line 1806 of yacc.c */ 7552 #line 192 5"parser.yy"7538 #line 1924 "parser.yy" 7553 7539 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); } 7554 7540 break; … … 7557 7543 7558 7544 /* Line 1806 of yacc.c */ 7559 #line 19 30"parser.yy"7545 #line 1929 "parser.yy" 7560 7546 { 7561 7547 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD ); … … 7567 7553 7568 7554 /* Line 1806 of yacc.c */ 7569 #line 193 5"parser.yy"7555 #line 1934 "parser.yy" 7570 7556 { 7571 7557 typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG ); … … 7577 7563 7578 7564 /* Line 1806 of yacc.c */ 7579 #line 194 3"parser.yy"7565 #line 1942 "parser.yy" 7580 7566 { 7581 7567 typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID ); … … 7587 7573 7588 7574 /* Line 1806 of yacc.c */ 7589 #line 194 8"parser.yy"7575 #line 1947 "parser.yy" 7590 7576 { 7591 7577 typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) ); … … 7597 7583 7598 7584 /* Line 1806 of yacc.c */ 7599 #line 195 3"parser.yy"7585 #line 1952 "parser.yy" 7600 7586 { 7601 7587 typedefTable.leaveTrait(); … … 7608 7594 7609 7595 /* Line 1806 of yacc.c */ 7610 #line 196 3"parser.yy"7596 #line 1962 "parser.yy" 7611 7597 { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); } 7612 7598 break; … … 7615 7601 7616 7602 /* Line 1806 of yacc.c */ 7617 #line 197 3"parser.yy"7603 #line 1972 "parser.yy" 7618 7604 { 7619 7605 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7625 7611 7626 7612 /* Line 1806 of yacc.c */ 7627 #line 197 8"parser.yy"7613 #line 1977 "parser.yy" 7628 7614 { 7629 7615 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7635 7621 7636 7622 /* Line 1806 of yacc.c */ 7637 #line 198 3"parser.yy"7623 #line 1982 "parser.yy" 7638 7624 { 7639 7625 typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID ); … … 7645 7631 7646 7632 /* Line 1806 of yacc.c */ 7647 #line 199 1"parser.yy"7633 #line 1990 "parser.yy" 7648 7634 { 7649 7635 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7655 7641 7656 7642 /* Line 1806 of yacc.c */ 7657 #line 199 6"parser.yy"7643 #line 1995 "parser.yy" 7658 7644 { 7659 7645 typedefTable.addToEnclosingScope2( TypedefTable::ID ); … … 7665 7651 7666 7652 /* Line 1806 of yacc.c */ 7667 #line 200 6"parser.yy"7653 #line 2005 "parser.yy" 7668 7654 {} 7669 7655 break; … … 7672 7658 7673 7659 /* Line 1806 of yacc.c */ 7674 #line 200 8"parser.yy"7660 #line 2007 "parser.yy" 7675 7661 { parseTree = parseTree != nullptr ? parseTree->appendList( (yyvsp[(1) - (1)].decl) ) : (yyvsp[(1) - (1)].decl); } 7676 7662 break; … … 7679 7665 7680 7666 /* Line 1806 of yacc.c */ 7681 #line 201 4"parser.yy"7667 #line 2013 "parser.yy" 7682 7668 { (yyval.decl) = (yyvsp[(1) - (3)].decl) != nullptr ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); } 7683 7669 break; … … 7686 7672 7687 7673 /* Line 1806 of yacc.c */ 7688 #line 201 9"parser.yy"7674 #line 2018 "parser.yy" 7689 7675 { (yyval.decl) = 0; } 7690 7676 break; … … 7693 7679 7694 7680 /* Line 1806 of yacc.c */ 7695 #line 202 7"parser.yy"7681 #line 2026 "parser.yy" 7696 7682 {} 7697 7683 break; … … 7700 7686 7701 7687 /* Line 1806 of yacc.c */ 7702 #line 202 9"parser.yy"7688 #line 2028 "parser.yy" 7703 7689 { 7704 7690 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" … … 7710 7696 7711 7697 /* Line 1806 of yacc.c */ 7712 #line 203 4"parser.yy"7698 #line 2033 "parser.yy" 7713 7699 { 7714 7700 linkage = linkageStack.top(); … … 7721 7707 7722 7708 /* Line 1806 of yacc.c */ 7723 #line 20 40"parser.yy"7709 #line 2039 "parser.yy" 7724 7710 { // mark all fields in list 7725 7711 for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) … … 7732 7718 7733 7719 /* Line 1806 of yacc.c */ 7734 #line 205 5"parser.yy"7720 #line 2054 "parser.yy" 7735 7721 { 7736 7722 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7743 7729 7744 7730 /* Line 1806 of yacc.c */ 7745 #line 206 1"parser.yy"7731 #line 2060 "parser.yy" 7746 7732 { 7747 7733 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7754 7740 7755 7741 /* Line 1806 of yacc.c */ 7756 #line 20 70"parser.yy"7742 #line 2069 "parser.yy" 7757 7743 { 7758 7744 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7765 7751 7766 7752 /* Line 1806 of yacc.c */ 7767 #line 207 6"parser.yy"7753 #line 2075 "parser.yy" 7768 7754 { 7769 7755 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7776 7762 7777 7763 /* Line 1806 of yacc.c */ 7778 #line 208 2"parser.yy"7764 #line 2081 "parser.yy" 7779 7765 { 7780 7766 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7787 7773 7788 7774 /* Line 1806 of yacc.c */ 7789 #line 208 8"parser.yy"7775 #line 2087 "parser.yy" 7790 7776 { 7791 7777 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7798 7784 7799 7785 /* Line 1806 of yacc.c */ 7800 #line 209 4"parser.yy"7786 #line 2093 "parser.yy" 7801 7787 { 7802 7788 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7809 7795 7810 7796 /* Line 1806 of yacc.c */ 7811 #line 210 2"parser.yy"7797 #line 2101 "parser.yy" 7812 7798 { 7813 7799 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7820 7806 7821 7807 /* Line 1806 of yacc.c */ 7822 #line 210 8"parser.yy"7808 #line 2107 "parser.yy" 7823 7809 { 7824 7810 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7831 7817 7832 7818 /* Line 1806 of yacc.c */ 7833 #line 211 6"parser.yy"7819 #line 2115 "parser.yy" 7834 7820 { 7835 7821 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7842 7828 7843 7829 /* Line 1806 of yacc.c */ 7844 #line 212 2"parser.yy"7830 #line 2121 "parser.yy" 7845 7831 { 7846 7832 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 7853 7839 7854 7840 /* Line 1806 of yacc.c */ 7855 #line 213 7"parser.yy"7841 #line 2136 "parser.yy" 7856 7842 { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); } 7857 7843 break; … … 7860 7846 7861 7847 /* Line 1806 of yacc.c */ 7862 #line 214 2"parser.yy"7848 #line 2141 "parser.yy" 7863 7849 { delete (yyvsp[(3) - (5)].str); } 7864 7850 break; … … 7867 7853 7868 7854 /* Line 1806 of yacc.c */ 7869 #line 214 7"parser.yy"7855 #line 2146 "parser.yy" 7870 7856 { (yyval.decl) = 0; } 7871 7857 break; … … 7874 7860 7875 7861 /* Line 1806 of yacc.c */ 7876 #line 215 4"parser.yy"7862 #line 2153 "parser.yy" 7877 7863 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 7878 7864 break; … … 7881 7867 7882 7868 /* Line 1806 of yacc.c */ 7883 #line 21 60"parser.yy"7869 #line 2159 "parser.yy" 7884 7870 { (yyval.decl) = 0; } 7885 7871 break; … … 7888 7874 7889 7875 /* Line 1806 of yacc.c */ 7890 #line 217 1"parser.yy"7876 #line 2170 "parser.yy" 7891 7877 { delete (yyvsp[(3) - (4)].en); } 7892 7878 break; … … 7895 7881 7896 7882 /* Line 1806 of yacc.c */ 7883 #line 2174 "parser.yy" 7884 { delete (yyvsp[(1) - (1)].tok); } 7885 break; 7886 7887 case 562: 7888 7889 /* Line 1806 of yacc.c */ 7897 7890 #line 2175 "parser.yy" 7898 { delete (yyvsp[(1) - (1)]. tok); }7899 break; 7900 7901 case 56 2:7891 { delete (yyvsp[(1) - (1)].decl); } 7892 break; 7893 7894 case 563: 7902 7895 7903 7896 /* Line 1806 of yacc.c */ … … 7906 7899 break; 7907 7900 7908 case 56 3:7901 case 564: 7909 7902 7910 7903 /* Line 1806 of yacc.c */ … … 7913 7906 break; 7914 7907 7915 case 564:7916 7917 /* Line 1806 of yacc.c */7918 #line 2178 "parser.yy"7919 { delete (yyvsp[(1) - (1)].decl); }7920 break;7921 7922 7908 case 565: 7923 7909 7924 7910 /* Line 1806 of yacc.c */ 7925 #line 221 3"parser.yy"7911 #line 2212 "parser.yy" 7926 7912 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7927 7913 break; … … 7930 7916 7931 7917 /* Line 1806 of yacc.c */ 7932 #line 221 6"parser.yy"7918 #line 2215 "parser.yy" 7933 7919 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7934 7920 break; … … 7937 7923 7938 7924 /* Line 1806 of yacc.c */ 7939 #line 221 8"parser.yy"7925 #line 2217 "parser.yy" 7940 7926 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 7941 7927 break; … … 7944 7930 7945 7931 /* Line 1806 of yacc.c */ 7946 #line 222 3"parser.yy"7932 #line 2222 "parser.yy" 7947 7933 { 7948 7934 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 7954 7940 7955 7941 /* Line 1806 of yacc.c */ 7956 #line 222 8"parser.yy"7942 #line 2227 "parser.yy" 7957 7943 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 7958 7944 break; … … 7961 7947 7962 7948 /* Line 1806 of yacc.c */ 7963 #line 223 3"parser.yy"7949 #line 2232 "parser.yy" 7964 7950 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 7965 7951 break; … … 7968 7954 7969 7955 /* Line 1806 of yacc.c */ 7970 #line 223 5"parser.yy"7956 #line 2234 "parser.yy" 7971 7957 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 7972 7958 break; … … 7975 7961 7976 7962 /* Line 1806 of yacc.c */ 7977 #line 223 7"parser.yy"7963 #line 2236 "parser.yy" 7978 7964 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 7979 7965 break; … … 7982 7968 7983 7969 /* Line 1806 of yacc.c */ 7984 #line 224 2"parser.yy"7970 #line 2241 "parser.yy" 7985 7971 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 7986 7972 break; … … 7989 7975 7990 7976 /* Line 1806 of yacc.c */ 7991 #line 224 4"parser.yy"7977 #line 2243 "parser.yy" 7992 7978 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 7993 7979 break; … … 7996 7982 7997 7983 /* Line 1806 of yacc.c */ 7998 #line 224 6"parser.yy"7984 #line 2245 "parser.yy" 7999 7985 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8000 7986 break; … … 8003 7989 8004 7990 /* Line 1806 of yacc.c */ 8005 #line 224 8"parser.yy"7991 #line 2247 "parser.yy" 8006 7992 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8007 7993 break; … … 8010 7996 8011 7997 /* Line 1806 of yacc.c */ 8012 #line 225 3"parser.yy"7998 #line 2252 "parser.yy" 8013 7999 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8014 8000 break; … … 8017 8003 8018 8004 /* Line 1806 of yacc.c */ 8019 #line 225 5"parser.yy"8005 #line 2254 "parser.yy" 8020 8006 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8021 8007 break; … … 8024 8010 8025 8011 /* Line 1806 of yacc.c */ 8026 #line 226 4"parser.yy"8012 #line 2263 "parser.yy" 8027 8013 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8028 8014 break; … … 8031 8017 8032 8018 /* Line 1806 of yacc.c */ 8033 #line 226 7"parser.yy"8019 #line 2266 "parser.yy" 8034 8020 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8035 8021 break; … … 8038 8024 8039 8025 /* Line 1806 of yacc.c */ 8040 #line 227 2"parser.yy"8026 #line 2271 "parser.yy" 8041 8027 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8042 8028 break; … … 8045 8031 8046 8032 /* Line 1806 of yacc.c */ 8047 #line 227 4"parser.yy"8033 #line 2273 "parser.yy" 8048 8034 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8049 8035 break; … … 8052 8038 8053 8039 /* Line 1806 of yacc.c */ 8054 #line 227 6"parser.yy"8040 #line 2275 "parser.yy" 8055 8041 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8056 8042 break; … … 8059 8045 8060 8046 /* Line 1806 of yacc.c */ 8061 #line 228 1"parser.yy"8047 #line 2280 "parser.yy" 8062 8048 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8063 8049 break; … … 8066 8052 8067 8053 /* Line 1806 of yacc.c */ 8068 #line 228 3"parser.yy"8054 #line 2282 "parser.yy" 8069 8055 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8070 8056 break; … … 8073 8059 8074 8060 /* Line 1806 of yacc.c */ 8075 #line 228 5"parser.yy"8061 #line 2284 "parser.yy" 8076 8062 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8077 8063 break; … … 8080 8066 8081 8067 /* Line 1806 of yacc.c */ 8082 #line 22 90"parser.yy"8068 #line 2289 "parser.yy" 8083 8069 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8084 8070 break; … … 8087 8073 8088 8074 /* Line 1806 of yacc.c */ 8089 #line 229 2"parser.yy"8075 #line 2291 "parser.yy" 8090 8076 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8091 8077 break; … … 8094 8080 8095 8081 /* Line 1806 of yacc.c */ 8096 #line 229 4"parser.yy"8082 #line 2293 "parser.yy" 8097 8083 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8098 8084 break; … … 8101 8087 8102 8088 /* Line 1806 of yacc.c */ 8103 #line 230 9"parser.yy"8089 #line 2308 "parser.yy" 8104 8090 { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); } 8105 8091 break; … … 8108 8094 8109 8095 /* Line 1806 of yacc.c */ 8110 #line 231 1"parser.yy"8096 #line 2310 "parser.yy" 8111 8097 { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); } 8112 8098 break; … … 8115 8101 8116 8102 /* Line 1806 of yacc.c */ 8117 #line 231 3"parser.yy"8103 #line 2312 "parser.yy" 8118 8104 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8119 8105 break; … … 8122 8108 8123 8109 /* Line 1806 of yacc.c */ 8124 #line 231 8"parser.yy"8110 #line 2317 "parser.yy" 8125 8111 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8126 8112 break; … … 8129 8115 8130 8116 /* Line 1806 of yacc.c */ 8131 #line 23 20"parser.yy"8117 #line 2319 "parser.yy" 8132 8118 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8133 8119 break; … … 8136 8122 8137 8123 /* Line 1806 of yacc.c */ 8138 #line 232 2"parser.yy"8124 #line 2321 "parser.yy" 8139 8125 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8140 8126 break; … … 8143 8129 8144 8130 /* Line 1806 of yacc.c */ 8145 #line 232 7"parser.yy"8131 #line 2326 "parser.yy" 8146 8132 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8147 8133 break; … … 8150 8136 8151 8137 /* Line 1806 of yacc.c */ 8152 #line 232 9"parser.yy"8138 #line 2328 "parser.yy" 8153 8139 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8154 8140 break; … … 8157 8143 8158 8144 /* Line 1806 of yacc.c */ 8159 #line 233 1"parser.yy"8145 #line 2330 "parser.yy" 8160 8146 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8161 8147 break; … … 8164 8150 8165 8151 /* Line 1806 of yacc.c */ 8166 #line 234 6"parser.yy"8152 #line 2345 "parser.yy" 8167 8153 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8168 8154 break; … … 8171 8157 8172 8158 /* Line 1806 of yacc.c */ 8173 #line 234 9"parser.yy"8159 #line 2348 "parser.yy" 8174 8160 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8175 8161 break; … … 8178 8164 8179 8165 /* Line 1806 of yacc.c */ 8180 #line 235 1"parser.yy"8166 #line 2350 "parser.yy" 8181 8167 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8182 8168 break; … … 8185 8171 8186 8172 /* Line 1806 of yacc.c */ 8187 #line 235 7"parser.yy"8173 #line 2356 "parser.yy" 8188 8174 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8189 8175 break; … … 8192 8178 8193 8179 /* Line 1806 of yacc.c */ 8194 #line 236 2"parser.yy"8180 #line 2361 "parser.yy" 8195 8181 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8196 8182 break; … … 8199 8185 8200 8186 /* Line 1806 of yacc.c */ 8201 #line 236 4"parser.yy"8187 #line 2363 "parser.yy" 8202 8188 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8203 8189 break; … … 8206 8192 8207 8193 /* Line 1806 of yacc.c */ 8208 #line 236 6"parser.yy"8194 #line 2365 "parser.yy" 8209 8195 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8210 8196 break; … … 8213 8199 8214 8200 /* Line 1806 of yacc.c */ 8215 #line 237 1"parser.yy"8201 #line 2370 "parser.yy" 8216 8202 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8217 8203 break; … … 8220 8206 8221 8207 /* Line 1806 of yacc.c */ 8222 #line 237 3"parser.yy"8208 #line 2372 "parser.yy" 8223 8209 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8224 8210 break; … … 8227 8213 8228 8214 /* Line 1806 of yacc.c */ 8229 #line 237 5"parser.yy"8215 #line 2374 "parser.yy" 8230 8216 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8231 8217 break; … … 8234 8220 8235 8221 /* Line 1806 of yacc.c */ 8236 #line 237 7"parser.yy"8222 #line 2376 "parser.yy" 8237 8223 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8238 8224 break; … … 8241 8227 8242 8228 /* Line 1806 of yacc.c */ 8243 #line 238 2"parser.yy"8229 #line 2381 "parser.yy" 8244 8230 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8245 8231 break; … … 8248 8234 8249 8235 /* Line 1806 of yacc.c */ 8250 #line 238 4"parser.yy"8236 #line 2383 "parser.yy" 8251 8237 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8252 8238 break; … … 8255 8241 8256 8242 /* Line 1806 of yacc.c */ 8257 #line 238 6"parser.yy"8243 #line 2385 "parser.yy" 8258 8244 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8259 8245 break; … … 8262 8248 8263 8249 /* Line 1806 of yacc.c */ 8264 #line 239 6"parser.yy"8250 #line 2395 "parser.yy" 8265 8251 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8266 8252 break; … … 8269 8255 8270 8256 /* Line 1806 of yacc.c */ 8271 #line 239 9"parser.yy"8257 #line 2398 "parser.yy" 8272 8258 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8273 8259 break; … … 8276 8262 8277 8263 /* Line 1806 of yacc.c */ 8278 #line 240 1"parser.yy"8264 #line 2400 "parser.yy" 8279 8265 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8280 8266 break; … … 8283 8269 8284 8270 /* Line 1806 of yacc.c */ 8285 #line 240 6"parser.yy"8271 #line 2405 "parser.yy" 8286 8272 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8287 8273 break; … … 8290 8276 8291 8277 /* Line 1806 of yacc.c */ 8292 #line 240 8"parser.yy"8278 #line 2407 "parser.yy" 8293 8279 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8294 8280 break; … … 8297 8283 8298 8284 /* Line 1806 of yacc.c */ 8299 #line 24 10"parser.yy"8285 #line 2409 "parser.yy" 8300 8286 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8301 8287 break; … … 8304 8290 8305 8291 /* Line 1806 of yacc.c */ 8306 #line 241 5"parser.yy"8292 #line 2414 "parser.yy" 8307 8293 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8308 8294 break; … … 8311 8297 8312 8298 /* Line 1806 of yacc.c */ 8313 #line 241 7"parser.yy"8299 #line 2416 "parser.yy" 8314 8300 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8315 8301 break; … … 8318 8304 8319 8305 /* Line 1806 of yacc.c */ 8320 #line 241 9"parser.yy"8306 #line 2418 "parser.yy" 8321 8307 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8322 8308 break; … … 8325 8311 8326 8312 /* Line 1806 of yacc.c */ 8327 #line 242 1"parser.yy"8313 #line 2420 "parser.yy" 8328 8314 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8329 8315 break; … … 8332 8318 8333 8319 /* Line 1806 of yacc.c */ 8334 #line 242 6"parser.yy"8320 #line 2425 "parser.yy" 8335 8321 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8336 8322 break; … … 8339 8325 8340 8326 /* Line 1806 of yacc.c */ 8341 #line 242 8"parser.yy"8327 #line 2427 "parser.yy" 8342 8328 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8343 8329 break; … … 8346 8332 8347 8333 /* Line 1806 of yacc.c */ 8348 #line 24 30"parser.yy"8334 #line 2429 "parser.yy" 8349 8335 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8350 8336 break; … … 8353 8339 8354 8340 /* Line 1806 of yacc.c */ 8355 #line 246 1"parser.yy"8341 #line 2460 "parser.yy" 8356 8342 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8357 8343 break; … … 8360 8346 8361 8347 /* Line 1806 of yacc.c */ 8362 #line 246 4"parser.yy"8348 #line 2463 "parser.yy" 8363 8349 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8364 8350 break; … … 8367 8353 8368 8354 /* Line 1806 of yacc.c */ 8369 #line 246 6"parser.yy"8355 #line 2465 "parser.yy" 8370 8356 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8371 8357 break; … … 8374 8360 8375 8361 /* Line 1806 of yacc.c */ 8376 #line 247 1"parser.yy"8362 #line 2470 "parser.yy" 8377 8363 { 8378 8364 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8384 8370 8385 8371 /* Line 1806 of yacc.c */ 8386 #line 247 6"parser.yy"8372 #line 2475 "parser.yy" 8387 8373 { 8388 8374 typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) ); … … 8394 8380 8395 8381 /* Line 1806 of yacc.c */ 8396 #line 248 4"parser.yy"8382 #line 2483 "parser.yy" 8397 8383 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8398 8384 break; … … 8401 8387 8402 8388 /* Line 1806 of yacc.c */ 8403 #line 248 6"parser.yy"8389 #line 2485 "parser.yy" 8404 8390 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8405 8391 break; … … 8408 8394 8409 8395 /* Line 1806 of yacc.c */ 8410 #line 248 8"parser.yy"8396 #line 2487 "parser.yy" 8411 8397 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8412 8398 break; … … 8415 8401 8416 8402 /* Line 1806 of yacc.c */ 8417 #line 249 3"parser.yy"8403 #line 2492 "parser.yy" 8418 8404 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8419 8405 break; … … 8422 8408 8423 8409 /* Line 1806 of yacc.c */ 8424 #line 249 5"parser.yy"8410 #line 2494 "parser.yy" 8425 8411 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8426 8412 break; … … 8429 8415 8430 8416 /* Line 1806 of yacc.c */ 8431 #line 2 500"parser.yy"8417 #line 2499 "parser.yy" 8432 8418 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); } 8433 8419 break; … … 8436 8422 8437 8423 /* Line 1806 of yacc.c */ 8438 #line 250 2"parser.yy"8424 #line 2501 "parser.yy" 8439 8425 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8440 8426 break; … … 8443 8429 8444 8430 /* Line 1806 of yacc.c */ 8445 #line 251 7"parser.yy"8431 #line 2516 "parser.yy" 8446 8432 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8447 8433 break; … … 8450 8436 8451 8437 /* Line 1806 of yacc.c */ 8452 #line 251 9"parser.yy"8438 #line 2518 "parser.yy" 8453 8439 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8454 8440 break; … … 8457 8443 8458 8444 /* Line 1806 of yacc.c */ 8459 #line 252 4"parser.yy"8445 #line 2523 "parser.yy" 8460 8446 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8461 8447 break; … … 8464 8450 8465 8451 /* Line 1806 of yacc.c */ 8466 #line 252 6"parser.yy"8452 #line 2525 "parser.yy" 8467 8453 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8468 8454 break; … … 8471 8457 8472 8458 /* Line 1806 of yacc.c */ 8473 #line 252 8"parser.yy"8459 #line 2527 "parser.yy" 8474 8460 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8475 8461 break; … … 8478 8464 8479 8465 /* Line 1806 of yacc.c */ 8480 #line 25 30"parser.yy"8466 #line 2529 "parser.yy" 8481 8467 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8482 8468 break; … … 8485 8471 8486 8472 /* Line 1806 of yacc.c */ 8487 #line 253 2"parser.yy"8473 #line 2531 "parser.yy" 8488 8474 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8489 8475 break; … … 8492 8478 8493 8479 /* Line 1806 of yacc.c */ 8494 #line 253 8"parser.yy"8480 #line 2537 "parser.yy" 8495 8481 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8496 8482 break; … … 8499 8485 8500 8486 /* Line 1806 of yacc.c */ 8501 #line 25 40"parser.yy"8487 #line 2539 "parser.yy" 8502 8488 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8503 8489 break; … … 8506 8492 8507 8493 /* Line 1806 of yacc.c */ 8508 #line 254 2"parser.yy"8494 #line 2541 "parser.yy" 8509 8495 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8510 8496 break; … … 8513 8499 8514 8500 /* Line 1806 of yacc.c */ 8515 #line 254 7"parser.yy"8501 #line 2546 "parser.yy" 8516 8502 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8517 8503 break; … … 8520 8506 8521 8507 /* Line 1806 of yacc.c */ 8522 #line 254 9"parser.yy"8508 #line 2548 "parser.yy" 8523 8509 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8524 8510 break; … … 8527 8513 8528 8514 /* Line 1806 of yacc.c */ 8529 #line 255 1"parser.yy"8515 #line 2550 "parser.yy" 8530 8516 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8531 8517 break; … … 8534 8520 8535 8521 /* Line 1806 of yacc.c */ 8536 #line 255 7"parser.yy"8522 #line 2556 "parser.yy" 8537 8523 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8538 8524 break; … … 8541 8527 8542 8528 /* Line 1806 of yacc.c */ 8543 #line 255 9"parser.yy"8529 #line 2558 "parser.yy" 8544 8530 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); } 8545 8531 break; … … 8548 8534 8549 8535 /* Line 1806 of yacc.c */ 8550 #line 256 5"parser.yy"8536 #line 2564 "parser.yy" 8551 8537 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); } 8552 8538 break; … … 8555 8541 8556 8542 /* Line 1806 of yacc.c */ 8557 #line 256 7"parser.yy"8543 #line 2566 "parser.yy" 8558 8544 { (yyval.decl) = DeclarationNode::newVarArray( 0 ); } 8559 8545 break; … … 8562 8548 8563 8549 /* Line 1806 of yacc.c */ 8564 #line 256 9"parser.yy"8550 #line 2568 "parser.yy" 8565 8551 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); } 8566 8552 break; … … 8569 8555 8570 8556 /* Line 1806 of yacc.c */ 8571 #line 257 1"parser.yy"8557 #line 2570 "parser.yy" 8572 8558 { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); } 8573 8559 break; … … 8576 8562 8577 8563 /* Line 1806 of yacc.c */ 8578 #line 258 6"parser.yy"8564 #line 2585 "parser.yy" 8579 8565 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8580 8566 break; … … 8583 8569 8584 8570 /* Line 1806 of yacc.c */ 8585 #line 258 8"parser.yy"8571 #line 2587 "parser.yy" 8586 8572 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8587 8573 break; … … 8590 8576 8591 8577 /* Line 1806 of yacc.c */ 8592 #line 259 3"parser.yy"8578 #line 2592 "parser.yy" 8593 8579 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8594 8580 break; … … 8597 8583 8598 8584 /* Line 1806 of yacc.c */ 8599 #line 259 5"parser.yy"8585 #line 2594 "parser.yy" 8600 8586 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8601 8587 break; … … 8604 8590 8605 8591 /* Line 1806 of yacc.c */ 8606 #line 259 7"parser.yy"8592 #line 2596 "parser.yy" 8607 8593 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8608 8594 break; … … 8611 8597 8612 8598 /* Line 1806 of yacc.c */ 8613 #line 259 9"parser.yy"8599 #line 2598 "parser.yy" 8614 8600 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8615 8601 break; … … 8618 8604 8619 8605 /* Line 1806 of yacc.c */ 8620 #line 260 1"parser.yy"8606 #line 2600 "parser.yy" 8621 8607 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8622 8608 break; … … 8625 8611 8626 8612 /* Line 1806 of yacc.c */ 8627 #line 260 7"parser.yy"8613 #line 2606 "parser.yy" 8628 8614 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8629 8615 break; … … 8632 8618 8633 8619 /* Line 1806 of yacc.c */ 8634 #line 260 9"parser.yy"8620 #line 2608 "parser.yy" 8635 8621 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8636 8622 break; … … 8639 8625 8640 8626 /* Line 1806 of yacc.c */ 8641 #line 261 1"parser.yy"8627 #line 2610 "parser.yy" 8642 8628 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8643 8629 break; … … 8646 8632 8647 8633 /* Line 1806 of yacc.c */ 8648 #line 261 6"parser.yy"8634 #line 2615 "parser.yy" 8649 8635 { (yyval.decl) = DeclarationNode::newFunction( nullptr, nullptr, (yyvsp[(3) - (5)].decl), nullptr ); } 8650 8636 break; … … 8653 8639 8654 8640 /* Line 1806 of yacc.c */ 8655 #line 261 8"parser.yy"8641 #line 2617 "parser.yy" 8656 8642 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8657 8643 break; … … 8660 8646 8661 8647 /* Line 1806 of yacc.c */ 8662 #line 26 20"parser.yy"8648 #line 2619 "parser.yy" 8663 8649 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8664 8650 break; … … 8667 8653 8668 8654 /* Line 1806 of yacc.c */ 8669 #line 262 7"parser.yy"8655 #line 2626 "parser.yy" 8670 8656 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); } 8671 8657 break; … … 8674 8660 8675 8661 /* Line 1806 of yacc.c */ 8676 #line 263 8"parser.yy"8662 #line 2637 "parser.yy" 8677 8663 { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); } 8678 8664 break; … … 8681 8667 8682 8668 /* Line 1806 of yacc.c */ 8683 #line 264 1"parser.yy"8669 #line 2640 "parser.yy" 8684 8670 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 8685 8671 break; … … 8688 8674 8689 8675 /* Line 1806 of yacc.c */ 8690 #line 264 3"parser.yy"8676 #line 2642 "parser.yy" 8691 8677 { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); } 8692 8678 break; … … 8695 8681 8696 8682 /* Line 1806 of yacc.c */ 8697 #line 264 6"parser.yy"8683 #line 2645 "parser.yy" 8698 8684 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 8699 8685 break; … … 8702 8688 8703 8689 /* Line 1806 of yacc.c */ 8704 #line 264 8"parser.yy"8690 #line 2647 "parser.yy" 8705 8691 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); } 8706 8692 break; … … 8709 8695 8710 8696 /* Line 1806 of yacc.c */ 8711 #line 26 50"parser.yy"8697 #line 2649 "parser.yy" 8712 8698 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); } 8713 8699 break; … … 8716 8702 8717 8703 /* Line 1806 of yacc.c */ 8718 #line 266 4"parser.yy"8704 #line 2663 "parser.yy" 8719 8705 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8720 8706 break; … … 8723 8709 8724 8710 /* Line 1806 of yacc.c */ 8725 #line 266 6"parser.yy"8711 #line 2665 "parser.yy" 8726 8712 { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); } 8727 8713 break; … … 8730 8716 8731 8717 /* Line 1806 of yacc.c */ 8732 #line 267 1"parser.yy"8718 #line 2670 "parser.yy" 8733 8719 { (yyval.decl) = DeclarationNode::newPointer( 0 ); } 8734 8720 break; … … 8737 8723 8738 8724 /* Line 1806 of yacc.c */ 8739 #line 267 3"parser.yy"8725 #line 2672 "parser.yy" 8740 8726 { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); } 8741 8727 break; … … 8744 8730 8745 8731 /* Line 1806 of yacc.c */ 8746 #line 267 5"parser.yy"8732 #line 2674 "parser.yy" 8747 8733 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); } 8748 8734 break; … … 8751 8737 8752 8738 /* Line 1806 of yacc.c */ 8753 #line 267 7"parser.yy"8739 #line 2676 "parser.yy" 8754 8740 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); } 8755 8741 break; … … 8758 8744 8759 8745 /* Line 1806 of yacc.c */ 8760 #line 267 9"parser.yy"8746 #line 2678 "parser.yy" 8761 8747 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8762 8748 break; … … 8765 8751 8766 8752 /* Line 1806 of yacc.c */ 8767 #line 268 5"parser.yy"8753 #line 2684 "parser.yy" 8768 8754 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8769 8755 break; … … 8772 8758 8773 8759 /* Line 1806 of yacc.c */ 8774 #line 268 7"parser.yy"8760 #line 2686 "parser.yy" 8775 8761 { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); } 8776 8762 break; … … 8779 8765 8780 8766 /* Line 1806 of yacc.c */ 8781 #line 268 9"parser.yy"8767 #line 2688 "parser.yy" 8782 8768 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8783 8769 break; … … 8786 8772 8787 8773 /* Line 1806 of yacc.c */ 8788 #line 269 4"parser.yy"8774 #line 2693 "parser.yy" 8789 8775 { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); } 8790 8776 break; … … 8793 8779 8794 8780 /* Line 1806 of yacc.c */ 8795 #line 269 6"parser.yy"8781 #line 2695 "parser.yy" 8796 8782 { (yyval.decl) = (yyvsp[(2) - (3)].decl); } 8797 8783 break; … … 8800 8786 8801 8787 /* Line 1806 of yacc.c */ 8802 #line 270 6"parser.yy"8788 #line 2705 "parser.yy" 8803 8789 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8804 8790 break; … … 8807 8793 8808 8794 /* Line 1806 of yacc.c */ 8809 #line 271 6"parser.yy"8795 #line 2715 "parser.yy" 8810 8796 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8811 8797 break; … … 8814 8800 8815 8801 /* Line 1806 of yacc.c */ 8816 #line 271 8"parser.yy"8802 #line 2717 "parser.yy" 8817 8803 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8818 8804 break; … … 8821 8807 8822 8808 /* Line 1806 of yacc.c */ 8823 #line 27 20"parser.yy"8809 #line 2719 "parser.yy" 8824 8810 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8825 8811 break; … … 8828 8814 8829 8815 /* Line 1806 of yacc.c */ 8830 #line 272 2"parser.yy"8816 #line 2721 "parser.yy" 8831 8817 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8832 8818 break; … … 8835 8821 8836 8822 /* Line 1806 of yacc.c */ 8837 #line 272 4"parser.yy"8823 #line 2723 "parser.yy" 8838 8824 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8839 8825 break; … … 8842 8828 8843 8829 /* Line 1806 of yacc.c */ 8844 #line 272 6"parser.yy"8830 #line 2725 "parser.yy" 8845 8831 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8846 8832 break; … … 8849 8835 8850 8836 /* Line 1806 of yacc.c */ 8851 #line 273 3"parser.yy"8837 #line 2732 "parser.yy" 8852 8838 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8853 8839 break; … … 8856 8842 8857 8843 /* Line 1806 of yacc.c */ 8858 #line 273 5"parser.yy"8844 #line 2734 "parser.yy" 8859 8845 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8860 8846 break; … … 8863 8849 8864 8850 /* Line 1806 of yacc.c */ 8865 #line 273 7"parser.yy"8851 #line 2736 "parser.yy" 8866 8852 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8867 8853 break; … … 8870 8856 8871 8857 /* Line 1806 of yacc.c */ 8872 #line 273 9"parser.yy"8858 #line 2738 "parser.yy" 8873 8859 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 8874 8860 break; … … 8877 8863 8878 8864 /* Line 1806 of yacc.c */ 8879 #line 274 1"parser.yy"8865 #line 2740 "parser.yy" 8880 8866 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8881 8867 break; … … 8884 8870 8885 8871 /* Line 1806 of yacc.c */ 8886 #line 274 4"parser.yy"8872 #line 2743 "parser.yy" 8887 8873 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8888 8874 break; … … 8891 8877 8892 8878 /* Line 1806 of yacc.c */ 8893 #line 274 6"parser.yy"8879 #line 2745 "parser.yy" 8894 8880 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8895 8881 break; … … 8898 8884 8899 8885 /* Line 1806 of yacc.c */ 8900 #line 274 8"parser.yy"8886 #line 2747 "parser.yy" 8901 8887 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); } 8902 8888 break; … … 8905 8891 8906 8892 /* Line 1806 of yacc.c */ 8907 #line 27 50"parser.yy"8893 #line 2749 "parser.yy" 8908 8894 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); } 8909 8895 break; … … 8912 8898 8913 8899 /* Line 1806 of yacc.c */ 8914 #line 275 2"parser.yy"8900 #line 2751 "parser.yy" 8915 8901 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 8916 8902 break; … … 8919 8905 8920 8906 /* Line 1806 of yacc.c */ 8921 #line 275 7"parser.yy"8907 #line 2756 "parser.yy" 8922 8908 { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); } 8923 8909 break; … … 8926 8912 8927 8913 /* Line 1806 of yacc.c */ 8928 #line 275 9"parser.yy"8914 #line 2758 "parser.yy" 8929 8915 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); } 8930 8916 break; … … 8933 8919 8934 8920 /* Line 1806 of yacc.c */ 8935 #line 276 4"parser.yy"8921 #line 2763 "parser.yy" 8936 8922 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); } 8937 8923 break; … … 8940 8926 8941 8927 /* Line 1806 of yacc.c */ 8942 #line 276 6"parser.yy"8928 #line 2765 "parser.yy" 8943 8929 { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); } 8944 8930 break; … … 8947 8933 8948 8934 /* Line 1806 of yacc.c */ 8949 #line 279 3"parser.yy"8935 #line 2792 "parser.yy" 8950 8936 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); } 8951 8937 break; … … 8954 8940 8955 8941 /* Line 1806 of yacc.c */ 8956 #line 280 4"parser.yy"8942 #line 2803 "parser.yy" 8957 8943 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8958 8944 break; … … 8961 8947 8962 8948 /* Line 1806 of yacc.c */ 8963 #line 280 6"parser.yy"8949 #line 2805 "parser.yy" 8964 8950 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8965 8951 break; … … 8968 8954 8969 8955 /* Line 1806 of yacc.c */ 8970 #line 280 8"parser.yy"8956 #line 2807 "parser.yy" 8971 8957 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8972 8958 break; … … 8975 8961 8976 8962 /* Line 1806 of yacc.c */ 8977 #line 28 10"parser.yy"8963 #line 2809 "parser.yy" 8978 8964 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8979 8965 break; … … 8982 8968 8983 8969 /* Line 1806 of yacc.c */ 8984 #line 281 2"parser.yy"8970 #line 2811 "parser.yy" 8985 8971 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); } 8986 8972 break; … … 8989 8975 8990 8976 /* Line 1806 of yacc.c */ 8991 #line 281 4"parser.yy"8977 #line 2813 "parser.yy" 8992 8978 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); } 8993 8979 break; … … 8996 8982 8997 8983 /* Line 1806 of yacc.c */ 8998 #line 282 1"parser.yy"8984 #line 2820 "parser.yy" 8999 8985 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9000 8986 break; … … 9003 8989 9004 8990 /* Line 1806 of yacc.c */ 9005 #line 282 3"parser.yy"8991 #line 2822 "parser.yy" 9006 8992 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9007 8993 break; … … 9010 8996 9011 8997 /* Line 1806 of yacc.c */ 9012 #line 282 5"parser.yy"8998 #line 2824 "parser.yy" 9013 8999 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9014 9000 break; … … 9017 9003 9018 9004 /* Line 1806 of yacc.c */ 9019 #line 282 7"parser.yy"9005 #line 2826 "parser.yy" 9020 9006 { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9021 9007 break; … … 9024 9010 9025 9011 /* Line 1806 of yacc.c */ 9026 #line 282 9"parser.yy"9012 #line 2828 "parser.yy" 9027 9013 { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( nullptr, nullptr, false ) ); } 9028 9014 break; … … 9031 9017 9032 9018 /* Line 1806 of yacc.c */ 9033 #line 283 1"parser.yy"9019 #line 2830 "parser.yy" 9034 9020 { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); } 9035 9021 break; … … 9038 9024 9039 9025 /* Line 1806 of yacc.c */ 9040 #line 283 6"parser.yy"9026 #line 2835 "parser.yy" 9041 9027 { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); } 9042 9028 break; … … 9045 9031 9046 9032 /* Line 1806 of yacc.c */ 9047 #line 284 3"parser.yy"9033 #line 2842 "parser.yy" 9048 9034 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9049 9035 break; … … 9052 9038 9053 9039 /* Line 1806 of yacc.c */ 9054 #line 284 5"parser.yy"9040 #line 2844 "parser.yy" 9055 9041 { (yyval.decl) = DeclarationNode::newFunction( nullptr, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), nullptr ); } 9056 9042 break; … … 9059 9045 9060 9046 /* Line 1806 of yacc.c */ 9061 #line 286 9"parser.yy"9047 #line 2868 "parser.yy" 9062 9048 { (yyval.en) = 0; } 9063 9049 break; … … 9066 9052 9067 9053 /* Line 1806 of yacc.c */ 9068 #line 287 1"parser.yy"9054 #line 2870 "parser.yy" 9069 9055 { (yyval.en) = (yyvsp[(2) - (2)].en); } 9070 9056 break; … … 9073 9059 9074 9060 /* Line 1806 of yacc.c */ 9075 #line 90 76"Parser/parser.cc"9061 #line 9062 "Parser/parser.cc" 9076 9062 default: break; 9077 9063 } … … 9304 9290 9305 9291 /* Line 2067 of yacc.c */ 9306 #line 287 4"parser.yy"9292 #line 2873 "parser.yy" 9307 9293 9308 9294 // ----end of grammar---- -
src/Parser/parser.yy
r3f0c6a5 r47a8d17 199 199 200 200 %type<decl> field_declaration field_declaration_list field_declarator field_declaring_list 201 %type<en> field field_list field_name 201 %type<en> field field_list 202 %type<tok> field_name 202 203 203 204 %type<decl> external_function_definition function_definition function_array function_declarator function_no_ptr function_ptr … … 383 384 { $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); } 384 385 | postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector 385 { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $5 ) ) ); }386 386 | postfix_expression REALFRACTIONconstant // CFA, tuple index 387 { $$ = new ExpressionNode( build_fieldSel( $1, build_constantInteger( *$2 ) ) ); }388 387 | postfix_expression ARROW no_attr_identifier 389 388 { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); } 390 389 | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector 391 { $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $5 ) ) ); }392 390 | postfix_expression ICR 393 391 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); } … … 423 421 field: // CFA, tuple field selector 424 422 field_name 423 { $$ = new ExpressionNode( build_varref( $1 ) ); } 425 424 | REALDECIMALconstant field 426 { $$ = new ExpressionNode( build_fieldSel( new ExpressionNode( build_constantInteger( *$1 ) ), maybeMoveBuild<Expression>( $2) ) ); }425 { $$ = new ExpressionNode( build_fieldSel( $2, build_varref( $1 ) ) ); } 427 426 | REALDECIMALconstant '[' push field_list pop ']' 428 { $$ = new ExpressionNode( build_fieldSel( new ExpressionNode( build_constantInteger( *$1 ) ), build_tuple( $4) ) ); }427 { $$ = new ExpressionNode( build_fieldSel( $4, build_varref( $1 ) ) ); } 429 428 | field_name '.' field 430 { $$ = new ExpressionNode( build_fieldSel( $ 1, maybeMoveBuild<Expression>( $3) ) ); }429 { $$ = new ExpressionNode( build_fieldSel( $3, build_varref( $1 ) ) ); } 431 430 | field_name '.' '[' push field_list pop ']' 432 { $$ = new ExpressionNode( build_fieldSel( $ 1, build_tuple( $5) ) ); }431 { $$ = new ExpressionNode( build_fieldSel( $5, build_varref( $1 ) ) ); } 433 432 | field_name ARROW field 434 { $$ = new ExpressionNode( build_pfieldSel( $ 1, maybeMoveBuild<Expression>( $3) ) ); }433 { $$ = new ExpressionNode( build_pfieldSel( $3, build_varref( $1 ) ) ); } 435 434 | field_name ARROW '[' push field_list pop ']' 436 { $$ = new ExpressionNode( build_pfieldSel( $ 1, build_tuple( $5) ) ); }437 ; 438 439 field_name: // ... use $2435 { $$ = new ExpressionNode( build_pfieldSel( $5, build_varref( $1 ) ) ); } 436 ; 437 438 field_name: 440 439 INTEGERconstant fraction_constants 441 { $$ = new ExpressionNode( build_constantInteger( *$1 ) ); }440 { $$ = $1; } 442 441 | FLOATINGconstant fraction_constants 443 { $$ = new ExpressionNode( build_constantInteger( *$1 ) ); }442 { $$ = $1; } 444 443 | no_attr_identifier fraction_constants 445 { $$ = new ExpressionNode( build_varref( $1 ) ); }444 { $$ = $1; } 446 445 ; 447 446 -
src/ResolvExpr/Alternative.cc
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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" 43 #include "InitTweak/GenInit.h"44 44 #include "ResolveTypeof.h" 45 45 … … 64 64 } 65 65 66 Cost sumCost( const AltList &in ) {67 Cost total;68 for ( AltList::const_iterator i = in.begin(); i != in.end(); ++i ) {69 total += i->cost;70 }71 return total;72 }73 74 66 namespace { 75 67 void printAlts( const AltList &list, std::ostream &os, int indent = 0 ) { … … 84 76 out.push_back( i->expr->clone() ); 85 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; 86 86 } 87 87 … … 101 101 PruneStruct current( candidate ); 102 102 std::string mangleName; 103 {104 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(); 105 105 candidate->env.apply( newType ); 106 mangleName = SymTab::Mangler::mangle( newType );106 mangleName += SymTab::Mangler::mangle( newType ); 107 107 delete newType; 108 108 } … … 133 133 if ( ! target->second.isAmbiguous ) { 134 134 Alternative &alt = *target->second.candidate; 135 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 } 136 138 *out++ = alt; 137 139 } 138 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 } 139 169 } 140 170 141 171 void renameTypes( Expression *expr ) { 142 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 } 143 175 } 144 176 } … … 172 204 for ( AltList::iterator i = alternatives.begin(); i != alternatives.end(); ++i ) { 173 205 if ( adjust ) { 174 adjustExprType ( i->expr->get_result(), i->env, indexer );206 adjustExprTypeList( i->expr->get_results().begin(), i->expr->get_results().end(), i->env, indexer ); 175 207 } 176 208 } … … 208 240 } 209 241 210 // std::unordered_map< Expression *, UniqueExpr * > ;211 212 242 template< typename StructOrUnionType > 213 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 214 // by this point, member must be a name expr 215 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member ); 216 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 ) { 217 244 std::list< Declaration* > members; 218 245 aggInst->lookup( name, members ); … … 227 254 } 228 255 229 void AlternativeFinder::addTupleMembers( TupleType * tupleType, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) {230 if ( ConstantExpr * constantExpr = dynamic_cast< ConstantExpr * >( member ) ) {231 // get the value of the constant expression as an int, must be between 0 and the length of the tuple type to have meaning232 // xxx - this should be improved by memoizing the value of constant exprs233 // during parsing and reusing that information here.234 std::stringstream ss( constantExpr->get_constant()->get_value() );235 int val;236 std::string tmp;237 if ( ss >> val && ! (ss >> tmp) ) {238 if ( val >= 0 && (unsigned int)val < tupleType->size() ) {239 alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) );240 } // if241 } // if242 } // if243 }244 245 256 void AlternativeFinder::visit( ApplicationExpr *applicationExpr ) { 246 257 alternatives.push_back( Alternative( applicationExpr->clone(), env, Cost::zero ) ); … … 248 259 249 260 Cost computeConversionCost( Alternative &alt, const SymTab::Indexer &indexer ) { 250 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( alt.expr ); 251 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 252 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 ); 253 267 254 268 Cost convCost( 0, 0, 0 ); … … 256 270 std::list< DeclarationWithType* >::iterator formal = formals.begin(); 257 271 std::list< Expression* >& actuals = appExpr->get_args(); 258 259 std::list< Type * > formalTypes;260 std::list< Type * >::iterator formalType = formalTypes.end();261 262 272 for ( std::list< Expression* >::iterator actualExpr = actuals.begin(); actualExpr != actuals.end(); ++actualExpr ) { 263 264 273 PRINT( 265 274 std::cerr << "actual expression:" << std::endl; 266 275 (*actualExpr)->print( std::cerr, 8 ); 267 276 std::cerr << "--- results are" << std::endl; 268 (*actualExpr)->get_result()->print(std::cerr, 8 );277 printAll( (*actualExpr)->get_results(), std::cerr, 8 ); 269 278 ) 270 279 std::list< DeclarationWithType* >::iterator startFormal = formal; 271 280 Cost actualCost; 272 std::list< Type * > flatActualTypes; 273 flatten( (*actualExpr)->get_result(), back_inserter( flatActualTypes ) ); 274 for ( std::list< Type* >::iterator actualType = flatActualTypes.begin(); actualType != flatActualTypes.end(); ++actualType ) { 275 276 277 // tuple handling code 278 if ( formalType == formalTypes.end() ) { 279 // the type of the formal parameter may be a tuple type. To make this easier to work with, 280 // flatten the tuple type and traverse the resulting list of types, incrementing the formal 281 // iterator once its types have been extracted. Once a particular formal parameter's type has 282 // been exhausted load the next formal parameter's type. 283 if ( formal == formals.end() ) { 284 if ( function->get_isVarArgs() ) { 285 convCost += Cost( 1, 0, 0 ); 286 break; 287 } else { 288 return Cost::infinity; 289 } 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; 290 288 } 291 formalTypes.clear();292 flatten( (*formal)->get_type(), back_inserter( formalTypes ) );293 formalType = formalTypes.begin();294 ++formal;295 289 } 296 297 290 PRINT( 298 291 std::cerr << std::endl << "converting "; 299 (*actual Type)->print( std::cerr, 8 );292 (*actual)->print( std::cerr, 8 ); 300 293 std::cerr << std::endl << " to "; 301 294 (*formal)->get_type()->print( std::cerr, 8 ); 302 295 ) 303 Cost newCost = conversionCost( *actual Type, *formalType, indexer, alt.env );296 Cost newCost = conversionCost( *actual, (*formal)->get_type(), indexer, alt.env ); 304 297 PRINT( 305 298 std::cerr << std::endl << "cost is" << newCost << std::endl; … … 312 305 actualCost += newCost; 313 306 314 convCost += Cost( 0, polyCost( *formalType, alt.env, indexer ) + polyCost( *actualType, alt.env, indexer ), 0 );315 316 formal Type++;307 convCost += Cost( 0, polyCost( (*formal)->get_type(), alt.env, indexer ) + polyCost( *actual, alt.env, indexer ), 0 ); 308 309 formal++; 317 310 } 318 311 if ( actualCost != Cost( 0, 0, 0 ) ) { … … 363 356 /// Adds type variables to the open variable set and marks their assertions 364 357 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ) { 365 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 ) { 366 359 unifiableVars[ (*tyvar)->get_name() ] = (*tyvar)->get_kind(); 367 360 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) { … … 372 365 } 373 366 374 /// instantiate a single argument by matching actuals from [actualIt, actualEnd) against formalType, 375 /// producing expression(s) in out and their total cost in cost. 376 template< typename AltIterator, typename OutputIterator > 377 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 ) { 378 if ( TupleType * tupleType = dynamic_cast< TupleType * >( formalType ) ) { 379 // formalType is a TupleType - group actuals into a TupleExpr whose type unifies with the TupleType 380 TupleExpr * tupleExpr = new TupleExpr(); 381 for ( Type * type : *tupleType ) { 382 if ( ! instantiateArgument( type, defaultValue, actualIt, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( tupleExpr->get_exprs() ) ) ) { 383 delete tupleExpr; 384 return false; 385 } 386 } 387 tupleExpr->set_result( Tuples::makeTupleType( tupleExpr->get_exprs() ) ); 388 *out++ = tupleExpr; 389 } else if ( actualIt != actualEnd ) { 390 // both actualType and formalType are atomic (non-tuple) types - if they unify 391 // then accept actual as an argument, otherwise return false (fail to instantiate argument) 392 Expression * actual = actualIt->expr; 393 Type * actualType = actual->get_result(); 394 PRINT( 395 std::cerr << "formal type is "; 396 formalType->print( std::cerr ); 397 std::cerr << std::endl << "actual type is "; 398 actualType->print( std::cerr ); 399 std::cerr << std::endl; 400 ) 401 if ( ! unify( formalType, actualType, resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 402 return false; 403 } 404 // move the expression from the alternative to the output iterator 405 *out++ = actual; 406 actualIt->expr = nullptr; 407 cost += actualIt->cost; 408 ++actualIt; 409 } else { 410 // End of actuals - Handle default values 411 if ( SingleInit *si = dynamic_cast<SingleInit *>( defaultValue )) { 412 // so far, only constant expressions are accepted as default values 413 if ( ConstantExpr *cnstexpr = dynamic_cast<ConstantExpr *>( si->get_value()) ) { 414 if ( Constant *cnst = dynamic_cast<Constant *>( cnstexpr->get_constant() ) ) { 415 if ( unify( formalType, cnst->get_type(), resultEnv, resultNeed, resultHave, openVars, indexer ) ) { 416 // xxx - Don't know if this is right 417 *out++ = cnstexpr->clone(); 418 return true; 419 } // if 420 } // if 421 } // if 422 } // if 423 return false; 424 } // if 425 return true; 426 } 427 428 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 ) { 429 368 simpleCombineEnvironments( actuals.begin(), actuals.end(), resultEnv ); 430 369 // make sure we don't widen any existing bindings … … 434 373 resultEnv.extractOpenVars( openVars ); 435 374 436 // flatten actuals so that each actual has an atomic (non-tuple) type 437 AltList exploded; 438 Tuples::explode( actuals, indexer, back_inserter( exploded ) ); 439 440 AltList::iterator actualExpr = exploded.begin(); 441 AltList::iterator actualEnd = exploded.end(); 442 for ( DeclarationWithType * formal : formals ) { 443 // match flattened actuals with formal parameters - actuals will be grouped to match 444 // with formals as appropriate 445 Cost cost; 446 std::list< Expression * > newExprs; 447 ObjectDecl * obj = safe_dynamic_cast< ObjectDecl * >( formal ); 448 if ( ! instantiateArgument( obj->get_type(), obj->get_init(), actualExpr, actualEnd, openVars, resultEnv, resultNeed, resultHave, indexer, cost, back_inserter( newExprs ) ) ) { 449 deleteAll( newExprs ); 450 return false; 451 } 452 // success - produce argument as a new alternative 453 assert( newExprs.size() == 1 ); 454 out.push_back( Alternative( newExprs.front(), resultEnv, cost ) ); 455 } 456 if ( actualExpr != actualEnd ) { 457 // there are still actuals remaining, but we've run out of formal parameters to match against 458 // this is okay only if the function is variadic 459 if ( ! isVarArgs ) { 460 return false; 461 } 462 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; 463 416 } 464 417 return true; … … 547 500 //if ( newNeedParents[ curDecl->get_uniqueId() ][ candDecl->get_uniqueId() ]++ > recursionParentLimit ) continue; 548 501 Expression *varExpr = new VariableExpr( candDecl ); 549 delete varExpr->get_result(); 550 varExpr->set_result( adjType->clone() ); 502 deleteAll( varExpr->get_results() ); 503 varExpr->get_results().clear(); 504 varExpr->get_results().push_front( adjType->clone() ); 551 505 PRINT( 552 506 std::cerr << "satisfying assertion " << curDecl->get_uniqueId() << " "; … … 591 545 592 546 template< typename OutputIterator > 593 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 ) { 594 548 OpenVarSet openVars; 595 549 AssertionSet resultNeed, resultHave; 596 550 TypeEnvironment resultEnv; 597 551 makeUnifiableVars( funcType, openVars, resultNeed ); 598 AltList instantiatedActuals; // filled by instantiate function 599 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 ) ) { 600 553 ApplicationExpr *appExpr = new ApplicationExpr( func.expr->clone() ); 601 Alternative newAlt( appExpr, resultEnv, sumCost( instantiatedActuals) );602 makeExprList( instantiatedActuals, appExpr->get_args() );554 Alternative newAlt( appExpr, resultEnv, sumCost( actualAlt ) ); 555 makeExprList( actualAlt, appExpr->get_args() ); 603 556 PRINT( 604 557 std::cerr << "need assertions:" << std::endl; … … 621 574 PointerType pt( Type::Qualifiers(), v.clone() ); 622 575 UntypedExpr *vexpr = untypedExpr->clone(); 623 vexpr-> set_result( pt.clone() );576 vexpr->get_results().push_front( pt.clone() ); 624 577 alternatives.push_back( Alternative( vexpr, env, Cost()) ); 625 578 return; … … 634 587 combos( argAlternatives.begin(), argAlternatives.end(), back_inserter( possibilities ) ); 635 588 636 // take care of possible tuple assignments 637 // if not tuple assignment, assignment is taken care of as a normal function call 638 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 ... 639 594 640 595 AltList candidates; … … 649 604 // check if the type is pointer to function 650 605 PointerType *pointer; 651 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() ) ) ) { 652 607 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 653 608 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 685 640 // check if the type is pointer to function 686 641 PointerType *pointer; 687 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() ) ) ) { 688 644 if ( FunctionType *function = dynamic_cast< FunctionType* >( pointer->get_base() ) ) { 689 645 for ( std::list< AltList >::iterator actualAlt = possibilities.begin(); actualAlt != possibilities.end(); ++actualAlt ) { … … 709 665 710 666 PRINT( 711 ApplicationExpr *appExpr = safe_dynamic_cast< ApplicationExpr* >( withFunc->expr ); 712 PointerType *pointer = safe_dynamic_cast< PointerType* >( appExpr->get_function()->get_result() ); 713 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 ); 714 673 std::cerr << "Case +++++++++++++" << std::endl; 715 674 std::cerr << "formals are:" << std::endl; … … 733 692 734 693 bool isLvalue( Expression *expr ) { 735 // xxx - recurse into tuples? 736 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; 737 698 } 738 699 … … 748 709 749 710 void AlternativeFinder::visit( CastExpr *castExpr ) { 750 Type *& toType = castExpr->get_result(); 751 toType = resolveTypeof( toType, indexer ); 752 SymTab::validateType( toType, &indexer ); 753 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 754 716 755 717 AlternativeFinder finder( indexer, env ); … … 765 727 // that are cast directly. The candidate is invalid if it has fewer results than there are types to cast 766 728 // to. 767 int discardedValues = (*i).expr->get_result ()->size() - castExpr->get_result()->size();729 int discardedValues = (*i).expr->get_results().size() - castExpr->get_results().size(); 768 730 if ( discardedValues < 0 ) continue; 769 // 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() ); 770 733 // unification run for side-effects 771 unify( castExpr->get_result(), (*i).expr->get_result(), i->env, needAssertions, haveAssertions, openVars, indexer ); 772 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 ); 773 740 if ( thisCost != Cost::infinity ) { 774 741 // count one safe conversion for each value that is thrown away … … 793 760 794 761 for ( AltList::const_iterator agg = funcFinder.alternatives.begin(); agg != funcFinder.alternatives.end(); ++agg ) { 795 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( agg->expr->get_result() )) {796 addAggMembers( structInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );797 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( agg->expr->get_result() ) ) {798 addAggMembers( unionInst, agg->expr, agg->cost, agg->env, memberExpr->get_member() );799 } else if ( TupleType * tupleType = dynamic_cast< TupleType * >( agg->expr->get_result() ) ) {800 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 801 768 } // if 802 769 } // for … … 824 791 renameTypes( alternatives.back().expr ); 825 792 if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) { 826 NameExpr nameExpr( "" ); 827 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 793 addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 828 794 } else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) { 829 NameExpr nameExpr( "" ); 830 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr ); 795 addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, "" ); 831 796 } // if 832 797 } // for … … 929 894 alternatives.push_back( Alternative( new AttrExpr( new VariableExpr( funcDecl ), argType->clone() ), env, Cost::zero ) ); 930 895 for ( std::list< DeclarationWithType* >::iterator i = function->get_returnVals().begin(); i != function->get_returnVals().end(); ++i ) { 931 alternatives.back().expr-> set_result( (*i)->get_type()->clone() );896 alternatives.back().expr->get_results().push_back( (*i)->get_type()->clone() ); 932 897 } // for 933 898 } // if … … 952 917 finder.find( attrExpr->get_expr() ); 953 918 for ( AltList::iterator choice = finder.alternatives.begin(); choice != finder.alternatives.end(); ++choice ) { 954 if ( choice->expr->get_result ()->size() == 1 ) {955 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 ); 956 921 } // fi 957 922 } // for … … 995 960 AssertionSet needAssertions, haveAssertions; 996 961 Alternative newAlt( 0, third->env, first->cost + second->cost + third->cost ); 997 Type* commonType;998 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 ) ) { 999 964 ConditionalExpr *newExpr = new ConditionalExpr( first->expr->clone(), second->expr->clone(), third->expr->clone() ); 1000 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 1001 974 newAlt.expr = newExpr; 1002 975 inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( alternatives ) ); … … 1026 999 TupleExpr *newExpr = new TupleExpr; 1027 1000 makeExprList( *i, newExpr->get_exprs() ); 1028 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 1029 1006 1030 1007 TypeEnvironment compositeEnv; … … 1047 1024 } 1048 1025 } 1049 1050 void AlternativeFinder::visit( TupleIndexExpr *tupleExpr ) {1051 alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );1052 }1053 1054 void AlternativeFinder::visit( TupleAssignExpr *tupleAssignExpr ) {1055 alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) );1056 }1057 1058 void AlternativeFinder::visit( UniqueExpr *unqExpr ) {1059 // this won't work because the unqExprs wont share an expression anymore...1060 AlternativeFinder finder( indexer, env );1061 finder.findWithAdjustment( unqExpr->get_expr() );1062 for ( Alternative & alt : finder.alternatives ) {1063 // xxx - attach a resolved ConstructorInit node?1064 // xxx - is it possible to make the objDecl's type const?1065 static UniqueName tempNamer( "_unq_expr_" );1066 ObjectDecl * objDecl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, alt.expr->get_result()->clone(), nullptr );1067 // must be done on two lines because genCtorInit accesses objDecl's fields1068 objDecl->set_init( InitTweak::genCtorInit( objDecl ) );1069 1070 UniqueExpr * newUnqExpr = new UniqueExpr( alt.expr->clone(), unqExpr->get_id() );1071 newUnqExpr->set_object( objDecl );1072 1073 resolveObject( indexer, objDecl );1074 1075 alternatives.push_back( Alternative( newUnqExpr, env, Cost::zero ) );1076 }1077 }1078 1079 1026 } // namespace ResolvExpr 1080 1027 -
src/ResolvExpr/AlternativeFinder.h
r3f0c6a5 r47a8d17 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 void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl );98 99 template< typename InputIterator, typename OutputIterator >100 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {101 AltList alternatives;102 103 // select the alternatives that have the minimum parameter cost104 Cost minCost = Cost::infinity;105 for ( InputIterator i = begin; i != end; ++i ) {106 if ( i->cost < minCost ) {107 minCost = i->cost;108 i->cost = i->cvtCost;109 alternatives.clear();110 alternatives.push_back( *i );111 } else if ( i->cost == minCost ) {112 i->cost = i->cvtCost;113 alternatives.push_back( *i );114 }115 }116 std::copy( alternatives.begin(), alternatives.end(), out );117 }118 119 Cost sumCost( const AltList &in );120 121 template< typename InputIterator >122 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) {123 while ( begin != end ) {124 result.simpleCombine( (*begin++).env );125 }126 }127 91 } // namespace ResolvExpr 128 92 -
src/ResolvExpr/AlternativePrinter.cc
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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" … … 35 34 class Resolver : public SymTab::Indexer { 36 35 public: 37 Resolver() : SymTab::Indexer( false ) {} 38 Resolver( const SymTab::Indexer & indexer ) : SymTab::Indexer( indexer ) {} 36 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 39 37 40 38 virtual void visit( FunctionDecl *functionDecl ); 41 virtual void visit( ObjectDecl * objectDecl );39 virtual void visit( ObjectDecl *functionDecl ); 42 40 virtual void visit( TypeDecl *typeDecl ); 43 41 virtual void visit( EnumDecl * enumDecl ); … … 69 67 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 70 68 void fallbackInit( ConstructorInit * ctorInit ); 71 Type * functionReturn = nullptr;72 Type *initContext = nullptr;73 Type *switchType = nullptr;69 std::list< Type * > functionReturn; 70 Type *initContext; 71 Type *switchType; 74 72 bool inEnumDecl = false; 75 73 }; … … 159 157 const TypeEnvironment *newEnv = 0; 160 158 for ( AltList::const_iterator i = finder.get_alternatives().begin(); i != finder.get_alternatives().end(); ++i ) { 161 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() ) ) { 162 160 if ( newExpr ) { 163 161 throw SemanticError( "Too many interpretations for case control expression", untyped ); … … 236 234 Type *new_type = resolveTypeof( functionDecl->get_type(), *this ); 237 235 functionDecl->set_type( new_type ); 238 ValueGuard< Type * > oldFunctionReturn( functionReturn ); 239 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 240 241 SymTab::Indexer::visit( functionDecl ); 242 functionReturn = oldFunctionReturn; 241 243 } 242 244 … … 336 338 void Resolver::visit( ReturnStmt *returnStmt ) { 337 339 if ( returnStmt->get_expr() ) { 338 CastExpr *castExpr = new CastExpr( returnStmt->get_expr(), functionReturn->clone() ); 340 CastExpr *castExpr = new CastExpr( returnStmt->get_expr() ); 341 cloneAll( functionReturn, castExpr->get_results() ); 339 342 Expression *newExpr = findSingleExpression( castExpr, *this ); 340 343 delete castExpr; … … 381 384 if ( isCharType( at->get_base() ) ) { 382 385 // check if the resolved type is char * 383 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result () ) ) {386 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_results().front() ) ) { 384 387 if ( isCharType( pt->get_base() ) ) { 385 388 // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello"; … … 443 446 (*iter)->accept( *this ); 444 447 } // for 445 } else if ( TupleType * tt = dynamic_cast< TupleType * > ( initContext ) ) {446 for ( Type * t : *tt ) {447 if ( iter == end ) break;448 initContext = t;449 (*iter++)->accept( *this );450 }451 448 } else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) { 452 449 resolveAggrInit( st->get_baseStruct(), iter, end ); … … 533 530 } 534 531 535 void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl ) {536 Resolver resolver( indexer );537 objectDecl->accept( resolver );538 }539 540 532 void Resolver::visit( ConstructorInit *ctorInit ) { 541 533 // xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit -
src/ResolvExpr/TypeEnvironment.cc
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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* ), object( new ObjectDecl* ), 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 set_object( nullptr );592 }593 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ), object( other.object ), id( other.id ) {594 }595 UniqueExpr::~UniqueExpr() {596 if ( expr.unique() ) {597 delete *expr;598 }599 if ( object.unique() ) {600 delete *object;601 }602 }603 void UniqueExpr::print( std::ostream &os, int indent ) const {604 os << "Unique Expression with id:" << id << std::endl << std::string( indent+2, ' ' );605 get_expr()->print( os, indent+2 );606 if ( get_object() ) {607 os << " with decl: ";608 get_object()->printShort( os, indent+2 );609 }610 565 } 611 566 -
src/SynTree/Expression.h
r3f0c6a5 r47a8d17 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 ObjectDecl * get_object() const { return *object; }745 UniqueExpr * set_object( ObjectDecl * newValue ) { *object = newValue; return this; }746 747 int get_id() const { return id; }748 749 virtual UniqueExpr *clone() const { return new UniqueExpr( *this ); }750 virtual void accept( Visitor &v ) { v.visit( this ); }751 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }752 virtual void print( std::ostream &os, int indent = 0 ) const;753 private:754 std::shared_ptr< Expression * > expr;755 std::shared_ptr< ObjectDecl * > object;756 int id;757 static long long count;758 672 }; 759 673 -
src/SynTree/Initializer.h
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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, spotter.currentFinder.get_indexer(), 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(), spotter.currentFinder.get_indexer(), 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
r3f0c6a5 r47a8d17 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
r3f0c6a5 r47a8d17 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.