Changeset e04ef3a
- Timestamp:
- Jun 14, 2016, 12:53:03 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- c8c03683
- Parents:
- 55ba7339
- Location:
- src
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r55ba7339 re04ef3a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Fri May 06 16:01:00 201613 // Update Count : 25 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jun 9 13:21:00 2016 13 // Update Count : 256 14 14 // 15 15 … … 250 250 //*** Expressions 251 251 void CodeGenerator::visit( ApplicationExpr *applicationExpr ) { 252 extension( applicationExpr ); 252 253 if ( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) { 253 254 OperatorInfo opInfo; … … 361 362 362 363 void CodeGenerator::visit( UntypedExpr *untypedExpr ) { 364 extension( untypedExpr ); 363 365 if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) { 364 366 OperatorInfo opInfo; … … 445 447 446 448 void CodeGenerator::visit( NameExpr *nameExpr ) { 449 extension( nameExpr ); 447 450 OperatorInfo opInfo; 448 451 if ( operatorLookup( nameExpr->get_name(), opInfo ) ) { … … 455 458 456 459 void CodeGenerator::visit( AddressExpr *addressExpr ) { 460 extension( addressExpr ); 457 461 output << "(&"; 458 462 // this hack makes sure that we don't convert "constant_zero" to "0" if we're taking its address … … 466 470 467 471 void CodeGenerator::visit( CastExpr *castExpr ) { 472 extension( castExpr ); 468 473 output << "("; 469 474 if ( castExpr->get_results().empty() ) { … … 488 493 489 494 void CodeGenerator::visit( MemberExpr *memberExpr ) { 495 extension( memberExpr ); 490 496 memberExpr->get_aggregate()->accept( *this ); 491 497 output << "." << mangleName( memberExpr->get_member() ); … … 493 499 494 500 void CodeGenerator::visit( VariableExpr *variableExpr ) { 501 extension( variableExpr ); 495 502 OperatorInfo opInfo; 496 503 if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) { … … 503 510 void CodeGenerator::visit( ConstantExpr *constantExpr ) { 504 511 assert( constantExpr->get_constant() ); 512 extension( constantExpr ); 505 513 constantExpr->get_constant()->accept( *this ); 506 514 } 507 515 508 516 void CodeGenerator::visit( SizeofExpr *sizeofExpr ) { 517 extension( sizeofExpr ); 509 518 output << "sizeof("; 510 519 if ( sizeofExpr->get_isType() ) { … … 517 526 518 527 void CodeGenerator::visit( AlignofExpr *alignofExpr ) { 528 extension( alignofExpr ); 519 529 // use GCC extension to avoid bumping std to C11 520 530 output << "__alignof__("; … … 532 542 533 543 void CodeGenerator::visit( OffsetofExpr *offsetofExpr ) { 544 extension( offsetofExpr ); 534 545 // use GCC builtin 535 546 output << "__builtin_offsetof("; … … 544 555 545 556 void CodeGenerator::visit( LogicalExpr *logicalExpr ) { 557 extension( logicalExpr ); 546 558 output << "("; 547 559 logicalExpr->get_arg1()->accept( *this ); … … 556 568 557 569 void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) { 570 extension( conditionalExpr ); 558 571 output << "("; 559 572 conditionalExpr->get_arg1()->accept( *this ); … … 566 579 567 580 void CodeGenerator::visit( CommaExpr *commaExpr ) { 581 extension( commaExpr ); 568 582 output << "("; 569 583 commaExpr->get_arg1()->accept( *this ); … … 578 592 579 593 void CodeGenerator::visit( AsmExpr *asmExpr ) { 594 extension( asmExpr ); 580 595 if ( asmExpr->get_inout() ) { 581 596 output << "[ "; -
src/CodeGen/CodeGenerator.h
r55ba7339 re04ef3a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:32:24201613 // Update Count : 2 812 // Last Modified On : Thu Jun 9 13:15:58 2016 13 // Update Count : 29 14 14 // 15 15 … … 94 94 std::ostream& operator()(std::ostream & os); 95 95 }; 96 97 void extension( Expression *expr ) { 98 if ( expr->get_extension() ) { 99 output << "__extension__ "; 100 } // if 101 } // extension 96 102 private: 97 103 -
src/Common/utility.h
r55ba7339 re04ef3a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Thu Apr 28 13:18:24201613 // Update Count : 1611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 8 17:33:59 2016 13 // Update Count : 22 14 14 // 15 15 … … 33 33 } 34 34 35 template<typename T, typename U> 36 struct maybeBuild_t { 37 static T * doit( const U *orig ) { 38 if ( orig ) { 39 return orig->build(); 40 } else { 41 return 0; 42 } // if 43 } 44 }; 45 35 46 template< typename T, typename U > 36 47 static inline T * maybeBuild( const U *orig ) { 37 if ( orig ) { 38 return orig->build(); 39 } else { 40 return 0; 41 } // if 48 return maybeBuild_t<T,U>::doit(orig); 42 49 } 43 50 -
src/Parser/ExpressionNode.cc
r55ba7339 re04ef3a 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 15:43:05201613 // Update Count : 29612 // Last Modified On : Mon Jun 13 14:46:17 2016 13 // Update Count : 307 14 14 // 15 15 … … 32 32 using namespace std; 33 33 34 ExpressionNode::ExpressionNode() : ParseNode() , argName( 0 ){}35 36 ExpressionNode::ExpressionNode( const string *name ) : ParseNode( name ) , argName( 0 ){}37 38 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ) {34 ExpressionNode::ExpressionNode() : ParseNode() {} 35 36 ExpressionNode::ExpressionNode( const string *name ) : ParseNode( name ) {} 37 38 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ), extension( other.extension ) { 39 39 if ( other.argName ) { 40 40 argName = other.argName->clone(); … … 344 344 345 345 Expression *DesignatorNode::build() const { 346 Expression * ret = get_argName()->build();346 Expression * ret = maybeBuild<Expression>(get_argName()); 347 347 348 348 if ( isArrayIndex ) { … … 389 389 "Cond", "NCond", 390 390 // diadic 391 "SizeOf", "AlignOf", "OffsetOf", "Attr", " CompLit", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",391 "SizeOf", "AlignOf", "OffsetOf", "Attr", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&", 392 392 "?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?", 393 393 "?=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?", … … 466 466 467 467 if ( ! ( op = dynamic_cast<OperatorNode *>( function ) ) ) { // function as opposed to operator 468 return new UntypedExpr( function->build(), args, maybeBuild< Expression >( get_argName() ));468 return new UntypedExpr( maybeBuild<Expression>(function), args, maybeBuild< Expression >( get_argName() )); 469 469 } // if 470 470 … … 550 550 if ( dynamic_cast< VoidType* >( targetType ) ) { 551 551 delete targetType; 552 return new CastExpr( expr_node->build(), maybeBuild< Expression >( get_argName() ) );552 return new CastExpr( maybeBuild<Expression>(expr_node), maybeBuild< Expression >( get_argName() ) ); 553 553 } else { 554 return new CastExpr( expr_node->build(),targetType, maybeBuild< Expression >( get_argName() ) );554 return new CastExpr( maybeBuild<Expression>(expr_node),targetType, maybeBuild< Expression >( get_argName() ) ); 555 555 } // if 556 556 } … … 621 621 assert( var ); 622 622 if ( ! get_args()->get_link() ) { 623 return new AttrExpr( var->build(), ( Expression*)0);623 return new AttrExpr( maybeBuild<Expression>(var), ( Expression*)0); 624 624 } else if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()->get_link()) ) { 625 return new AttrExpr( var->build(), arg->get_decl()->buildType());625 return new AttrExpr( maybeBuild<Expression>(var), arg->get_decl()->buildType()); 626 626 } else { 627 return new AttrExpr( var->build(), args.back()); 628 } // if 629 } 630 case OperatorNode::CompLit: 631 throw UnimplementedError( "C99 compound literals" ); 632 // the short-circuited operators 627 return new AttrExpr( maybeBuild<Expression>(var), args.back()); 628 } // if 629 } 633 630 case OperatorNode::Or: 634 631 case OperatorNode::And: … … 719 716 720 717 Expression *AsmExprNode::build() const { 721 return new AsmExpr( maybeBuild< Expression >( inout ), (ConstantExpr *) constraint->build(), operand->build() );718 return new AsmExpr( maybeBuild< Expression >( inout ), (ConstantExpr *)maybeBuild<Expression>(constraint), maybeBuild<Expression>(operand) ); 722 719 } 723 720 … … 796 793 797 794 Expression *ValofExprNode::build() const { 798 return new UntypedValofExpr ( get_body()->build(), maybeBuild< Expression >( get_argName() ) );795 return new UntypedValofExpr ( maybeBuild<Statement>(get_body()), maybeBuild< Expression >( get_argName() ) ); 799 796 } 800 797 … … 908 905 909 906 Expression *CompoundLiteralNode::build() const { 910 Declaration * newDecl = type->build();// compound literal type907 Declaration * newDecl = maybeBuild<Declaration>(type); // compound literal type 911 908 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type 912 return new CompoundLiteralExpr( newDeclWithType->get_type(), kids->build() );909 return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeBuild<Initializer>(kids) ); 913 910 // these types do not have associated type information 914 911 } else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl ) ) { 915 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), kids->build() );912 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeBuild<Initializer>(kids) ); 916 913 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl ) ) { 917 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), kids->build() );914 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeBuild<Initializer>(kids) ); 918 915 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl ) ) { 919 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), kids->build() );916 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeBuild<Initializer>(kids) ); 920 917 } else { 921 918 assert( false ); -
src/Parser/ParseNode.h
r55ba7339 re04ef3a 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Thu Apr 14 15:37:52201613 // Update Count : 2 0511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 13 16:04:47 2016 13 // Update Count : 240 14 14 // 15 15 … … 20 20 #include <list> 21 21 #include <iterator> 22 #include <memory> 22 23 23 24 #include "Common/utility.h" 24 25 #include "Parser/LinkageSpec.h" 25 26 #include "SynTree/Type.h" 27 #include "SynTree/Expression.h" 26 28 //#include "SynTree/Declaration.h" 27 29 #include "Common/UniqueName.h" … … 79 81 ExpressionNode *set_argName( const std::string *aName ); 80 82 ExpressionNode *set_argName( ExpressionNode *aDesignator ); 83 bool get_extension() const { return extension; } 84 ExpressionNode *set_extension( bool exten ) { extension = exten; return this; } 81 85 82 86 virtual void print( std::ostream &, int indent = 0) const = 0; … … 87 91 void printDesignation ( std::ostream &, int indent = 0) const; 88 92 private: 89 ExpressionNode *argName; 93 ExpressionNode *argName = 0; 94 bool extension = false; 95 }; 96 97 template< typename T > 98 struct maybeBuild_t<Expression, T> { 99 static inline Expression * doit( const T *orig ) { 100 if ( orig ) { 101 Expression *p = orig->build(); 102 p->set_extension( orig->get_extension() ); 103 return p; 104 } else { 105 return 0; 106 } // if 107 } 90 108 }; 91 109 … … 179 197 Cond, NCond, 180 198 // diadic 181 SizeOf, AlignOf, OffsetOf, Attr, CompLit,Plus, Minus, Mul, Div, Mod, Or, And,199 SizeOf, AlignOf, OffsetOf, Attr, Plus, Minus, Mul, Div, Mod, Or, And, 182 200 BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq, 183 201 Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn, … … 574 592 while ( cur ) { 575 593 try { 576 SynTreeType *result = dynamic_cast< SynTreeType *>( cur->build() ); 594 // SynTreeType *result = dynamic_cast< SynTreeType *>( maybeBuild<typename std::result_of<decltype(&NodeType::build)(NodeType)>::type>( cur ) ); 595 SynTreeType *result = dynamic_cast< SynTreeType *>( maybeBuild<typename std::pointer_traits<decltype(cur->build())>::element_type>( cur ) ); 577 596 if ( result ) { 578 597 *out++ = result; -
src/Parser/StatementNode.cc
r55ba7339 re04ef3a 10 10 // Created On : Sat May 16 14:59:41 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Ju l 30 14:39:39 201513 // Update Count : 13 012 // Last Modified On : Thu Jun 9 14:18:46 2016 13 // Update Count : 132 14 14 // 15 15 … … 222 222 branches.pop_front(); 223 223 } // if 224 return new IfStmt( labs, notZeroExpr( get_control()->build() ), thenb, elseb );224 return new IfStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), thenb, elseb ); 225 225 } 226 226 case While: 227 227 assert( branches.size() == 1 ); 228 return new WhileStmt( labs, notZeroExpr( get_control()->build() ), branches.front() );228 return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front() ); 229 229 case Do: 230 230 assert( branches.size() == 1 ); 231 return new WhileStmt( labs, notZeroExpr( get_control()->build() ), branches.front(), true );231 return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front(), true ); 232 232 case For: 233 233 { … … 244 244 Expression *cond = 0; 245 245 if ( ctl->get_condition() != 0 ) 246 cond = notZeroExpr( ctl->get_condition()->build() );246 cond = notZeroExpr( maybeBuild<Expression>(ctl->get_condition()) ); 247 247 248 248 Expression *incr = 0; 249 249 if ( ctl->get_change() != 0 ) 250 incr = ctl->get_change()->build();250 incr = maybeBuild<Expression>(ctl->get_change()); 251 251 252 252 return new ForStmt( labs, init, cond, incr, branches.front() ); 253 253 } 254 254 case Switch: 255 return new SwitchStmt( labs, get_control()->build(), branches );255 return new SwitchStmt( labs, maybeBuild<Expression>(get_control()), branches ); 256 256 case Choose: 257 return new ChooseStmt( labs, get_control()->build(), branches );257 return new ChooseStmt( labs, maybeBuild<Expression>(get_control()), branches ); 258 258 case Fallthru: 259 259 return new FallthruStmt( labs ); 260 260 case Case: 261 return new CaseStmt( labs, get_control()->build(), branches );261 return new CaseStmt( labs, maybeBuild<Expression>(get_control()), branches ); 262 262 case Default: 263 263 return new CaseStmt( labs, 0, branches, true ); … … 266 266 if ( get_target() == "" ) { // computed goto 267 267 assert( get_control() != 0 ); 268 return new BranchStmt( labs, get_control()->build(), BranchStmt::Goto );268 return new BranchStmt( labs, maybeBuild<Expression>(get_control()), BranchStmt::Goto ); 269 269 } // if 270 270 -
src/Parser/parser.cc
r55ba7339 re04ef3a 5299 5299 /* Line 1806 of yacc.c */ 5300 5300 #line 432 "parser.yy" 5301 { (yyval.en) = (yyvsp[(2) - (2)].en) ; }5301 { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); } 5302 5302 break; 5303 5303 … … 5809 5809 /* Line 1806 of yacc.c */ 5810 5810 #line 685 "parser.yy" 5811 { (yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) ) ; }5811 { (yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) )/*->set_extension( true )*/; } 5812 5812 break; 5813 5813 … … 7122 7122 /* Line 1806 of yacc.c */ 7123 7123 #line 1475 "parser.yy" 7124 { (yyval.decl) = (yyvsp[(2) - (3)].decl) ; }7124 { (yyval.decl) = (yyvsp[(2) - (3)].decl)/*->set_extension( true )*/; } 7125 7125 break; 7126 7126 … … 7129 7129 /* Line 1806 of yacc.c */ 7130 7130 #line 1478 "parser.yy" 7131 { (yyval.decl) = (yyvsp[(2) - (3)].decl) ; }7131 { (yyval.decl) = (yyvsp[(2) - (3)].decl)/*->set_extension( true )*/; } 7132 7132 break; 7133 7133 … … 7913 7913 /* Line 1806 of yacc.c */ 7914 7914 #line 1994 "parser.yy" 7915 { (yyval.decl) = (yyvsp[(2) - (2)].decl) ; }7915 { (yyval.decl) = (yyvsp[(2) - (2)].decl)/*->set_extension( true )*/; } 7916 7916 break; 7917 7917 -
src/Parser/parser.yy
r55ba7339 re04ef3a 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jun 7 08:08:31201613 // Update Count : 15 6012 // Last Modified On : Mon Jun 13 15:00:23 2016 13 // Update Count : 1578 14 14 // 15 15 … … 430 430 { $$ = $1; } 431 431 | EXTENSION cast_expression // GCC 432 { $$ = $2 ; }432 { $$ = $2->set_extension( true ); } 433 433 | ptrref_operator cast_expression // CFA 434 434 { $$ = new CompositeExprNode( $1, $2 ); } … … 683 683 { $$ = new StatementNode( $1 ); } 684 684 | EXTENSION declaration // GCC 685 { $$ = new StatementNode( $2 ) ; }685 { $$ = new StatementNode( $2 )/*->set_extension( true )*/; } 686 686 | function_definition 687 687 { $$ = new StatementNode( $1 ); } … … 1473 1473 new_field_declaring_list ';' // CFA, new style field declaration 1474 1474 | EXTENSION new_field_declaring_list ';' // GCC 1475 { $$ = $2 ; }1475 { $$ = $2/*->set_extension( true )*/; } 1476 1476 | field_declaring_list ';' 1477 1477 | EXTENSION field_declaring_list ';' // GCC 1478 { $$ = $2 ; }1478 { $$ = $2/*->set_extension( true )*/; } 1479 1479 ; 1480 1480 … … 1992 1992 } 1993 1993 | EXTENSION external_definition 1994 { $$ = $2 ; }1994 { $$ = $2/*->set_extension( true )*/; } 1995 1995 ; 1996 1996 -
src/ResolvExpr/AlternativeFinder.cc
r55ba7339 re04ef3a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 23:52:08 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Apr 20 14:24:03201613 // Update Count : 2 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 13 16:13:54 2016 13 // Update Count : 25 14 14 // 15 15 … … 757 757 for ( std::list< DeclarationWithType* >::iterator i = declList.begin(); i != declList.end(); ++i ) { 758 758 VariableExpr newExpr( *i, nameExpr->get_argName() ); 759 newExpr.set_extension( nameExpr->get_extension() ); 759 760 alternatives.push_back( Alternative( newExpr.clone(), env, Cost() ) ); 760 761 PRINT( -
src/SynTree/Expression.cc
r55ba7339 re04ef3a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Fri May 13 13:23:11201613 // Update Count : 4 011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jun 13 16:03:39 2016 13 // Update Count : 42 14 14 // 15 15 … … 32 32 Expression::Expression( Expression *_aname ) : env( 0 ), argName( _aname ) {} 33 33 34 Expression::Expression( const Expression &other ) : env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ) {34 Expression::Expression( const Expression &other ) : env( maybeClone( other.env ) ), argName( maybeClone( other.get_argName() ) ), extension( other.extension ) { 35 35 cloneAll( other.results, results ); 36 36 } … … 59 59 os << std::string( indent, ' ' ) << "with designator:"; 60 60 argName->print( os, indent+2 ); 61 } // if 62 63 if ( extension ) { 64 os << std::string( indent, ' ' ) << "with extension:"; 61 65 } // if 62 66 } -
src/SynTree/Expression.h
r55ba7339 re04ef3a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Apr 27 17:06:49201613 // Update Count : 2 111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 8 17:05:30 2016 13 // Update Count : 22 14 14 // 15 15 … … 38 38 Expression *get_argName() const { return argName; } 39 39 void set_argName( Expression *name ) { argName = name; } 40 bool get_extension() const { return extension; } 41 void set_extension( bool exten ) { extension = exten; } 40 42 41 43 virtual Expression *clone() const = 0; … … 47 49 TypeSubstitution *env; 48 50 Expression* argName; // if expression is used as an argument, it can be "designated" by this name 51 bool extension = false; 49 52 }; 50 53
Note: See TracChangeset
for help on using the changeset viewer.