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