Changeset e4d829b
- Timestamp:
- Jun 20, 2017, 1:19:53 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 579263a
- Parents:
- c6d2e93
- git-author:
- Rob Schluntz <rschlunt@…> (06/20/17 13:16:13)
- git-committer:
- Rob Schluntz <rschlunt@…> (06/20/17 13:19:53)
- Location:
- src
- Files:
-
- 2 added
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rc6d2e93 re4d829b 298 298 } 299 299 300 void CodeGenerator:: printDesignators( std::list< Expression * > & designators) {301 typedef std::list< Expression * > DesignatorList;300 void CodeGenerator::visit( Designation * designation ) { 301 std::list< Expression * > designators = designation->get_designators(); 302 302 if ( designators.size() == 0 ) return; 303 for ( DesignatorList::iterator iter = designators.begin(); iter != designators.end(); ++iter ) { 304 if ( dynamic_cast< NameExpr * >( *iter ) ) { 305 // if expression is a name, then initializing aggregate member 303 for ( Expression * des : designators ) { 304 if ( dynamic_cast< ConstantExpr * >( des ) ) { 305 // if expression is a ConstantExpr, then initializing array element 306 output << "["; 307 des->accept( *this ); 308 output << "]"; 309 } else { 310 // if not a ConstantExpr, it has to be a NameExpr or VariableExpr, initializing aggregate member 306 311 output << "."; 307 (*iter)->accept( *this ); 308 } else { 309 // if not a simple name, it has to be a constant expression, i.e. an array designator 310 output << "["; 311 (*iter)->accept( *this ); 312 output << "]"; 312 des->accept( *this ); 313 313 } // if 314 314 } // for … … 317 317 318 318 void CodeGenerator::visit( SingleInit * init ) { 319 printDesignators( init->get_designators() );320 319 init->get_value()->accept( *this ); 321 320 } 322 321 323 322 void CodeGenerator::visit( ListInit * init ) { 324 printDesignators( init->get_designators() ); 323 auto initBegin = init->begin(); 324 auto initEnd = init->end(); 325 auto desigBegin = init->get_designations().begin(); 326 auto desigEnd = init->get_designations().end(); 327 325 328 output << "{ "; 326 genCommaList( init->begin(), init->end() ); 329 for ( ; initBegin != initEnd && desigBegin != desigEnd; ) { 330 (*desigBegin)->accept( *this ); 331 (*initBegin)->accept( *this ); 332 ++initBegin, ++desigBegin; 333 if ( initBegin != initEnd ) { 334 output << ", "; 335 } 336 } 327 337 output << " }"; 338 assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() ); 328 339 } 329 340 … … 726 737 727 738 void CodeGenerator::visit( TypeExpr * typeExpr ) { 728 assertf( ! genC, "TypeExpr should not reach code generation." ); 729 output<< genType( typeExpr->get_type(), "", pretty, genC ); 739 // if ( genC ) std::cerr << "typeexpr still exists: " << typeExpr << std::endl; 740 // assertf( ! genC, "TypeExpr should not reach code generation." ); 741 if ( ! genC ) { 742 output<< genType( typeExpr->get_type(), "", pretty, genC ); 743 } 730 744 } 731 745 -
src/CodeGen/CodeGenerator.h
rc6d2e93 re4d829b 47 47 48 48 //*** Initializer 49 virtual void visit( Designation * ); 49 50 virtual void visit( SingleInit * ); 50 51 virtual void visit( ListInit * ); … … 136 137 bool lineMarks = false; 137 138 138 void printDesignators( std::list< Expression * > & );139 139 void handleStorageClass( DeclarationWithType *decl ); 140 140 void handleAggregate( AggregateDecl *aggDecl, const std::string & kind ); -
src/Common/utility.h
rc6d2e93 re4d829b 305 305 // for ( val : group_iterate( container1, container2, ... ) ) {} 306 306 // syntax to have a for each that iterates multiple containers of the same length 307 // TODO: update to use variadic arguments 307 // TODO: update to use variadic arguments, perfect forwarding 308 308 309 309 template< typename T1, typename T2 > -
src/InitTweak/FixInit.cc
rc6d2e93 re4d829b 726 726 // static bool __objName_uninitialized = true 727 727 BasicType * boolType = new BasicType( Type::Qualifiers(), BasicType::Bool ); 728 SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant( boolType->clone(), "1" ) ) , noDesignators);728 SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant( boolType->clone(), "1" ) ) ); 729 729 ObjectDecl * isUninitializedVar = new ObjectDecl( objDecl->get_mangleName() + "_uninitialized", Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, boolType, boolInitExpr ); 730 730 isUninitializedVar->fixUniqueId(); -
src/InitTweak/InitTweak.cc
rc6d2e93 re4d829b 14 14 public: 15 15 bool hasDesignations = false; 16 template<typename Init> 17 void handleInit( Init * init ) { 18 if ( ! init->get_designators().empty() ) hasDesignations = true; 19 else Visitor::visit( init ); 20 } 21 virtual void visit( SingleInit * singleInit ) { handleInit( singleInit); } 22 virtual void visit( ListInit * listInit ) { handleInit( listInit); } 16 virtual void visit( Designation * des ) { 17 if ( ! des->get_designators().empty() ) hasDesignations = true; 18 else Visitor::visit( des ); 19 } 23 20 }; 24 21 -
src/MakeLibCfa.cc
rc6d2e93 re4d829b 92 92 assert( ! objDecl->get_init() ); 93 93 std::list< Expression* > noDesignators; 94 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators,false ) ); // cannot be constructed94 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), false ) ); // cannot be constructed 95 95 newDecls.push_back( objDecl ); 96 96 } -
src/Makefile.in
rc6d2e93 re4d829b 161 161 ResolvExpr/driver_cfa_cpp-Occurs.$(OBJEXT) \ 162 162 ResolvExpr/driver_cfa_cpp-TypeEnvironment.$(OBJEXT) \ 163 ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT) \ 163 164 SymTab/driver_cfa_cpp-Indexer.$(OBJEXT) \ 164 165 SymTab/driver_cfa_cpp-Mangler.$(OBJEXT) \ … … 414 415 ResolvExpr/RenameVars.cc ResolvExpr/FindOpenVars.cc \ 415 416 ResolvExpr/PolyCost.cc ResolvExpr/Occurs.cc \ 416 ResolvExpr/TypeEnvironment.cc SymTab/Indexer.cc \417 SymTab/ Mangler.cc SymTab/Validate.cc SymTab/FixFunction.cc \418 SymTab/ ImplementationType.cc SymTab/TypeEquality.cc \419 SymTab/ Autogen.cc SynTree/Type.cc SynTree/VoidType.cc \420 SynTree/ BasicType.cc SynTree/PointerType.cc \421 SynTree/ ArrayType.cc SynTree/FunctionType.cc \422 SynTree/ ReferenceToType.cc SynTree/TupleType.cc \423 SynTree/T ypeofType.cc SynTree/AttrType.cc \417 ResolvExpr/TypeEnvironment.cc ResolvExpr/CurrentObject.cc \ 418 SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \ 419 SymTab/FixFunction.cc SymTab/ImplementationType.cc \ 420 SymTab/TypeEquality.cc SymTab/Autogen.cc SynTree/Type.cc \ 421 SynTree/VoidType.cc SynTree/BasicType.cc \ 422 SynTree/PointerType.cc SynTree/ArrayType.cc \ 423 SynTree/FunctionType.cc SynTree/ReferenceToType.cc \ 424 SynTree/TupleType.cc SynTree/TypeofType.cc SynTree/AttrType.cc \ 424 425 SynTree/VarArgsType.cc SynTree/ZeroOneType.cc \ 425 426 SynTree/Constant.cc SynTree/Expression.cc SynTree/TupleExpr.cc \ … … 721 722 ResolvExpr/$(am__dirstamp) \ 722 723 ResolvExpr/$(DEPDIR)/$(am__dirstamp) 724 ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT): \ 725 ResolvExpr/$(am__dirstamp) \ 726 ResolvExpr/$(DEPDIR)/$(am__dirstamp) 723 727 SymTab/$(am__dirstamp): 724 728 @$(MKDIR_P) SymTab … … 890 894 -rm -f ResolvExpr/driver_cfa_cpp-CommonType.$(OBJEXT) 891 895 -rm -f ResolvExpr/driver_cfa_cpp-ConversionCost.$(OBJEXT) 896 -rm -f ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT) 892 897 -rm -f ResolvExpr/driver_cfa_cpp-FindOpenVars.$(OBJEXT) 893 898 -rm -f ResolvExpr/driver_cfa_cpp-Occurs.$(OBJEXT) … … 1002 1007 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CommonType.Po@am__quote@ 1003 1008 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-ConversionCost.Po@am__quote@ 1009 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Po@am__quote@ 1004 1010 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-FindOpenVars.Po@am__quote@ 1005 1011 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Occurs.Po@am__quote@ … … 1943 1949 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-TypeEnvironment.obj `if test -f 'ResolvExpr/TypeEnvironment.cc'; then $(CYGPATH_W) 'ResolvExpr/TypeEnvironment.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/TypeEnvironment.cc'; fi` 1944 1950 1951 ResolvExpr/driver_cfa_cpp-CurrentObject.o: ResolvExpr/CurrentObject.cc 1952 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ResolvExpr/driver_cfa_cpp-CurrentObject.o -MD -MP -MF ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.o `test -f 'ResolvExpr/CurrentObject.cc' || echo '$(srcdir)/'`ResolvExpr/CurrentObject.cc 1953 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Po 1954 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ResolvExpr/CurrentObject.cc' object='ResolvExpr/driver_cfa_cpp-CurrentObject.o' libtool=no @AMDEPBACKSLASH@ 1955 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1956 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.o `test -f 'ResolvExpr/CurrentObject.cc' || echo '$(srcdir)/'`ResolvExpr/CurrentObject.cc 1957 1958 ResolvExpr/driver_cfa_cpp-CurrentObject.obj: ResolvExpr/CurrentObject.cc 1959 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ResolvExpr/driver_cfa_cpp-CurrentObject.obj -MD -MP -MF ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.obj `if test -f 'ResolvExpr/CurrentObject.cc'; then $(CYGPATH_W) 'ResolvExpr/CurrentObject.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/CurrentObject.cc'; fi` 1960 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Po 1961 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ResolvExpr/CurrentObject.cc' object='ResolvExpr/driver_cfa_cpp-CurrentObject.obj' libtool=no @AMDEPBACKSLASH@ 1962 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 1963 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.obj `if test -f 'ResolvExpr/CurrentObject.cc'; then $(CYGPATH_W) 'ResolvExpr/CurrentObject.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/CurrentObject.cc'; fi` 1964 1945 1965 SymTab/driver_cfa_cpp-Indexer.o: SymTab/Indexer.cc 1946 1966 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-Indexer.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Tpo -c -o SymTab/driver_cfa_cpp-Indexer.o `test -f 'SymTab/Indexer.cc' || echo '$(srcdir)/'`SymTab/Indexer.cc -
src/Parser/InitializerNode.cc
rc6d2e93 re4d829b 74 74 75 75 InitializerNode *moreInit; 76 if ( get_next() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) != 0) )76 if ( (moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) ) { 77 77 moreInit->printOneLine( os ); 78 } 78 79 } 79 80 80 81 Initializer *InitializerNode::build() const { 81 82 if ( aggregate ) { 83 // steal designators from children 84 std::list< Designation * > designlist; 85 InitializerNode * child = next_init(); 86 for ( ; child != nullptr; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) { 87 std::list< Expression * > desList; 88 buildList< Expression, ExpressionNode >( child->designator, desList ); 89 designlist.push_back( new Designation( desList ) ); 90 } // for 82 91 std::list< Initializer * > initlist; 83 92 buildList< Initializer, InitializerNode >( next_init(), initlist ); 84 85 std::list< Expression * > designlist;86 87 if ( designator != 0 ) {88 buildList< Expression, ExpressionNode >( designator, designlist );89 } // if90 91 93 return new ListInit( initlist, designlist, maybeConstructed ); 92 94 } else { 93 std::list< Expression * > designators; 94 95 if ( designator != 0 ) 96 buildList< Expression, ExpressionNode >( designator, designators ); 97 98 if ( get_expression() != 0) 99 return new SingleInit( maybeBuild< Expression >( get_expression() ), designators, maybeConstructed ); 95 if ( get_expression() != 0) { 96 return new SingleInit( maybeBuild< Expression >( get_expression() ), maybeConstructed ); 97 } 100 98 } // if 101 102 99 return 0; 103 100 } -
src/Parser/TypeData.cc
rc6d2e93 re4d829b 760 760 if ( cur->has_enumeratorValue() ) { 761 761 ObjectDecl * member = dynamic_cast< ObjectDecl * >(* members); 762 member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ) , list< Expression * >()) );762 member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ) ) ); 763 763 } // if 764 764 } // for -
src/ResolvExpr/AlternativeFinder.cc
rc6d2e93 re4d829b 604 604 // ) 605 605 SymTab::Indexer decls( indexer ); 606 PRINT(607 std::cerr << "============= original indexer" << std::endl;608 indexer.print( std::cerr );609 std::cerr << "============= new indexer" << std::endl;610 decls.print( std::cerr );611 )606 // PRINT( 607 // std::cerr << "============= original indexer" << std::endl; 608 // indexer.print( std::cerr ); 609 // std::cerr << "============= new indexer" << std::endl; 610 // decls.print( std::cerr ); 611 // ) 612 612 addToIndexer( have, decls ); 613 613 AssertionSet newNeed; … … 1182 1182 } 1183 1183 1184 void AlternativeFinder::visit( UntypedInitExpr *initExpr ) { 1185 AlternativeFinder finder( indexer, env ); 1186 finder.findWithAdjustment( initExpr->get_expr() ); 1187 // handle each option like a cast -- should probably push this info into AltFinder as a kind of expression, both to keep common code close and to have less 'reach-in', but more 'push-in' 1188 AltList candidates; 1189 std::cerr << "untyped init expr: " << initExpr << std::endl; 1190 // O(N^2) checks of d-types with e-types 1191 for ( Alternative & alt : finder.get_alternatives() ) { 1192 for ( InitAlternative & initAlt : initExpr->get_initAlts() ) { 1193 AssertionSet needAssertions, haveAssertions; 1194 OpenVarSet openVars; 1195 std::cerr << " " << initAlt.type << " " << initAlt.designation << std::endl; 1196 // It's possible that a cast can throw away some values in a multiply-valued expression. (An example is a 1197 // cast-to-void, which casts from one value to zero.) Figure out the prefix of the subexpression results 1198 // that are cast directly. The candidate is invalid if it has fewer results than there are types to cast 1199 // to. 1200 int discardedValues = alt.expr->get_result()->size() - initAlt.type->size(); 1201 if ( discardedValues < 0 ) continue; 1202 // xxx - may need to go into tuple types and extract relevant types and use unifyList. Note that currently, this does not 1203 // allow casting a tuple to an atomic type (e.g. (int)([1, 2, 3])) 1204 // unification run for side-effects 1205 unify( initAlt.type, alt.expr->get_result(), alt.env, needAssertions, haveAssertions, openVars, indexer ); 1206 1207 Cost thisCost = castCost( alt.expr->get_result(), initAlt.type, indexer, alt.env ); 1208 if ( thisCost != Cost::infinity ) { 1209 // count one safe conversion for each value that is thrown away 1210 thisCost += Cost( 0, 0, discardedValues ); 1211 candidates.push_back( Alternative( new InitExpr( alt.expr->clone(), initAlt.type->clone(), initAlt.designation->clone() ), alt.env, alt.cost, thisCost ) ); 1212 } 1213 } 1214 } 1215 1216 // findMinCost selects the alternatives with the lowest "cost" members, but has the side effect of copying the 1217 // cvtCost member to the cost member (since the old cost is now irrelevant). Thus, calling findMinCost twice 1218 // selects first based on argument cost, then on conversion cost. 1219 AltList minArgCost; 1220 findMinCost( candidates.begin(), candidates.end(), std::back_inserter( minArgCost ) ); 1221 findMinCost( minArgCost.begin(), minArgCost.end(), std::back_inserter( alternatives ) ); 1222 } 1184 1223 } // namespace ResolvExpr 1185 1224 -
src/ResolvExpr/AlternativeFinder.h
rc6d2e93 re4d829b 73 73 virtual void visit( UniqueExpr *unqExpr ); 74 74 virtual void visit( StmtExpr *stmtExpr ); 75 virtual void visit( UntypedInitExpr *initExpr ); 75 76 /// Runs a new alternative finder on each element in [begin, end) 76 77 /// and writes each alternative finder to out. -
src/ResolvExpr/Resolver.cc
rc6d2e93 re4d829b 14 14 // 15 15 16 #include <iostream> 17 18 #include "Alternative.h" 19 #include "AlternativeFinder.h" 20 #include "CurrentObject.h" 21 #include "RenameVars.h" 16 22 #include "Resolver.h" 17 #include "AlternativeFinder.h"18 #include "Alternative.h"19 #include "RenameVars.h"20 23 #include "ResolveTypeof.h" 21 24 #include "typeops.h" 25 26 #include "SynTree/Expression.h" 27 #include "SynTree/Initializer.h" 22 28 #include "SynTree/Statement.h" 23 29 #include "SynTree/Type.h" 24 #include "SynTree/Expression.h" 25 #include "Sy nTree/Initializer.h"30 31 #include "SymTab/Autogen.h" 26 32 #include "SymTab/Indexer.h" 27 #include "SymTab/Autogen.h" 33 28 34 #include "Common/utility.h" 35 29 36 #include "InitTweak/InitTweak.h" 30 37 31 #include <iostream>32 38 using namespace std; 33 39 … … 39 45 if ( const Resolver * res = dynamic_cast< const Resolver * >( &other ) ) { 40 46 functionReturn = res->functionReturn; 41 initContext = res->initContext;47 currentObject = res->currentObject; 42 48 inEnumDecl = res->inEnumDecl; 43 49 } … … 79 85 80 86 Type * functionReturn = nullptr; 81 Type *initContext = nullptr;87 CurrentObject currentObject = nullptr; 82 88 bool inEnumDecl = false; 83 89 }; … … 186 192 // each value of initContext is retained, so the type on the first analysis is preserved and used for selecting 187 193 // the RHS. 188 Type *temp = initContext;189 initContext = new_type;190 if ( inEnumDecl && dynamic_cast< EnumInstType * >( initContext) ) {194 ValueGuard<CurrentObject> temp( currentObject ); 195 currentObject = CurrentObject( objectDecl->get_type() ); 196 if ( inEnumDecl && dynamic_cast< EnumInstType * >( objectDecl->get_type() ) ) { 191 197 // enumerator initializers should not use the enum type to initialize, since 192 198 // the enum type is still incomplete at this point. Use signed int instead. 193 initContext = new BasicType( Type::Qualifiers(), BasicType::SignedInt);199 currentObject = CurrentObject( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 194 200 } 195 201 Parent::visit( objectDecl ); 196 if ( inEnumDecl && dynamic_cast< EnumInstType * >( initContext) ) {202 if ( inEnumDecl && dynamic_cast< EnumInstType * >( objectDecl->get_type() ) ) { 197 203 // delete newly created signed int type 198 delete initContext; 199 } 200 initContext = temp; 204 // delete currentObject.getType(); 205 } 201 206 } 202 207 … … 315 320 316 321 void Resolver::visit( SwitchStmt *switchStmt ) { 317 ValueGuard< Type * > oldInitContext( initContext );322 ValueGuard< CurrentObject > oldCurrentObject( currentObject ); 318 323 Expression *newExpr; 319 324 newExpr = findIntegralExpression( switchStmt->get_condition(), *this ); … … 321 326 switchStmt->set_condition( newExpr ); 322 327 323 initContext = newExpr->get_result();328 currentObject = CurrentObject( newExpr->get_result() ); 324 329 Parent::visit( switchStmt ); 325 330 } … … 327 332 void Resolver::visit( CaseStmt *caseStmt ) { 328 333 if ( caseStmt->get_condition() ) { 329 assert( initContext ); 330 CastExpr * castExpr = new CastExpr( caseStmt->get_condition(), initContext->clone() ); 334 std::list< InitAlternative > initAlts = currentObject.getOptions(); 335 assertf( initAlts.size() == 1, "SwitchStmt did not correctly resolve an integral expression." ); 336 CastExpr * castExpr = new CastExpr( caseStmt->get_condition(), initAlts.front().type->clone() ); 331 337 Expression * newExpr = findSingleExpression( castExpr, *this ); 332 338 castExpr = safe_dynamic_cast< CastExpr * >( newExpr ); … … 369 375 } 370 376 377 template< typename Aggr > 378 void lookupDesignation( Aggr * aggr, const std::list< Expression > & designators ) { 379 380 } 381 371 382 void Resolver::visit( SingleInit *singleInit ) { 372 if ( singleInit->get_value() ) { 373 // // find all the d's 374 // std::list<Expression *> &designators = singleInit->get_designators(); 375 // std::list<Type *> types1{ initContext }, types2; 376 // for ( Expression * expr: designators ) { 377 // cerr << expr << endl; 378 // if ( NameExpr * nexpr = dynamic_cast<NameExpr *>( expr ) ) { 379 // for ( Type * type: types1 ) { 380 // cerr << type << endl; 381 // ReferenceToType * fred = dynamic_cast<ReferenceToType *>(type); 382 // std::list<Declaration *> members; 383 // if ( fred ) { 384 // fred->lookup( nexpr->get_name(), members ); // concatenate identical field name 385 // for ( Declaration * mem: members ) { 386 // if ( DeclarationWithType * dwt = dynamic_cast<DeclarationWithType *>(mem) ) { 387 // types2.push_back( dwt->get_type() ); 388 // } // if 389 // } // for 390 // } // if 391 // } // for 392 // types1 = types2; 393 // types2.clear(); 394 // } // if 395 // } // for 396 // // for ( Type * type: types1 ) { 397 // // cerr << type << endl; 398 // // } // for 399 400 // // O(N^2) checks of d-types with f-types 401 // // find the minimum cost 402 CastExpr *castExpr = new CastExpr( singleInit->get_value(), initContext->clone() ); 403 Expression *newExpr = findSingleExpression( castExpr, *this ); 404 delete castExpr; 405 singleInit->set_value( newExpr ); 406 407 // check if initializing type is char[] 408 if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) { 409 if ( isCharType( at->get_base() ) ) { 410 // check if the resolved type is char * 411 if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) { 412 if ( isCharType( pt->get_base() ) ) { 413 // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello"; 414 CastExpr *ce = dynamic_cast< CastExpr * >( newExpr ); 415 singleInit->set_value( ce->get_arg() ); 416 ce->set_arg( NULL ); 417 delete ce; 418 } 419 } 420 } 421 } 422 } // if 423 } 424 425 template< typename AggrInst > 426 TypeSubstitution makeGenericSubstitutuion( AggrInst * inst ) { 427 assert( inst ); 428 assert( inst->get_baseParameters() ); 429 std::list< TypeDecl * > baseParams = *inst->get_baseParameters(); 430 std::list< Expression * > typeSubs = inst->get_parameters(); 431 TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() ); 432 return subs; 433 } 434 435 ReferenceToType * isStructOrUnion( Type * type ) { 436 if ( StructInstType * sit = dynamic_cast< StructInstType * >( type ) ) { 437 return sit; 438 } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( type ) ) { 439 return uit; 440 } 441 return nullptr; 442 } 443 444 void Resolver::resolveSingleAggrInit( Declaration * dcl, InitIterator & init, InitIterator & initEnd, TypeSubstitution sub ) { 445 DeclarationWithType * dt = dynamic_cast< DeclarationWithType * >( dcl ); 446 assert( dt ); 447 // need to substitute for generic types, so that casts are to concrete types 448 initContext = dt->get_type()->clone(); 449 sub.apply( initContext ); 450 451 try { 452 if ( init == initEnd ) return; // stop when there are no more initializers 453 (*init)->accept( *this ); 454 ++init; // made it past an initializer 455 } catch( SemanticError & ) { 456 // need to delve deeper, if you can 457 if ( ReferenceToType * type = isStructOrUnion( initContext ) ) { 458 resolveAggrInit( type, init, initEnd ); 459 } else { 460 // member is not an aggregate type, so can't go any deeper 461 462 // might need to rethink what is being thrown 463 throw; 464 } // if 465 } 466 } 467 468 void Resolver::resolveAggrInit( ReferenceToType * inst, InitIterator & init, InitIterator & initEnd ) { 469 if ( StructInstType * sit = dynamic_cast< StructInstType * >( inst ) ) { 470 TypeSubstitution sub = makeGenericSubstitutuion( sit ); 471 StructDecl * st = sit->get_baseStruct(); 472 if(st->get_members().empty()) return; 473 // want to resolve each initializer to the members of the struct, 474 // but if there are more initializers than members we should stop 475 list< Declaration * >::iterator it = st->get_members().begin(); 476 for ( ; it != st->get_members().end(); ++it) { 477 resolveSingleAggrInit( *it, init, initEnd, sub ); 478 } 479 } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( inst ) ) { 480 TypeSubstitution sub = makeGenericSubstitutuion( uit ); 481 UnionDecl * un = uit->get_baseUnion(); 482 if(un->get_members().empty()) return; 483 // only resolve to the first member of a union 484 resolveSingleAggrInit( *un->get_members().begin(), init, initEnd, sub ); 485 } // if 486 } 383 UntypedInitExpr * untyped = new UntypedInitExpr( singleInit->get_value(), currentObject.getOptions() ); 384 Expression * newExpr = findSingleExpression( untyped, *this ); 385 InitExpr * initExpr = safe_dynamic_cast< InitExpr * >( newExpr ); 386 singleInit->set_value( new CastExpr( initExpr->get_expr()->clone(), initExpr->get_result()->clone() ) ); 387 currentObject.setNext( initExpr->get_designation() ); 388 currentObject.increment(); 389 delete initExpr; 390 391 // // check if initializing type is char[] 392 // if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) { 393 // if ( isCharType( at->get_base() ) ) { 394 // // check if the resolved type is char * 395 // if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) { 396 // if ( isCharType( pt->get_base() ) ) { 397 // // strip cast if we're initializing a char[] with a char *, e.g. char x[] = "hello"; 398 // CastExpr *ce = dynamic_cast< CastExpr * >( newExpr ); 399 // singleInit->set_value( ce->get_arg() ); 400 // ce->set_arg( NULL ); 401 // delete ce; 402 // } 403 // } 404 // } 405 // } 406 } 407 408 // template< typename AggrInst > 409 // TypeSubstitution makeGenericSubstitution( AggrInst * inst ) { 410 // assert( inst ); 411 // assert( inst->get_baseParameters() ); 412 // std::list< TypeDecl * > baseParams = *inst->get_baseParameters(); 413 // std::list< Expression * > typeSubs = inst->get_parameters(); 414 // TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() ); 415 // return subs; 416 // } 417 418 // ReferenceToType * isStructOrUnion( Type * type ) { 419 // if ( StructInstType * sit = dynamic_cast< StructInstType * >( type ) ) { 420 // return sit; 421 // } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( type ) ) { 422 // return uit; 423 // } 424 // return nullptr; 425 // } 426 427 // void Resolver::resolveSingleAggrInit( Declaration * dcl, InitIterator & init, InitIterator & initEnd, TypeSubstitution sub ) { 428 // ObjectDecl * obj = dynamic_cast< ObjectDecl * >( dcl ); 429 // assert( obj ); 430 // // need to substitute for generic types, so that casts are to concrete types 431 // currentObject = obj->clone(); // xxx - delete this 432 // sub.apply( currentObject ); 433 434 // try { 435 // if ( init == initEnd ) return; // stop when there are no more initializers 436 // (*init)->accept( *this ); 437 // ++init; // made it past an initializer 438 // } catch( SemanticError & ) { 439 // // need to delve deeper, if you can 440 // if ( ReferenceToType * type = isStructOrUnion( currentObject->get_type() ) ) { 441 // resolveAggrInit( type, init, initEnd ); 442 // } else { 443 // // member is not an aggregate type, so can't go any deeper 444 445 // // might need to rethink what is being thrown 446 // throw; 447 // } // if 448 // } 449 // } 450 451 // void Resolver::resolveAggrInit( ReferenceToType * inst, InitIterator & init, InitIterator & initEnd ) { 452 // if ( StructInstType * sit = dynamic_cast< StructInstType * >( inst ) ) { 453 // TypeSubstitution sub = makeGenericSubstitution( sit ); 454 // StructDecl * st = sit->get_baseStruct(); 455 // if(st->get_members().empty()) return; 456 // // want to resolve each initializer to the members of the struct, 457 // // but if there are more initializers than members we should stop 458 // list< Declaration * >::iterator it = st->get_members().begin(); 459 // for ( ; it != st->get_members().end(); ++it) { 460 // resolveSingleAggrInit( *it, init, initEnd, sub ); 461 // } 462 // } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( inst ) ) { 463 // TypeSubstitution sub = makeGenericSubstitution( uit ); 464 // UnionDecl * un = uit->get_baseUnion(); 465 // if(un->get_members().empty()) return; 466 // // only resolve to the first member of a union 467 // resolveSingleAggrInit( *un->get_members().begin(), init, initEnd, sub ); 468 // } // if 469 // } 487 470 488 471 void Resolver::visit( ListInit * listInit ) { 489 InitIterator iter = listInit->begin(); 490 InitIterator end = listInit->end(); 491 492 if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) { 493 // resolve each member to the base type of the array 494 for ( ; iter != end; ++iter ) { 495 initContext = at->get_base(); 496 (*iter)->accept( *this ); 497 } // for 498 } else if ( TupleType * tt = dynamic_cast< TupleType * > ( initContext ) ) { 499 for ( Type * t : *tt ) { 500 if ( iter == end ) break; 501 initContext = t; 502 (*iter++)->accept( *this ); 503 } 504 } else if ( ReferenceToType * type = isStructOrUnion( initContext ) ) { 505 resolveAggrInit( type, iter, end ); 506 } else if ( TypeInstType * tt = dynamic_cast< TypeInstType * >( initContext ) ) { 507 Type * base = tt->get_baseType()->get_base(); 508 if ( base ) { 509 // know the implementation type, so try using that as the initContext 510 initContext = base; 511 visit( listInit ); 512 } else { 513 // missing implementation type -- might be an unknown type variable, so try proceeding with the current init context 514 Parent::visit( listInit ); 515 } 516 } else { 517 assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) 518 || dynamic_cast< ZeroType * >( initContext ) || dynamic_cast< OneType * >( initContext ) || dynamic_cast < EnumInstType * > ( initContext ) ); 519 // basic types are handled here 520 Parent::visit( listInit ); 521 } 522 523 #if 0 524 if ( ArrayType *at = dynamic_cast<ArrayType*>(initContext) ) { 525 std::list<Initializer *>::iterator iter( listInit->begin_initializers() ); 526 for ( ; iter != listInit->end_initializers(); ++iter ) { 527 initContext = at->get_base(); 528 (*iter)->accept( *this ); 529 } // for 530 } else if ( StructInstType *st = dynamic_cast<StructInstType*>(initContext) ) { 531 StructDecl *baseStruct = st->get_baseStruct(); 532 std::list<Declaration *>::iterator iter1( baseStruct->get_members().begin() ); 533 std::list<Initializer *>::iterator iter2( listInit->begin_initializers() ); 534 for ( ; iter1 != baseStruct->get_members().end() && iter2 != listInit->end_initializers(); ++iter2 ) { 535 if ( (*iter2)->get_designators().empty() ) { 536 DeclarationWithType *dt = dynamic_cast<DeclarationWithType *>( *iter1 ); 537 initContext = dt->get_type(); 538 (*iter2)->accept( *this ); 539 ++iter1; 540 } else { 541 StructDecl *st = baseStruct; 542 iter1 = st->get_members().begin(); 543 std::list<Expression *>::iterator iter3( (*iter2)->get_designators().begin() ); 544 for ( ; iter3 != (*iter2)->get_designators().end(); ++iter3 ) { 545 NameExpr *key = dynamic_cast<NameExpr *>( *iter3 ); 546 assert( key ); 547 for ( ; iter1 != st->get_members().end(); ++iter1 ) { 548 if ( key->get_name() == (*iter1)->get_name() ) { 549 (*iter1)->print( cout ); 550 cout << key->get_name() << endl; 551 ObjectDecl *fred = dynamic_cast<ObjectDecl *>( *iter1 ); 552 assert( fred ); 553 StructInstType *mary = dynamic_cast<StructInstType*>( fred->get_type() ); 554 assert( mary ); 555 st = mary->get_baseStruct(); 556 iter1 = st->get_members().begin(); 557 break; 558 } // if 559 } // for 560 } // for 561 ObjectDecl *fred = dynamic_cast<ObjectDecl *>( *iter1 ); 562 assert( fred ); 563 initContext = fred->get_type(); 564 (*listInit->begin_initializers())->accept( *this ); 565 } // if 566 } // for 567 } else if ( UnionInstType *st = dynamic_cast<UnionInstType*>(initContext) ) { 568 DeclarationWithType *dt = dynamic_cast<DeclarationWithType *>( *st->get_baseUnion()->get_members().begin() ); 569 initContext = dt->get_type(); 570 (*listInit->begin_initializers())->accept( *this ); 571 } // if 572 #endif 472 currentObject.enterListInit(); 473 // xxx - fix this so that the list isn't copied, iterator should be used to change current element 474 std::list<Designation *> newDesignations; 475 for ( auto p : group_iterate(listInit->get_designations(), listInit->get_initializers()) ) { 476 Designation * des = std::get<0>(p); 477 Initializer * init = std::get<1>(p); 478 newDesignations.push_back( currentObject.findNext( des ) ); 479 init->accept( *this ); 480 } 481 listInit->get_designations() = newDesignations; // xxx - memory management 482 currentObject.exitListInit(); 483 484 // } else if ( TypeInstType * tt = dynamic_cast< TypeInstType * >( initContext ) ) { 485 // Type * base = tt->get_baseType()->get_base(); 486 // if ( base ) { 487 // // know the implementation type, so try using that as the initContext 488 // ObjectDecl tmpObj( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, base->clone(), nullptr ); 489 // currentObject = &tmpObj; 490 // visit( listInit ); 491 // } else { 492 // // missing implementation type -- might be an unknown type variable, so try proceeding with the current init context 493 // Parent::visit( listInit ); 494 // } 495 // } else { 573 496 } 574 497 -
src/ResolvExpr/module.mk
rc6d2e93 re4d829b 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## module.mk -- 8 ## module.mk -- 9 9 ## 10 10 ## Author : Richard C. Bilson … … 31 31 ResolvExpr/PolyCost.cc \ 32 32 ResolvExpr/Occurs.cc \ 33 ResolvExpr/TypeEnvironment.cc 33 ResolvExpr/TypeEnvironment.cc \ 34 ResolvExpr/CurrentObject.cc -
src/SymTab/Autogen.h
rc6d2e93 re4d829b 103 103 } 104 104 105 ObjectDecl *index = new ObjectDecl( indexName.newName(), Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), new SingleInit( begin , std::list<Expression*>()) );105 ObjectDecl *index = new ObjectDecl( indexName.newName(), Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), new SingleInit( begin ) ); 106 106 107 107 UntypedExpr *cond = new UntypedExpr( cmp ); -
src/SynTree/Expression.cc
rc6d2e93 re4d829b 92 92 93 93 Declaration *decl = get_var(); 94 // if ( decl != 0) decl->print(os, indent + 2);95 94 if ( decl != 0) decl->printShort(os, indent + 2); 96 95 os << std::endl; … … 670 669 } 671 670 671 InitAlternative::InitAlternative( Type * type, Designation * designation ) : type( type ), designation( designation ) {} 672 InitAlternative::InitAlternative( const InitAlternative & other ) : type( maybeClone( other.type ) ), designation( maybeClone( other.designation ) ) {} 673 InitAlternative::~InitAlternative() { 674 delete type; 675 delete designation; 676 } 677 678 UntypedInitExpr::UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts ) : expr( expr ), initAlts( initAlts ) {} 679 UntypedInitExpr::UntypedInitExpr( const UntypedInitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), initAlts( other.initAlts ) {} 680 UntypedInitExpr::~UntypedInitExpr() { 681 delete expr; 682 } 683 684 void UntypedInitExpr::print( std::ostream & os, int indent ) const { 685 os << "Untyped Init Expression" << std::endl << std::string( indent+2, ' ' ); 686 expr->print( os, indent+2 ); 687 if ( ! initAlts.empty() ) { 688 for ( const InitAlternative & alt : initAlts ) { 689 os << std::string( indent+2, ' ' ) << "InitAlternative: "; 690 alt.type->print( os, indent+2 ); 691 alt.designation->print( os, indent+2 ); 692 } 693 } 694 } 695 696 InitExpr::InitExpr( Expression * expr, Type * type, Designation * designation ) : expr( expr ), designation( designation ) { 697 set_result( type ); 698 } 699 InitExpr::InitExpr( const InitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), designation( maybeClone( other.designation) ) {} 700 InitExpr::~InitExpr() { 701 delete expr; 702 delete designation; 703 } 704 705 void InitExpr::print( std::ostream & os, int indent ) const { 706 os << "Init Expression" << std::endl << std::string( indent+2, ' ' ); 707 expr->print( os, indent+2 ); 708 os << std::string( indent+2, ' ' ) << "with designation: "; 709 designation->print( os, indent+2 ); 710 } 711 712 672 713 std::ostream & operator<<( std::ostream & out, const Expression * expr ) { 673 714 if ( expr ) { -
src/SynTree/Expression.h
rc6d2e93 re4d829b 781 781 }; 782 782 783 struct InitAlternative { 784 public: 785 Type * type = nullptr; 786 Designation * designation = nullptr; 787 InitAlternative( Type * type, Designation * designation ); 788 InitAlternative( const InitAlternative & other ); 789 InitAlternative & operator=( const Initializer & other ) = delete; // at the moment this isn't used, and I don't want to implement it 790 ~InitAlternative(); 791 }; 792 793 class UntypedInitExpr : public Expression { 794 public: 795 UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts ); 796 UntypedInitExpr( const UntypedInitExpr & other ); 797 ~UntypedInitExpr(); 798 799 Expression * get_expr() const { return expr; } 800 UntypedInitExpr * set_expr( Expression * newValue ) { expr = newValue; return this; } 801 802 std::list<InitAlternative> & get_initAlts() { return initAlts; } 803 804 virtual UntypedInitExpr * clone() const { return new UntypedInitExpr( * this ); } 805 virtual void accept( Visitor & v ) { v.visit( this ); } 806 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 807 virtual void print( std::ostream & os, int indent = 0 ) const; 808 private: 809 Expression * expr; 810 std::list<InitAlternative> initAlts; 811 }; 812 813 class InitExpr : public Expression { 814 public: 815 InitExpr( Expression * expr, Type * type, Designation * designation ); 816 InitExpr( const InitExpr & other ); 817 ~InitExpr(); 818 819 Expression * get_expr() const { return expr; } 820 InitExpr * set_expr( Expression * newValue ) { expr = newValue; return this; } 821 822 Designation * get_designation() const { return designation; } 823 InitExpr * set_designation( Designation * newValue ) { designation = newValue; return this; } 824 825 virtual InitExpr * clone() const { return new InitExpr( * this ); } 826 virtual void accept( Visitor & v ) { v.visit( this ); } 827 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 828 virtual void print( std::ostream & os, int indent = 0 ) const; 829 private: 830 Expression * expr; 831 Designation * designation; 832 }; 833 834 783 835 std::ostream & operator<<( std::ostream & out, const Expression * expr ); 784 836 -
src/SynTree/Initializer.cc
rc6d2e93 re4d829b 19 19 #include "Common/utility.h" 20 20 21 Designation::Designation( const std::list< Expression * > & designators ) : designators( designators ) {} 22 Designation::Designation( const Designation & other ) : BaseSyntaxNode( other ) { 23 // std::cerr << "cloning designation" << std::endl; 24 cloneAll( other.designators, designators ); 25 // std::cerr << "finished cloning designation" << std::endl; 26 } 27 28 Designation::~Designation() { 29 // std::cerr << "destroying designation" << std::endl; 30 deleteAll( designators ); 31 // std::cerr << "finished destroying designation" << std::endl; 32 } 33 34 void Designation::print( std::ostream &os, int indent ) const { 35 if ( ! designators.empty() ) { 36 os << std::string(indent + 2, ' ' ) << "designated by: " << std::endl; 37 for ( std::list < Expression * >::const_iterator i = designators.begin(); i != designators.end(); i++ ) { 38 os << std::string(indent + 4, ' ' ); 39 ( *i )->print(os, indent + 4 ); 40 } 41 os << std::endl; 42 } // if 43 } 44 45 21 46 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {} 22 47 Initializer::Initializer( const Initializer & other ) : BaseSyntaxNode( other ), maybeConstructed( other.maybeConstructed ) { 23 48 } 24 25 26 49 Initializer::~Initializer() {} 27 50 28 std::string Initializer::designator_name( Expression *des ) { 29 if ( NameExpr *n = dynamic_cast<NameExpr *>(des) ) 30 return n->get_name(); 31 else 32 throw 0; 33 } 34 35 void Initializer::print( std::ostream &os, int indent ) {} 36 37 SingleInit::SingleInit( Expression *v, const std::list< Expression *> &_designators, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) { 51 SingleInit::SingleInit( Expression *v, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ) { 38 52 } 39 53 40 54 SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( maybeClone( other.value ) ) { 41 cloneAll(other.designators, designators );42 55 } 43 56 44 57 SingleInit::~SingleInit() { 45 58 delete value; 46 deleteAll(designators);47 59 } 48 60 49 void SingleInit::print( std::ostream &os, int indent ) {50 os << std:: endl << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl;61 void SingleInit::print( std::ostream &os, int indent ) const { 62 os << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl; 51 63 os << std::string(indent+4, ' ' ); 52 64 value->print( os, indent+4 ); 53 54 if ( ! designators.empty() ) {55 os << std::endl << std::string(indent + 2, ' ' ) << "designated by: " << std::endl;56 for ( std::list < Expression * >::iterator i = designators.begin(); i != designators.end(); i++ ) {57 os << std::string(indent + 4, ' ' );58 ( *i )->print(os, indent + 4 );59 }60 } // if61 65 } 62 66 63 ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed ) 64 : Initializer( maybeConstructed ), initializers( _initializers ), designators( _designators ) { 67 68 ListInit::ListInit( const std::list<Initializer*> &initializers, const std::list<Designation *> &designations, bool maybeConstructed ) 69 : Initializer( maybeConstructed ), initializers( initializers ), designations( designations ) { 65 70 } 66 71 67 72 ListInit::ListInit( const ListInit & other ) : Initializer( other ) { 68 73 cloneAll( other.initializers, initializers ); 69 cloneAll( other.designat ors, designators );74 cloneAll( other.designations, designations ); 70 75 } 71 72 76 73 77 ListInit::~ListInit() { 74 78 deleteAll( initializers ); 75 deleteAll( designat ors );79 deleteAll( designations ); 76 80 } 77 81 78 void ListInit::print( std::ostream &os, int indent ) { 79 os << std::endl << std::string(indent, ' ') << "Compound initializer: "; 80 if ( ! designators.empty() ) { 81 os << std::string(indent + 2, ' ' ) << "designated by: ["; 82 for ( std::list < Expression * >::iterator i = designators.begin(); 83 i != designators.end(); i++ ) { 84 ( *i )->print(os, indent + 4 ); 85 } // for 82 void ListInit::print( std::ostream &os, int indent ) const { 83 os << std::string(indent, ' ') << "Compound initializer: " << std::endl; 84 for ( Designation * d : designations ) { 85 d->print( os, indent + 2 ); 86 } 86 87 87 os << std::string(indent + 2, ' ' ) << "]"; 88 } // if 89 90 for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ ) 91 (*i)->print( os, indent + 2 ); 88 for ( const Initializer * init : initializers ) { 89 init->print( os, indent + 2 ); 90 os << std::endl; 91 } 92 92 } 93 93 … … 103 103 } 104 104 105 void ConstructorInit::print( std::ostream &os, int indent ) {105 void ConstructorInit::print( std::ostream &os, int indent ) const { 106 106 os << std::endl << std::string(indent, ' ') << "Constructor initializer: " << std::endl; 107 107 if ( ctor ) { … … 124 124 } 125 125 126 std::ostream & operator<<( std::ostream & out, Initializer * init ) { 127 init->print( out ); 126 std::ostream & operator<<( std::ostream & out, const Initializer * init ) { 127 if ( init ) { 128 init->print( out ); 129 } else { 130 out << "nullptr"; 131 } 132 return out; 133 } 134 135 std::ostream & operator<<( std::ostream & out, const Designation * des ) { 136 if ( des ) { 137 des->print( out ); 138 } else { 139 out << "nullptr"; 140 } 128 141 return out; 129 142 } -
src/SynTree/Initializer.h
rc6d2e93 re4d829b 25 25 #include "Visitor.h" 26 26 27 const std::list<Expression*> noDesignators; 27 // Designation: list of designator (NameExpr, VariableExpr, and ConstantExpr) expressions that specify an object being initialized. 28 class Designation : public BaseSyntaxNode { 29 public: 30 Designation( const std::list< Expression * > & designators ); 31 Designation( const Designation & other ); 32 virtual ~Designation(); 33 34 std::list< Expression * > & get_designators() { return designators; } 35 36 virtual Designation * clone() const { return new Designation( *this ); }; 37 virtual void accept( Visitor &v ) { v.visit( this ); } 38 virtual Designation * acceptMutator( Mutator &m ) { return m.mutate( this ); } 39 virtual void print( std::ostream &os, int indent = 0 ) const; 40 private: 41 std::list< Expression * > designators; 42 }; 43 44 const std::list<Designation *> noDesignators; 28 45 29 46 // Initializer: base class for object initializers (provide default values) 30 47 class Initializer : public BaseSyntaxNode { 31 48 public: 32 // Initializer( std::string _name = std::string(""), int _pos = 0 );33 49 Initializer( bool maybeConstructed ); 34 50 Initializer( const Initializer & other ); 35 51 virtual ~Initializer(); 36 37 static std::string designator_name( Expression *designator );38 39 // void set_name( std::string newValue ) { name = newValue; }40 // std::string get_name() const { return name; }41 42 // void set_pos( int newValue ) { pos = newValue; }43 // int get_pos() const { return pos; }44 virtual void set_designators( std::list<Expression *> & ) { assert(false); }45 virtual std::list<Expression *> &get_designators() {46 assert(false);47 std::list<Expression *> *ret = 0; return *ret; // never reached48 }49 52 50 53 bool get_maybeConstructed() { return maybeConstructed; } … … 53 56 virtual void accept( Visitor &v ) = 0; 54 57 virtual Initializer *acceptMutator( Mutator &m ) = 0; 55 virtual void print( std::ostream &os, int indent = 0 ) ;58 virtual void print( std::ostream &os, int indent = 0 ) const = 0; 56 59 private: 57 // std::string name;58 // int pos;59 60 bool maybeConstructed; 60 61 }; … … 63 64 class SingleInit : public Initializer { 64 65 public: 65 SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(),bool maybeConstructed = false );66 SingleInit( Expression *value, bool maybeConstructed = false ); 66 67 SingleInit( const SingleInit &other ); 67 68 virtual ~SingleInit(); … … 70 71 void set_value( Expression *newValue ) { value = newValue; } 71 72 72 std::list<Expression *> &get_designators() { return designators; }73 void set_designators( std::list<Expression *> &newValue ) { designators = newValue; }74 75 73 virtual SingleInit *clone() const { return new SingleInit( *this); } 76 74 virtual void accept( Visitor &v ) { v.visit( this ); } 77 75 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 78 virtual void print( std::ostream &os, int indent = 0 ) ;76 virtual void print( std::ostream &os, int indent = 0 ) const; 79 77 private: 80 78 //Constant *value; 81 79 Expression *value; // has to be a compile-time constant 82 std::list< Expression * > designators;83 80 }; 84 81 … … 88 85 public: 89 86 ListInit( const std::list<Initializer*> &initializers, 90 const std::list< Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );87 const std::list<Designation *> &designators = {}, bool maybeConstructed = false ); 91 88 ListInit( const ListInit & other ); 92 89 virtual ~ListInit(); 93 90 94 void set_designators( std::list<Expression *> &newValue ) { designators = newValue; } 95 std::list<Expression *> &get_designators() { return designators; } 96 void set_initializers( std::list<Initializer*> &newValue ) { initializers = newValue; } 97 std::list<Initializer*> &get_initializers() { return initializers; } 91 std::list<Designation *> & get_designations() { return designations; } 92 std::list<Initializer *> & get_initializers() { return initializers; } 98 93 99 94 typedef std::list<Initializer*>::iterator iterator; 95 typedef std::list<Initializer*>::const_iterator const_iterator; 100 96 iterator begin() { return initializers.begin(); } 101 97 iterator end() { return initializers.end(); } 98 const_iterator begin() const { return initializers.begin(); } 99 const_iterator end() const { return initializers.end(); } 102 100 103 101 virtual ListInit *clone() const { return new ListInit( *this ); } 104 102 virtual void accept( Visitor &v ) { v.visit( this ); } 105 103 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 106 virtual void print( std::ostream &os, int indent = 0 ) ;104 virtual void print( std::ostream &os, int indent = 0 ) const; 107 105 private: 108 std::list<Initializer *> initializers; // order *is* important109 std::list< Expression *> designators;106 std::list<Initializer *> initializers; // order *is* important 107 std::list<Designation *> designations; // order/length is consistent with initializers 110 108 }; 111 109 … … 130 128 virtual void accept( Visitor &v ) { v.visit( this ); } 131 129 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 132 virtual void print( std::ostream &os, int indent = 0 ) ;130 virtual void print( std::ostream &os, int indent = 0 ) const; 133 131 134 132 private: … … 140 138 }; 141 139 142 std::ostream & operator<<( std::ostream & out, Initializer * init ); 140 std::ostream & operator<<( std::ostream & out, const Initializer * init ); 141 std::ostream & operator<<( std::ostream & out, const Designation * des ); 143 142 144 143 #endif // INITIALIZER_H -
src/SynTree/Mutator.cc
rc6d2e93 re4d829b 439 439 } 440 440 441 Expression *Mutator::mutate( UntypedInitExpr * initExpr ) { 442 initExpr->set_env( maybeMutate( initExpr->get_env(), *this ) ); 443 initExpr->set_result( maybeMutate( initExpr->get_result(), *this ) ); 444 initExpr->set_expr( maybeMutate( initExpr->get_expr(), *this ) ); 445 // not currently mutating initAlts, but this doesn't matter since this node is only used in the resolver. 446 return initExpr; 447 } 448 449 Expression *Mutator::mutate( InitExpr * initExpr ) { 450 initExpr->set_env( maybeMutate( initExpr->get_env(), *this ) ); 451 initExpr->set_result( maybeMutate( initExpr->get_result(), *this ) ); 452 initExpr->set_expr( maybeMutate( initExpr->get_expr(), *this ) ); 453 initExpr->set_designation( maybeMutate( initExpr->get_designation(), *this ) ); 454 return initExpr; 455 } 456 441 457 442 458 Type *Mutator::mutate( VoidType *voidType ) { … … 541 557 542 558 559 Designation *Mutator::mutate( Designation * designation ) { 560 mutateAll( designation->get_designators(), *this ); 561 return designation; 562 } 563 543 564 Initializer *Mutator::mutate( SingleInit *singleInit ) { 544 565 singleInit->set_value( singleInit->get_value()->acceptMutator( *this ) ); … … 547 568 548 569 Initializer *Mutator::mutate( ListInit *listInit ) { 549 mutateAll( listInit->get_designat ors(), *this );570 mutateAll( listInit->get_designations(), *this ); 550 571 mutateAll( listInit->get_initializers(), *this ); 551 572 return listInit; -
src/SynTree/Mutator.h
rc6d2e93 re4d829b 86 86 virtual Expression* mutate( StmtExpr * stmtExpr ); 87 87 virtual Expression* mutate( UniqueExpr * uniqueExpr ); 88 virtual Expression* mutate( UntypedInitExpr * initExpr ); 89 virtual Expression* mutate( InitExpr * initExpr ); 88 90 89 91 virtual Type* mutate( VoidType *basicType ); … … 104 106 virtual Type* mutate( OneType *oneType ); 105 107 108 virtual Designation* mutate( Designation *designation ); 106 109 virtual Initializer* mutate( SingleInit *singleInit ); 107 110 virtual Initializer* mutate( ListInit *listInit ); -
src/SynTree/SynTree.h
rc6d2e93 re4d829b 93 93 class StmtExpr; 94 94 class UniqueExpr; 95 class UntypedInitExpr; 96 class InitExpr; 95 97 96 98 class Type; … … 113 115 class OneType; 114 116 117 class Designation; 115 118 class Initializer; 116 119 class SingleInit; -
src/SynTree/Visitor.cc
rc6d2e93 re4d829b 344 344 } 345 345 346 void Visitor::visit( UntypedInitExpr * initExpr ) { 347 maybeAccept( initExpr->get_result(), *this ); 348 maybeAccept( initExpr->get_expr(), *this ); 349 // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver. 350 } 351 352 void Visitor::visit( InitExpr * initExpr ) { 353 maybeAccept( initExpr->get_result(), *this ); 354 maybeAccept( initExpr->get_expr(), *this ); 355 maybeAccept( initExpr->get_designation(), *this ); 356 } 357 346 358 347 359 void Visitor::visit( VoidType *voidType ) { … … 428 440 } 429 441 442 void Visitor::visit( Designation * designation ) { 443 acceptAll( designation->get_designators(), *this ); 444 } 430 445 431 446 void Visitor::visit( SingleInit *singleInit ) { … … 434 449 435 450 void Visitor::visit( ListInit *listInit ) { 436 acceptAll( listInit->get_designat ors(), *this );451 acceptAll( listInit->get_designations(), *this ); 437 452 acceptAll( listInit->get_initializers(), *this ); 438 453 } -
src/SynTree/Visitor.h
rc6d2e93 re4d829b 89 89 virtual void visit( StmtExpr * stmtExpr ); 90 90 virtual void visit( UniqueExpr * uniqueExpr ); 91 virtual void visit( UntypedInitExpr * initExpr ); 92 virtual void visit( InitExpr * initExpr ); 91 93 92 94 virtual void visit( VoidType *basicType ); … … 107 109 virtual void visit( OneType *oneType ); 108 110 111 virtual void visit( Designation *designation ); 109 112 virtual void visit( SingleInit *singleInit ); 110 113 virtual void visit( ListInit *listInit ); … … 163 166 } // if 164 167 } catch( SemanticError &e ) { 165 e.set_location( (*i)->location ); 168 e.set_location( (*i)->location ); 166 169 errors.append( e ); 167 170 } // try -
src/Tuples/TupleExpansion.cc
rc6d2e93 re4d829b 192 192 } 193 193 BasicType * boolType = new BasicType( Type::Qualifiers(), BasicType::Bool ); 194 ObjectDecl * finished = new ObjectDecl( toString( "_unq", id, "_finished_" ), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new BasicType( Type::Qualifiers(), BasicType::Bool ), new SingleInit( new ConstantExpr( Constant( boolType->clone(), "0" ) ) , noDesignators) );194 ObjectDecl * finished = new ObjectDecl( toString( "_unq", id, "_finished_" ), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new BasicType( Type::Qualifiers(), BasicType::Bool ), new SingleInit( new ConstantExpr( Constant( boolType->clone(), "0" ) ) ) ); 195 195 addDeclaration( finished ); 196 196 // (finished ? _unq_expr_N : (_unq_expr_N = <unqExpr->get_expr()>, finished = 1, _unq_expr_N))
Note: See TracChangeset
for help on using the changeset viewer.