Changes in / [1118b8b:dee1f89]
- Location:
- src
- Files:
-
- 11 edited
-
ResolvExpr/AlternativeFinder.cc (modified) (6 diffs)
-
ResolvExpr/CastCost.cc (modified) (7 diffs)
-
ResolvExpr/ConversionCost.cc (modified) (13 diffs)
-
ResolvExpr/ConversionCost.h (modified) (4 diffs)
-
ResolvExpr/ResolveAssertions.cc (modified) (2 diffs)
-
ResolvExpr/typeops.h (modified) (4 diffs)
-
SynTree/ApplicationExpr.cc (modified) (2 diffs)
-
SynTree/CommaExpr.cc (modified) (2 diffs)
-
SynTree/Expression.cc (modified) (9 diffs)
-
SynTree/Expression.h (modified) (12 diffs)
-
SynTree/TupleExpr.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
r1118b8b rdee1f89 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 23:52:08 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Aug 8 16:35:00201913 // Update Count : 3 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 25 22:37:46 2019 13 // Update Count : 37 14 14 // 15 15 … … 377 377 } 378 378 379 Cost computeConversionCost( Type * actualType, Type * formalType, bool actualIsLvalue, 380 const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 379 Cost computeConversionCost( Type * actualType, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 381 380 PRINT( 382 381 std::cerr << std::endl << "converting "; … … 388 387 std::cerr << std::endl; 389 388 ) 390 Cost convCost = conversionCost( actualType, formalType, actualIsLvalue,indexer, env );389 Cost convCost = conversionCost( actualType, formalType, indexer, env ); 391 390 PRINT( 392 391 std::cerr << std::endl << "cost is " << convCost << std::endl; … … 403 402 404 403 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 405 Cost convCost = computeConversionCost( 406 actualExpr->result, formalType, actualExpr->get_lvalue(), indexer, env ); 404 Cost convCost = computeConversionCost( actualExpr->result, formalType, indexer, env ); 407 405 408 406 // if there is a non-zero conversion cost, ignoring poly cost, then the expression requires conversion. … … 1215 1213 unify( castExpr->result, alt.expr->result, alt.env, needAssertions, 1216 1214 haveAssertions, openVars, indexer ); 1217 Cost thisCost = castCost( alt.expr->result, castExpr->result, alt.expr->get_lvalue(),1218 indexer,alt.env );1215 Cost thisCost = castCost( alt.expr->result, castExpr->result, indexer, 1216 alt.env ); 1219 1217 PRINT( 1220 1218 std::cerr << "working on cast with result: " << castExpr->result << std::endl; … … 1643 1641 // xxx - do some inspecting on this line... why isn't result bound to initAlt.type? 1644 1642 1645 Cost thisCost = castCost( alt.expr->result, toType, alt.expr->get_lvalue(), 1646 indexer, newEnv ); 1643 Cost thisCost = castCost( alt.expr->result, toType, indexer, newEnv ); 1647 1644 if ( thisCost != Cost::infinity ) { 1648 1645 // count one safe conversion for each value that is thrown away -
src/ResolvExpr/CastCost.cc
r1118b8b rdee1f89 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 06:57:43 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : T hu Aug 8 16:12:00 201913 // Update Count : 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 2 15:34:36 2016 13 // Update Count : 7 14 14 // 15 15 … … 37 37 struct CastCost_old : public ConversionCost { 38 38 public: 39 CastCost_old( const Type * dest, bool srcIsLvalue, 40 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 39 CastCost_old( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 41 40 42 41 using ConversionCost::previsit; … … 46 45 }; 47 46 48 Cost castCost( const Type * src, const Type * dest, bool srcIsLvalue, 49 const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 47 Cost castCost( const Type * src, const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 50 48 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType * >( dest ) ) { 51 49 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) { 52 50 if ( eqvClass->type ) { 53 return castCost( src, eqvClass->type, srcIsLvalue,indexer, env );51 return castCost( src, eqvClass->type, indexer, env ); 54 52 } else { 55 53 return Cost::infinity; … … 59 57 const TypeDecl * type = strict_dynamic_cast< const TypeDecl * >( namedType ); 60 58 if ( type->base ) { 61 return castCost( src, type->base, srcIsLvalue,indexer, env ) + Cost::safe;59 return castCost( src, type->base, indexer, env ) + Cost::safe; 62 60 } // if 63 61 } // if … … 80 78 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 81 79 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 82 return convertToReferenceCost( src, refType, srcIsLvalue,indexer, env, [](const Type * t1, const Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {80 return convertToReferenceCost( src, refType, indexer, env, [](const Type * t1, const Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 83 81 return ptrsCastable( t1, t2, env, indexer ); 84 82 }); 85 83 } else { 86 84 PassVisitor<CastCost_old> converter( 87 dest, srcIsLvalue,indexer, env,88 (Cost (*)( const Type *, const Type *, bool,const SymTab::Indexer &, const TypeEnvironment & ))85 dest, indexer, env, 86 (Cost (*)( const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment & )) 89 87 castCost ); 90 88 src->accept( converter ); … … 98 96 } 99 97 100 CastCost_old::CastCost_old( const Type * dest, bool srcIsLvalue, 101 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 102 : ConversionCost( dest, srcIsLvalue, indexer, env, costFunc ) { 98 CastCost_old::CastCost_old( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 99 : ConversionCost( dest, indexer, env, costFunc ) { 103 100 } 104 101 … … 109 106 cost = Cost::unsafe; 110 107 } else { 111 cost = conversionCost( basicType, dest, srcIsLvalue,indexer, env );108 cost = conversionCost( basicType, dest, indexer, env ); 112 109 } // if 113 110 } -
src/ResolvExpr/ConversionCost.cc
r1118b8b rdee1f89 10 10 // Created On : Sun May 17 07:06:19 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Aug 12 10:21:00 201913 // Update Count : 2 712 // Last Modified On : Mon Jun 24 13:33:00 2019 13 // Update Count : 26 14 14 // 15 15 … … 46 46 #endif 47 47 48 Cost conversionCost( const Type * src, const Type * dest, bool srcIsLvalue, 49 const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 48 Cost conversionCost( const Type * src, const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 50 49 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType * >( dest ) ) { 51 50 PRINT( std::cerr << "type inst " << destAsTypeInst->name; ) 52 51 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) { 53 52 if ( eqvClass->type ) { 54 return conversionCost( src, eqvClass->type, srcIsLvalue,indexer, env );53 return conversionCost( src, eqvClass->type, indexer, env ); 55 54 } else { 56 55 return Cost::infinity; … … 62 61 assert( type ); 63 62 if ( type->base ) { 64 return conversionCost( src, type->base, srcIsLvalue, indexer, env ) 65 + Cost::safe; 63 return conversionCost( src, type->base, indexer, env ) + Cost::safe; 66 64 } // if 67 65 } // if … … 83 81 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 84 82 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 85 return convertToReferenceCost( src, refType, srcIsLvalue,indexer, env, [](const Type * const t1, const Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){83 return convertToReferenceCost( src, refType, indexer, env, [](const Type * const t1, const Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){ 86 84 return ptrsAssignable( t1, t2, env ); 87 85 }); 88 86 } else { 89 87 PassVisitor<ConversionCost> converter( 90 dest, srcIsLvalue,indexer, env,91 (Cost (*)(const Type *, const Type *, bool,const SymTab::Indexer&, const TypeEnvironment&))88 dest, indexer, env, 89 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&)) 92 90 conversionCost ); 93 91 src->accept( converter ); … … 100 98 } 101 99 102 static Cost convertToReferenceCost( const Type * src, const Type * dest, bool srcIsLvalue, 103 int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 100 static Cost convertToReferenceCost( const Type * src, const Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 104 101 PRINT( std::cerr << "convert to reference cost... diff " << diff << " " << src << " / " << dest << std::endl; ) 105 102 if ( diff > 0 ) { 106 103 // TODO: document this 107 Cost cost = convertToReferenceCost( 108 strict_dynamic_cast< const ReferenceType * >( src )->base, dest, srcIsLvalue, 109 diff-1, indexer, env, func ); 104 Cost cost = convertToReferenceCost( strict_dynamic_cast< const ReferenceType * >( src )->base, dest, diff-1, indexer, env, func ); 110 105 cost.incReference(); 111 106 return cost; 112 107 } else if ( diff < -1 ) { 113 108 // TODO: document this 114 Cost cost = convertToReferenceCost( 115 src, strict_dynamic_cast< const ReferenceType * >( dest )->base, srcIsLvalue, 116 diff+1, indexer, env, func ); 109 Cost cost = convertToReferenceCost( src, strict_dynamic_cast< const ReferenceType * >( dest )->base, diff+1, indexer, env, func ); 117 110 cost.incReference(); 118 111 return cost; … … 145 138 PRINT( std::cerr << "reference to rvalue conversion" << std::endl; ) 146 139 PassVisitor<ConversionCost> converter( 147 dest, srcIsLvalue,indexer, env,148 (Cost (*)(const Type *, const Type *, bool,const SymTab::Indexer&, const TypeEnvironment&))140 dest, indexer, env, 141 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&)) 149 142 conversionCost ); 150 143 src->accept( converter ); … … 157 150 if ( typesCompatibleIgnoreQualifiers( src, destAsRef->base, indexer, env ) ) { 158 151 PRINT( std::cerr << "converting compatible base type" << std::endl; ) 159 assert( src->get_lvalue() == srcIsLvalue ); 160 if ( srcIsLvalue ) { 152 if ( src->get_lvalue() ) { 161 153 PRINT( 162 154 std::cerr << "lvalue to reference conversion" << std::endl; … … 186 178 } 187 179 188 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, bool srcIsLvalue, 189 const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 180 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 190 181 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 191 Cost cost = convertToReferenceCost( src, dest, s rcIsLvalue, sdepth-ddepth, indexer, env, func );182 Cost cost = convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env, func ); 192 183 PRINT( std::cerr << "convertToReferenceCost result: " << cost << std::endl; ) 193 184 return cost; 194 185 } 195 186 196 ConversionCost::ConversionCost( const Type * dest, bool srcIsLvalue,const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc )197 : dest( dest ), srcIsLvalue( srcIsLvalue ),indexer( indexer ), cost( Cost::infinity ), env( env ), costFunc( costFunc ) {187 ConversionCost::ConversionCost( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 188 : dest( dest ), indexer( indexer ), cost( Cost::infinity ), env( env ), costFunc( costFunc ) { 198 189 } 199 190 … … 380 371 // recursively compute conversion cost from T1 to T2. 381 372 // cv can be safely dropped because of 'implicit dereference' behavior. 382 cost = costFunc( refType->base, dest, srcIsLvalue,indexer, env );373 cost = costFunc( refType->base, dest, indexer, env ); 383 374 if ( refType->base->tq == dest->tq ) { 384 375 cost.incReference(); // prefer exact qualifiers … … 412 403 static Type::Qualifiers q; 413 404 static BasicType integer( q, BasicType::SignedInt ); 414 cost = costFunc( &integer, dest, srcIsLvalue,indexer, env ); // safe if dest >= int405 cost = costFunc( &integer, dest, indexer, env ); // safe if dest >= int 415 406 if ( cost < Cost::unsafe ) { 416 407 cost.incSafe(); … … 422 413 void ConversionCost::postvisit( const TypeInstType * inst ) { 423 414 if ( const EqvClass * eqvClass = env.lookup( inst->name ) ) { 424 cost = costFunc( eqvClass->type, dest, srcIsLvalue,indexer, env );415 cost = costFunc( eqvClass->type, dest, indexer, env ); 425 416 } else if ( const TypeInstType * destAsInst = dynamic_cast< const TypeInstType * >( dest ) ) { 426 417 if ( inst->name == destAsInst->name ) { … … 432 423 assert( type ); 433 424 if ( type->base ) { 434 cost = costFunc( type->base, dest, srcIsLvalue,indexer, env ) + Cost::safe;425 cost = costFunc( type->base, dest, indexer, env ) + Cost::safe; 435 426 } // if 436 427 } // if … … 443 434 std::list< Type * >::const_iterator destIt = destAsTuple->types.begin(); 444 435 while ( srcIt != tupleType->types.end() && destIt != destAsTuple->types.end() ) { 445 Cost newCost = costFunc( * srcIt++, * destIt++, srcIsLvalue,indexer, env );436 Cost newCost = costFunc( * srcIt++, * destIt++, indexer, env ); 446 437 if ( newCost == Cost::infinity ) { 447 438 return; -
src/ResolvExpr/ConversionCost.h
r1118b8b rdee1f89 10 10 // Created On : Sun May 17 09:37:28 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 8 16:13:00 201913 // Update Count : 612 // Last Modified On : Mon Jun 24 10:00:00 2019 13 // Update Count : 5 14 14 // 15 15 … … 33 33 class TypeEnvironment; 34 34 35 typedef std::function<Cost(const Type *, const Type *, bool, 36 const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 37 35 typedef std::function<Cost(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 38 36 struct ConversionCost : public WithShortCircuiting { 39 37 public: 40 ConversionCost( const Type * dest, bool srcIsLvalue, 41 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 38 ConversionCost( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 42 39 43 40 Cost get_cost() const { return cost; } … … 62 59 protected: 63 60 const Type * dest; 64 bool srcIsLvalue;65 61 const SymTab::Indexer &indexer; 66 62 Cost cost; … … 70 66 71 67 typedef std::function<int(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> PtrsFunction; 72 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, bool srcIsLvalue, 73 const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 68 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 74 69 75 70 // Some function pointer types, differ in return type. -
src/ResolvExpr/ResolveAssertions.cc
r1118b8b rdee1f89 9 9 // Author : Aaron B. Moss 10 10 // Created On : Fri Oct 05 13:46:00 2018 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Aug 8 16:47:00201913 // Update Count : 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jul 10 16:10:37 2019 13 // Update Count : 2 14 14 // 15 15 … … 156 156 for ( const auto& assn : x.assns ) { 157 157 // compute conversion cost from satisfying decl to assertion 158 assert( !assn.match.adjType->get_lvalue() );159 158 k += computeConversionCost( 160 assn.match.adjType, assn.decl->get_type(), false,indexer, x.env );159 assn.match.adjType, assn.decl->get_type(), indexer, x.env ); 161 160 162 161 // mark vars+specialization cost on function-type assertions -
src/ResolvExpr/typeops.h
r1118b8b rdee1f89 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 07:28:22 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Aug 8 16:36:00201913 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 8 09:30:34 2019 13 // Update Count : 4 14 14 // 15 15 … … 80 80 81 81 // in CastCost.cc 82 Cost castCost( const Type * src, const Type * dest, bool srcIsLvalue, 83 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 82 Cost castCost( const Type * src, const Type * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 84 83 Cost castCost( 85 84 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, … … 87 86 88 87 // in ConversionCost.cc 89 Cost conversionCost( const Type * src, const Type * dest, bool srcIsLvalue, 90 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 88 Cost conversionCost( const Type * src, const Type * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 91 89 Cost conversionCost( 92 90 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, … … 94 92 95 93 // in AlternativeFinder.cc 96 Cost computeConversionCost( Type * actualType, Type * formalType, bool actualIsLvalue,94 Cost computeConversionCost( Type * actualType, Type * formalType, 97 95 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 98 96 -
src/SynTree/ApplicationExpr.cc
r1118b8b rdee1f89 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Mon Aug 12 14:28:00 201913 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 12:41:06 2016 13 // Update Count : 4 14 14 // 15 15 … … 76 76 } 77 77 78 bool ApplicationExpr::get_lvalue() const {79 return result->get_lvalue();80 }81 82 78 void ApplicationExpr::print( std::ostream &os, Indenter indent ) const { 83 79 os << "Application of" << std::endl << indent+1; -
src/SynTree/CommaExpr.cc
r1118b8b rdee1f89 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Mon Arg 12 16:11:00201613 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 15:19:44 2016 13 // Update Count : 1 14 14 // 15 15 … … 39 39 } 40 40 41 bool CommaExpr::get_lvalue() const {42 // xxx - as above, shouldn't be an lvalue but that information is used anyways.43 return result->get_lvalue();44 }45 46 41 void CommaExpr::print( std::ostream &os, Indenter indent ) const { 47 42 os << "Comma Expression:" << std::endl; -
src/SynTree/Expression.cc
r1118b8b rdee1f89 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Aug 13 11:31:00 201913 // Update Count : 6 312 // Last Modified On : Wed Aug 7 17:03:00 2019 13 // Update Count : 62 14 14 // 15 15 … … 64 64 65 65 bool Expression::get_lvalue() const { 66 assert( !result->get_lvalue() ); 67 return false; 66 return result->get_lvalue(); 68 67 } 69 68 … … 139 138 } 140 139 141 bool VariableExpr::get_lvalue() const {142 return result->get_lvalue();143 }144 145 140 VariableExpr * VariableExpr::functionPointer( FunctionDecl * func ) { 146 141 VariableExpr * funcExpr = new VariableExpr( func ); … … 274 269 CastExpr::~CastExpr() { 275 270 delete arg; 276 }277 278 bool CastExpr::get_lvalue() const {279 return result->get_lvalue();280 271 } 281 272 … … 389 380 // don't delete the member declaration, since it points somewhere else in the tree 390 381 delete aggregate; 391 }392 393 bool MemberExpr::get_lvalue() const {394 assert( result->get_lvalue() );395 return true;396 382 } 397 383 … … 446 432 } 447 433 448 bool UntypedExpr::get_lvalue() const {449 return result->get_lvalue();450 }451 434 452 435 void UntypedExpr::print( std::ostream & os, Indenter indent ) const { … … 507 490 delete arg2; 508 491 delete arg3; 509 }510 511 bool ConditionalExpr::get_lvalue() const {512 return result->get_lvalue();513 492 } 514 493 … … 569 548 } 570 549 571 bool ConstructorExpr::get_lvalue() const {572 return result->get_lvalue();573 }574 575 550 void ConstructorExpr::print( std::ostream & os, Indenter indent ) const { 576 551 os << "Constructor Expression: " << std::endl << indent+1; … … 590 565 CompoundLiteralExpr::~CompoundLiteralExpr() { 591 566 delete initializer; 592 }593 594 bool CompoundLiteralExpr::get_lvalue() const {595 assert( result->get_lvalue() );596 return true;597 567 } 598 568 -
src/SynTree/Expression.h
r1118b8b rdee1f89 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Aug 13 11:30:00 201913 // Update Count : 5 212 // Last Modified On : Wed Aug 7 16:56:00 2019 13 // Update Count : 51 14 14 // 15 15 … … 71 71 const Type * get_result() const { return result; } 72 72 void set_result( Type * newValue ) { result = newValue; } 73 virtualbool get_lvalue() const;73 bool get_lvalue() const; 74 74 75 75 TypeSubstitution * get_env() const { return env; } … … 99 99 virtual ~ApplicationExpr(); 100 100 101 bool get_lvalue() const final;102 103 101 Expression * get_function() const { return function; } 104 102 void set_function( Expression * newValue ) { function = newValue; } … … 123 121 UntypedExpr( const UntypedExpr & other ); 124 122 virtual ~UntypedExpr(); 125 126 bool get_lvalue() const final;127 123 128 124 Expression * get_function() const { return function; } … … 213 209 virtual ~CastExpr(); 214 210 215 bool get_lvalue() const final;216 217 211 Expression * get_arg() const { return arg; } 218 212 void set_arg( Expression * newValue ) { arg = newValue; } … … 298 292 virtual ~MemberExpr(); 299 293 300 bool get_lvalue() const final;301 302 294 DeclarationWithType * get_member() const { return member; } 303 295 void set_member( DeclarationWithType * newValue ) { member = newValue; } … … 322 314 VariableExpr( const VariableExpr & other ); 323 315 virtual ~VariableExpr(); 324 325 bool get_lvalue() const final;326 316 327 317 DeclarationWithType * get_var() const { return var; } … … 511 501 virtual ~ConditionalExpr(); 512 502 513 bool get_lvalue() const final;514 515 503 Expression * get_arg1() const { return arg1; } 516 504 void set_arg1( Expression * newValue ) { arg1 = newValue; } … … 537 525 virtual ~CommaExpr(); 538 526 539 bool get_lvalue() const final;540 541 527 Expression * get_arg1() const { return arg1; } 542 528 void set_arg1( Expression * newValue ) { arg1 = newValue; } … … 625 611 ~ConstructorExpr(); 626 612 627 bool get_lvalue() const final;628 629 613 Expression * get_callExpr() const { return callExpr; } 630 614 void set_callExpr( Expression * newValue ) { callExpr = newValue; } … … 645 629 CompoundLiteralExpr( const CompoundLiteralExpr & other ); 646 630 virtual ~CompoundLiteralExpr(); 647 648 bool get_lvalue() const final;649 631 650 632 Initializer * get_initializer() const { return initializer; } … … 723 705 TupleIndexExpr( const TupleIndexExpr & other ); 724 706 virtual ~TupleIndexExpr(); 725 726 bool get_lvalue() const final;727 707 728 708 Expression * get_tuple() const { return tuple; } -
src/SynTree/TupleExpr.cc
r1118b8b rdee1f89 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Mon Aug 12 14:22:00 201913 // Update Count : 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 17 09:42:29 2017 13 // Update Count : 3 14 14 // 15 15 … … 78 78 } 79 79 80 bool TupleIndexExpr::get_lvalue() const {81 assert( result->get_lvalue() );82 return true;83 }84 85 80 void TupleIndexExpr::print( std::ostream &os, Indenter indent ) const { 86 81 os << "Tuple Index Expression, with tuple:" << std::endl;
Note:
See TracChangeset
for help on using the changeset viewer.