Changeset 2ad4b49
- Timestamp:
- Jun 4, 2018, 4:29:23 PM (7 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, with_gc
- Children:
- 41770ed1, d885a58, f77dbc0
- Parents:
- 1ddbf3b (diff), ee3c93d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Common/PassVisitor.impl.h ¶
r1ddbf3b r2ad4b49 828 828 VISIT_START( node ); 829 829 830 visitExpression( node->condition ); 831 node->body = visitStatement( node->body ); 830 { 831 // while statements introduce a level of scope (for the initialization) 832 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 833 maybeAccept_impl( node->initialization, *this ); 834 visitExpression ( node->condition ); 835 node->body = visitStatement( node->body ); 836 } 832 837 833 838 VISIT_END( node ); … … 838 843 MUTATE_START( node ); 839 844 840 node->condition = mutateExpression( node->condition ); 841 node->body = mutateStatement ( node->body ); 845 { 846 // while statements introduce a level of scope (for the initialization) 847 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 848 maybeMutate_impl( node->initialization, *this ); 849 node->condition = mutateExpression( node->condition ); 850 node->body = mutateStatement ( node->body ); 851 } 852 842 853 843 854 MUTATE_END( Statement, node ); -
TabularUnified src/ControlStruct/ForExprMutator.cc ¶
r1ddbf3b r2ad4b49 45 45 return hoist( forStmt, forStmt->initialization ); 46 46 } 47 Statement *ForExprMutator::postmutate( WhileStmt *whileStmt ) { 48 return hoist( whileStmt, whileStmt->initialization ); 49 } 47 50 } // namespace ControlStruct 48 51 -
TabularUnified src/ControlStruct/ForExprMutator.h ¶
r1ddbf3b r2ad4b49 18 18 class IfStmt; 19 19 class ForStmt; 20 class WhileStmt; 20 21 class Statement; 21 22 … … 25 26 Statement *postmutate( IfStmt * ); 26 27 Statement *postmutate( ForStmt * ); 28 Statement *postmutate( WhileStmt * ); 27 29 }; 28 30 } // namespace ControlStruct -
TabularUnified src/Parser/ParseNode.h ¶
r1ddbf3b r2ad4b49 403 403 }; 404 404 405 Expression * build_if_control( IfCtl * ctl, std::list< Statement * > & init ); 405 406 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ); 406 407 Statement * build_switch( bool isSwitch, ExpressionNode * ctl, StatementNode * stmt ); -
TabularUnified src/Parser/StatementNode.cc ¶
r1ddbf3b r2ad4b49 80 80 } 81 81 82 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ) { 83 Statement * thenb, * elseb = 0; 84 std::list< Statement * > branches; 85 buildMoveList< Statement, StatementNode >( then_stmt, branches ); 86 assert( branches.size() == 1 ); 87 thenb = branches.front(); 88 89 if ( else_stmt ) { 90 std::list< Statement * > branches; 91 buildMoveList< Statement, StatementNode >( else_stmt, branches ); 92 assert( branches.size() == 1 ); 93 elseb = branches.front(); 94 } // if 95 96 std::list< Statement * > init; 82 Expression * build_if_control( IfCtl * ctl, std::list< Statement * > & init ) { 97 83 if ( ctl->init != 0 ) { 98 84 buildMoveList( ctl->init, init ); … … 102 88 if ( ctl->condition ) { 103 89 // compare the provided condition against 0 104 cond = 90 cond = notZeroExpr( maybeMoveBuild< Expression >(ctl->condition) ); 105 91 } else { 106 92 for ( Statement * stmt : init ) { … … 113 99 } 114 100 delete ctl; 101 return cond; 102 } 103 104 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ) { 105 Statement * thenb, * elseb = 0; 106 std::list< Statement * > branches; 107 buildMoveList< Statement, StatementNode >( then_stmt, branches ); 108 assert( branches.size() == 1 ); 109 thenb = branches.front(); 110 111 if ( else_stmt ) { 112 std::list< Statement * > branches; 113 buildMoveList< Statement, StatementNode >( else_stmt, branches ); 114 assert( branches.size() == 1 ); 115 elseb = branches.front(); 116 } // if 117 118 std::list< Statement * > init; 119 Expression * cond = build_if_control( ctl, init ); 115 120 return new IfStmt( cond, thenb, elseb, init ); 116 121 } … … 144 149 buildMoveList< Statement, StatementNode >( stmt, branches ); 145 150 assert( branches.size() == 1 ); 146 return new WhileStmt( notZeroExpr( maybeMoveBuild< Expression >(ctl) ), branches.front(), kind ); 151 152 std::list< Statement * > init; 153 return new WhileStmt( notZeroExpr( maybeMoveBuild< Expression >(ctl) ), branches.front(), init, kind ); 147 154 } 148 155 -
TabularUnified src/ResolvExpr/Resolver.cc ¶
r1ddbf3b r2ad4b49 207 207 Alternative & choice = winners.front(); 208 208 if ( findDeletedExpr( choice.expr ) ) { 209 SemanticError( choice.expr, "Unique best alternative includes deleted identifier in " );209 SemanticError( untyped->location, choice.expr, "Unique best alternative includes deleted identifier in " ); 210 210 } 211 211 alt = std::move( choice ); … … 242 242 243 243 static CastExpr untyped( nullptr ); // cast to void 244 untyped.location = expr->location; 244 245 245 246 // set up and resolve expression cast to void … … 274 275 void findSingleExpression( Expression *& untyped, Type * type, const SymTab::Indexer & indexer ) { 275 276 assert( untyped && type ); 277 // transfer location to generated cast for error purposes 278 CodeLocation location = untyped->location; 276 279 untyped = new CastExpr( untyped, type ); 280 untyped->location = location; 277 281 findSingleExpression( untyped, indexer ); 278 282 removeExtraneousCast( untyped, indexer ); -
TabularUnified src/SymTab/Indexer.cc ¶
r1ddbf3b r2ad4b49 106 106 if ( ! CodeGen::isCtorDtorAssign( id ) ) return; 107 107 108 // helpful data structure 108 // helpful data structure to organize properties for a type 109 109 struct ValueType { 110 struct DeclBall { 110 struct DeclBall { // properties for this particular decl 111 111 IdData decl; 112 bool isUserDefinedFunc; // properties for this particular decl 113 bool isDefaultCtor; 114 bool isDtor; 112 bool isUserDefinedFunc; 115 113 bool isCopyFunc; 116 114 }; 117 115 // properties for this type 118 bool existsUserDefinedFunc = false; // any user-defined function found119 bool existsUserDefinedCtor = false; // any user-defined constructor found120 bool existsUserDefinedDtor = false; // any user-defined destructor found121 116 bool existsUserDefinedCopyFunc = false; // user-defined copy ctor found 122 bool existsUserDefinedDefaultCtor = false; // user-defined default ctorfound117 BaseSyntaxNode * deleteStmt = nullptr; // non-null if a user-defined function is found 123 118 std::list< DeclBall > decls; 124 119 … … 127 122 ValueType & operator+=( IdData data ) { 128 123 DeclarationWithType * function = data.id; 129 bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->get_linkage() ); 130 bool isDefaultCtor = InitTweak::isDefaultConstructor( function ); 131 bool isDtor = InitTweak::isDestructor( function ); 132 bool isCopyFunc = InitTweak::isCopyFunction( function, function->get_name() ); 133 decls.push_back( DeclBall{ data, isUserDefinedFunc, isDefaultCtor, isDtor, isCopyFunc } ); 134 existsUserDefinedFunc = existsUserDefinedFunc || isUserDefinedFunc; 135 existsUserDefinedCtor = existsUserDefinedCtor || (isUserDefinedFunc && CodeGen::isConstructor( function->get_name() ) ); 136 existsUserDefinedDtor = existsUserDefinedDtor || (isUserDefinedFunc && isDtor); 124 bool isUserDefinedFunc = ! LinkageSpec::isOverridable( function->linkage ); 125 bool isCopyFunc = InitTweak::isCopyFunction( function, function->name ); 126 decls.push_back( DeclBall{ data, isUserDefinedFunc, isCopyFunc } ); 137 127 existsUserDefinedCopyFunc = existsUserDefinedCopyFunc || (isUserDefinedFunc && isCopyFunc); 138 existsUserDefinedDefaultCtor = existsUserDefinedDefaultCtor || (isUserDefinedFunc && isDefaultCtor); 128 if ( isUserDefinedFunc && ! data.deleteStmt ) { 129 // any user-defined function can act as an implicit delete statement for generated constructors. 130 // a delete stmt should not act as an implicit delete statement. 131 deleteStmt = data.id; 132 } 139 133 return *this; 140 134 } … … 160 154 161 155 // if a type contains user defined ctor/dtor/assign, then special rules trigger, which determine 162 // the set of ctor/dtor/assign that are seen by the requester. In particular, if the user defines 163 // a default ctor, then the generated default ctor should never be seen, likewise for copy ctor 164 // and dtor. If the user defines any ctor/dtor, then no generated field ctors should be seen. 165 // If the user defines any ctor then the generated default ctor should not be seen (intrinsic default 166 // ctor must be overridden exactly). 156 // the set of ctor/dtor/assign that can be used by the requester. In particular, if the user defines 157 // a default ctor, then the generated default ctor is unavailable, likewise for copy ctor 158 // and dtor. If the user defines any ctor/dtor, then no generated field ctors are available. 159 // If the user defines any ctor then the generated default ctor is unavailable (intrinsic default 160 // ctor must be overridden exactly). If the user defines anything that looks like a copy constructor, 161 // then the generated copy constructor is unavailable, and likewise for the assignment operator. 167 162 for ( std::pair< const std::string, ValueType > & pair : funcMap ) { 168 163 ValueType & val = pair.second; 169 164 for ( ValueType::DeclBall ball : val.decls ) { 170 bool noUserDefinedFunc = ! val.existsUserDefinedFunc;171 bool is UserDefinedFunc = ball.isUserDefinedFunc;172 bool isAcceptableDefaultCtor = (! val.existsUserDefinedCtor || (! val.existsUserDefinedDefaultCtor && ball.decl.id->linkage == LinkageSpec::Intrinsic)) && ball.isDefaultCtor; // allow default constructors only when no user-defined constructors exist, except in the case of intrinsics, which require exact overrides173 bool isAcceptableCopyFunc = ! val.existsUserDefinedCopyFunc && ball.isCopyFunc; // handles copy ctor and assignment operator174 bool isAcceptableDtor = ! val.existsUserDefinedDtor && ball.isDtor;175 if ( noUserDefinedFunc || isUserDefinedFunc || isAcceptableDefaultCtor || isAcceptableCopyFunc || isAcceptableDtor ) {176 // decl conforms to the rules described above, so it should be seen by the requester177 out.push_back( ball.decl );165 bool isNotUserDefinedFunc = ! ball.isUserDefinedFunc && ball.decl.id->linkage != LinkageSpec::Intrinsic; 166 bool isCopyFunc = ball.isCopyFunc; 167 bool existsUserDefinedCopyFunc = val.existsUserDefinedCopyFunc; 168 // only implicitly delete non-user defined functions that are not intrinsic, and are 169 // not copy functions (assignment or copy constructor), unless a user-defined copy function exists. 170 // deleteStmt will be non-null only if a user-defined function is found. 171 if (isNotUserDefinedFunc && (! isCopyFunc || existsUserDefinedCopyFunc)) { 172 ball.decl.deleteStmt = val.deleteStmt; 178 173 } 174 out.push_back( ball.decl ); 179 175 } 180 176 } -
TabularUnified src/SynTree/Statement.cc ¶
r1ddbf3b r2ad4b49 243 243 } 244 244 245 WhileStmt::WhileStmt( Expression *condition, Statement *body, bool isDoWhile ):246 Statement(), condition( condition), body( body), i sDoWhile( isDoWhile) {245 WhileStmt::WhileStmt( Expression *condition, Statement *body, std::list< Statement * > & initialization, bool isDoWhile ): 246 Statement(), condition( condition), body( body), initialization( initialization ), isDoWhile( isDoWhile) { 247 247 } 248 248 -
TabularUnified src/SynTree/Statement.h ¶
r1ddbf3b r2ad4b49 220 220 Expression *condition; 221 221 Statement *body; 222 std::list<Statement *> initialization; 222 223 bool isDoWhile; 223 224 224 225 WhileStmt( Expression *condition, 225 Statement *body, bool isDoWhile = false );226 Statement *body, std::list<Statement *> & initialization, bool isDoWhile = false ); 226 227 WhileStmt( const WhileStmt &other ); 227 228 virtual ~WhileStmt(); -
TabularUnified src/tests/raii/.expect/ctor-autogen-ERR1.txt ¶
r1ddbf3b r2ad4b49 1 raii/ctor-autogen.c:102:1 error: No reasonable alternatives for expression Applying untyped:2 Name: ?{}3 ...to: 4 Cast of:5 Variable Expression: x: instance of struct Managed with body 16 ... to:7 reference to instance of struct Managed with body 18 constant expression (123 123: signed int)1 raii/ctor-autogen.c:102:1 error: Unique best alternative includes deleted identifier in Cast of: 2 Application of 3 Deleted Expression 4 Variable Expression: ?{}: static inline function 5 ... with parameters 6 _dst: reference to instance of struct Managed with body 1 7 x: signed int 8 ... returning nothing 9 9 10 ... deleted by: ?{}: function 11 ... with parameters 12 m: reference to instance of struct Managed with body 1 13 ... returning nothing 14 ... with body 15 CompoundStmt 16 Expression Statement: 17 Application of 18 Variable Expression: ?=?: function 19 ... with parameters 20 intrinsic reference to signed int 21 intrinsic signed int 22 ... returning 23 _retval__operator_assign: signed int 24 ... with attributes: 25 Attribute with name: unused 26 27 28 ... to arguments 29 Cast of: 30 Member Expression, with field: 31 x: signed int 32 ... from aggregate: 33 Cast of: 34 Variable Expression: m: reference to instance of struct Managed with body 1 35 ... to: 36 instance of struct Managed with body 1 37 ... to: 38 reference to signed int 39 Cast of: 40 constant expression (0 0: zero_t) 41 ... to: 42 signed int 43 44 ... with environment: 45 Types: 46 Non-types: 47 48 49 ... to arguments 50 Cast of: 51 Variable Expression: x: instance of struct Managed with body 1 52 ... to: 53 reference to instance of struct Managed with body 1 54 constant expression (123 123: signed int) 55 56 ... to: nothing
Note: See TracChangeset
for help on using the changeset viewer.