Changeset f6e3e34
- Timestamp:
- Apr 3, 2018, 11:13:10 AM (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:
- 92fea32
- Parents:
- 3d2b7bc
- Location:
- src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.h
r3d2b7bc rf6e3e34 66 66 virtual void visit( TypedefDecl * typeDecl ) override final; 67 67 virtual void visit( AsmDecl * asmDecl ) override final; 68 virtual void visit( StaticAssertDecl * assertDecl ) override final; 68 69 69 70 virtual void visit( CompoundStmt * compoundStmt ) override final; … … 161 162 virtual Declaration * mutate( TypedefDecl * typeDecl ) override final; 162 163 virtual AsmDecl * mutate( AsmDecl * asmDecl ) override final; 164 virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) override final; 163 165 164 166 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override final; -
src/Common/PassVisitor.impl.h
r3d2b7bc rf6e3e34 685 685 686 686 //-------------------------------------------------------------------------- 687 // StaticAssertDecl 688 template< typename pass_type > 689 void PassVisitor< pass_type >::visit( StaticAssertDecl * node ) { 690 VISIT_START( node ); 691 692 maybeAccept_impl( node->condition, *this ); 693 maybeAccept_impl( node->message , *this ); 694 695 VISIT_END( node ); 696 } 697 698 template< typename pass_type > 699 StaticAssertDecl * PassVisitor< pass_type >::mutate( StaticAssertDecl * node ) { 700 MUTATE_START( node ); 701 702 maybeMutate_impl( node->condition, *this ); 703 maybeMutate_impl( node->message , *this ); 704 705 MUTATE_END( StaticAssertDecl, node ); 706 } 707 708 //-------------------------------------------------------------------------- 687 709 // CompoundStmt 688 710 template< typename pass_type > … … 1490 1512 indexerScopedAccept( node->result, *this ); 1491 1513 maybeAccept_impl ( node->type , *this ); 1492 maybeAccept_impl ( node->member, *this );1493 1514 1494 1515 VISIT_END( node ); … … 1502 1523 indexerScopedMutate( node->result, *this ); 1503 1524 maybeMutate_impl ( node->type , *this ); 1504 maybeMutate_impl ( node->member, *this );1505 1525 1506 1526 MUTATE_END( Expression, node ); -
src/Parser/DeclarationNode.cc
r3d2b7bc rf6e3e34 71 71 attr.expr = nullptr; 72 72 attr.type = nullptr; 73 74 assert.condition = nullptr; 75 assert.message = nullptr; 73 76 } 74 77 … … 88 91 // asmName, no delete, passed to next stage 89 92 delete initializer; 93 94 delete assert.condition; 95 delete assert.message; 90 96 } 91 97 … … 117 123 newnode->attr.expr = maybeClone( attr.expr ); 118 124 newnode->attr.type = maybeClone( attr.type ); 125 126 newnode->assert.condition = maybeClone( assert.condition ); 127 newnode->assert.message = maybeClone( assert.message ); 119 128 return newnode; 120 129 } // DeclarationNode::clone … … 434 443 return newnode; 435 444 } 445 446 DeclarationNode * DeclarationNode::newStaticAssert( ExpressionNode * condition, Expression * message ) { 447 DeclarationNode * newnode = new DeclarationNode; 448 newnode->assert.condition = condition; 449 newnode->assert.message = message; 450 return newnode; 451 } 452 436 453 437 454 void appendError( string & dst, const string & src ) { … … 1052 1069 } // if 1053 1070 1071 if ( assert.condition ) { 1072 return new StaticAssertDecl( maybeBuild< Expression >( assert.condition ), strict_dynamic_cast< ConstantExpr * >( maybeClone( assert.message ) ) ); 1073 } 1074 1054 1075 // SUE's cannot have function specifiers, either 1055 1076 // -
src/Parser/ParseNode.h
r3d2b7bc rf6e3e34 246 246 static DeclarationNode * newAttribute( std::string *, ExpressionNode * expr = nullptr ); // gcc attributes 247 247 static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement 248 static DeclarationNode * newStaticAssert( ExpressionNode * condition, Expression * message ); 248 249 249 250 DeclarationNode(); … … 313 314 Attr_t attr; 314 315 316 struct StaticAssert_t { 317 ExpressionNode * condition; 318 Expression * message; 319 }; 320 StaticAssert_t assert; 321 315 322 BuiltinType builtin; 316 323 -
src/Parser/parser.yy
r3d2b7bc rf6e3e34 1308 1308 static_assert: 1309 1309 STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11 1310 { SemanticError( yylloc, "Static assert is currently unimplemented." ); $$ = nullptr; } // FIX ME1310 { $$ = DeclarationNode::newStaticAssert( $3, $5 ); } 1311 1311 1312 1312 // C declaration syntax is notoriously confusing and error prone. Cforall provides its own type, variable and function -
src/SynTree/Declaration.cc
r3d2b7bc rf6e3e34 81 81 82 82 83 StaticAssertDecl::StaticAssertDecl( Expression * condition, ConstantExpr * message ) : Declaration( "", Type::StorageClasses(), LinkageSpec::C ), condition( condition ), message( message ) { 84 } 85 86 StaticAssertDecl::StaticAssertDecl( const StaticAssertDecl & other ) : Declaration( other ), condition( maybeClone( other.condition ) ), message( maybeClone( other.message ) ) { 87 } 88 89 StaticAssertDecl::~StaticAssertDecl() { 90 delete condition; 91 delete message; 92 } 93 94 void StaticAssertDecl::print( std::ostream &os, Indenter indent ) const { 95 os << "Static Assert with condition: "; 96 condition->print( os, indent+1 ); 97 os << std::endl << indent << "and message: "; 98 message->print( os, indent+1 ); 99 os << std::endl; 100 } 101 102 void StaticAssertDecl::printShort( std::ostream &os, Indenter indent ) const { 103 print( os, indent ); 104 } 105 83 106 // Local Variables: // 84 107 // tab-width: 4 // -
src/SynTree/Declaration.h
r3d2b7bc rf6e3e34 365 365 }; 366 366 367 class StaticAssertDecl : public Declaration { 368 public: 369 Expression * condition; 370 ConstantExpr * message; // string literal 371 372 StaticAssertDecl( Expression * condition, ConstantExpr * message ); 373 StaticAssertDecl( const StaticAssertDecl & other ); 374 virtual ~StaticAssertDecl(); 375 376 virtual StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); } 377 virtual void accept( Visitor &v ) override { v.visit( this ); } 378 virtual StaticAssertDecl * acceptMutator( Mutator &m ) override { return m.mutate( this ); } 379 virtual void print( std::ostream &os, Indenter indent = {} ) const override; 380 virtual void printShort( std::ostream &os, Indenter indent = {} ) const override; 381 }; 382 367 383 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ); 368 384 -
src/SynTree/Mutator.h
r3d2b7bc rf6e3e34 34 34 virtual Declaration * mutate( TypedefDecl * typeDecl ) = 0; 35 35 virtual AsmDecl * mutate( AsmDecl * asmDecl ) = 0; 36 virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) = 0; 36 37 37 38 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) = 0; -
src/SynTree/SynTree.h
r3d2b7bc rf6e3e34 38 38 class TypedefDecl; 39 39 class AsmDecl; 40 class StaticAssertDecl; 40 41 41 42 class Statement; -
src/SynTree/Visitor.h
r3d2b7bc rf6e3e34 36 36 virtual void visit( TypedefDecl * typeDecl ) = 0; 37 37 virtual void visit( AsmDecl * asmDecl ) = 0; 38 virtual void visit( StaticAssertDecl * assertDecl ) = 0; 38 39 39 40 virtual void visit( CompoundStmt * compoundStmt ) = 0;
Note: See TracChangeset
for help on using the changeset viewer.