Changes in / [ca37445:8ad6533]
- Location:
- src
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rca37445 r8ad6533 203 203 204 204 void CodeGenerator::handleAggregate( AggregateDecl * aggDecl, const std::string & kind ) { 205 genAttributes( aggDecl->get_attributes() ); 206 205 207 if( ! aggDecl->get_parameters().empty() && ! genC ) { 206 208 // assertf( ! genC, "Aggregate type parameters should not reach code generation." ); … … 211 213 } 212 214 213 output << kind; 214 genAttributes( aggDecl->get_attributes() ); 215 output << aggDecl->get_name(); 215 output << kind << aggDecl->get_name(); 216 216 217 217 if ( aggDecl->has_body() ) { … … 298 298 output << " }"; 299 299 } 300 }301 302 void CodeGenerator::postvisit( StaticAssertDecl * assertDecl ) {303 output << "_Static_assert(";304 assertDecl->condition->accept( *visitor );305 output << ", ";306 assertDecl->message->accept( *visitor );307 output << ")";308 300 } 309 301 -
src/CodeGen/CodeGenerator.h
rca37445 r8ad6533 42 42 void postvisit( FunctionDecl * ); 43 43 void postvisit( ObjectDecl * ); 44 void postvisit( UnionDecl * aggregateDecl ); 45 void postvisit( EnumDecl * aggregateDecl ); 46 void postvisit( TraitDecl * aggregateDecl ); 47 void postvisit( TypedefDecl * typeDecl ); 48 void postvisit( TypeDecl * typeDecl ); 49 void postvisit( StaticAssertDecl * assertDecl ); 44 void postvisit( UnionDecl *aggregateDecl ); 45 void postvisit( EnumDecl *aggregateDecl ); 46 void postvisit( TraitDecl *aggregateDecl ); 47 void postvisit( TypedefDecl *typeDecl ); 48 void postvisit( TypeDecl *typeDecl ); 50 49 51 50 //*** Initializer -
src/CodeGen/OperatorTable.cc
rca37445 r8ad6533 79 79 } // namespace 80 80 81 bool operatorLookup( const std::string & funcName, OperatorInfo &info ) {81 bool operatorLookup( std::string funcName, OperatorInfo &info ) { 82 82 static bool init = false; 83 83 if ( ! init ) { … … 100 100 return true; 101 101 } // if 102 }103 104 bool isOperator( const std::string & funcName ) {105 OperatorInfo info;106 return operatorLookup( funcName, info );107 102 } 108 103 -
src/CodeGen/OperatorTable.h
rca37445 r8ad6533 41 41 }; 42 42 43 bool isOperator( const std::string & funcName ); 44 bool operatorLookup( const std::string & funcName, OperatorInfo & info ); 43 bool operatorLookup( std::string funcName, OperatorInfo &info ); 45 44 46 45 bool isConstructor( const std::string & ); -
src/Common/Debug.h
rca37445 r8ad6533 28 28 namespace Debug { 29 29 /// debug codegen a translation unit 30 static inline void codeGen( __attribute__((unused)) const std::list< Declaration * > & translationUnit, __attribute__((unused)) const std::string & label, __attribute__((unused))LinkageSpec::Spec linkageFilter = LinkageSpec::Compiler ) {30 static inline void codeGen( __attribute__((unused)) const std::list< Declaration * > & translationUnit, __attribute__((unused)) const std::string & label, LinkageSpec::Spec linkageFilter = LinkageSpec::Compiler ) { 31 31 #ifdef DEBUG 32 32 std::list< Declaration * > decls; … … 41 41 } // dump 42 42 43 static inline void treeDump( __attribute__((unused)) const std::list< Declaration * > & translationUnit, __attribute__((unused)) const std::string & label, __attribute__((unused))LinkageSpec::Spec linkageFilter = LinkageSpec::Compiler ) {43 static inline void treeDump( __attribute__((unused)) const std::list< Declaration * > & translationUnit, __attribute__((unused)) const std::string & label, LinkageSpec::Spec linkageFilter = LinkageSpec::Compiler ) { 44 44 #ifdef DEBUG 45 45 std::list< Declaration * > decls; -
src/Common/ErrorObjects.h
rca37445 r8ad6533 35 35 class SemanticErrorException : public std::exception { 36 36 public: 37 SemanticErrorException() = default;37 SemanticErrorException() = default; 38 38 SemanticErrorException( CodeLocation location, std::string error ); 39 39 ~SemanticErrorException() throw() {} -
src/Common/PassVisitor.h
rca37445 r8ad6533 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;69 68 70 69 virtual void visit( CompoundStmt * compoundStmt ) override final; … … 162 161 virtual Declaration * mutate( TypedefDecl * typeDecl ) override final; 163 162 virtual AsmDecl * mutate( AsmDecl * asmDecl ) override final; 164 virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) override final;165 163 166 164 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override final; -
src/Common/PassVisitor.impl.h
rca37445 r8ad6533 685 685 686 686 //-------------------------------------------------------------------------- 687 // StaticAssertDecl688 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 //--------------------------------------------------------------------------709 687 // CompoundStmt 710 688 template< typename pass_type > … … 1512 1490 indexerScopedAccept( node->result, *this ); 1513 1491 maybeAccept_impl ( node->type , *this ); 1492 maybeAccept_impl ( node->member, *this ); 1514 1493 1515 1494 VISIT_END( node ); … … 1523 1502 indexerScopedMutate( node->result, *this ); 1524 1503 maybeMutate_impl ( node->type , *this ); 1504 maybeMutate_impl ( node->member, *this ); 1525 1505 1526 1506 MUTATE_END( Expression, node ); -
src/GenPoly/Lvalue.cc
rca37445 r8ad6533 45 45 Expression * mkDeref( Expression * arg ) { 46 46 if ( SymTab::dereferenceOperator ) { 47 // note: reference depth can be arbitrarily deep here, so peel off the outermost pointer/reference, not just pointer because they are effecitvely equivalent in this pass48 47 VariableExpr * deref = new VariableExpr( SymTab::dereferenceOperator ); 49 48 deref->result = new PointerType( Type::Qualifiers(), deref->result ); … … 198 197 PRINT( 199 198 std::cerr << "pair<0>: " << arg << std::endl; 200 std::cerr << " -- " << arg->result << std::endl;201 199 std::cerr << "pair<1>: " << formal << std::endl; 202 200 ) 203 201 if ( dynamic_cast<ReferenceType*>( formal ) ) { 204 PRINT( 205 std::cerr << "===formal is reference" << std::endl; 206 ) 207 // TODO: it's likely that the second condition should be ... && ! isIntrinsicReference( arg ), but this requires investigation. 208 if ( function->get_linkage() != LinkageSpec::Intrinsic && isIntrinsicReference( arg ) ) { 209 // if argument is dereference or array subscript, the result isn't REALLY a reference, but non-intrinsic functions expect a reference: take address 210 PRINT( 211 std::cerr << "===is intrinsic arg in non-intrinsic call - adding address" << std::endl; 212 ) 213 arg = new AddressExpr( arg ); 214 } else if ( function->get_linkage() == LinkageSpec::Intrinsic && arg->result->referenceDepth() != 0 ) { 215 // argument is a 'real' reference, but function expects a C lvalue: add a dereference to the reference-typed argument 216 PRINT( 217 std::cerr << "===is non-intrinsic arg in intrinsic call - adding deref to arg" << std::endl; 218 ) 202 if ( isIntrinsicReference( arg ) ) { // do not combine conditions, because that changes the meaning of the else if 203 if ( function->get_linkage() != LinkageSpec::Intrinsic ) { // intrinsic functions that turn pointers into references 204 // if argument is dereference or array subscript, the result isn't REALLY a reference, so it's not necessary to fix the argument 205 PRINT( 206 std::cerr << "===is intrinsic arg in non-intrinsic call - adding address" << std::endl; 207 ) 208 arg = new AddressExpr( arg ); 209 } 210 } else if ( function->get_linkage() == LinkageSpec::Intrinsic ) { 211 // std::cerr << "===adding deref to arg" << std::endl; 212 // if the parameter is a reference, add a dereference to the reference-typed argument. 219 213 Type * baseType = InitTweak::getPointerBase( arg->result ); 220 214 assertf( baseType, "parameter is reference, arg must be pointer or reference: %s", toString( arg->result ).c_str() ); … … 223 217 arg->set_result( ptrType ); 224 218 arg = mkDeref( arg ); 225 assertf( arg->result->referenceDepth() == 0, "Reference types should have been eliminated from intrinsic function calls, but weren't: %s", toCString( arg->result ) );226 219 } 227 220 } -
src/Parser/DeclarationNode.cc
rca37445 r8ad6533 71 71 attr.expr = nullptr; 72 72 attr.type = nullptr; 73 74 assert.condition = nullptr;75 assert.message = nullptr;76 73 } 77 74 … … 91 88 // asmName, no delete, passed to next stage 92 89 delete initializer; 93 94 delete assert.condition;95 delete assert.message;96 90 } 97 91 … … 123 117 newnode->attr.expr = maybeClone( attr.expr ); 124 118 newnode->attr.type = maybeClone( attr.type ); 125 126 newnode->assert.condition = maybeClone( assert.condition );127 newnode->assert.message = maybeClone( assert.message );128 119 return newnode; 129 120 } // DeclarationNode::clone … … 443 434 return newnode; 444 435 } 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 453 436 454 437 void appendError( string & dst, const string & src ) { … … 1069 1052 } // if 1070 1053 1071 if ( assert.condition ) {1072 return new StaticAssertDecl( maybeBuild< Expression >( assert.condition ), strict_dynamic_cast< ConstantExpr * >( maybeClone( assert.message ) ) );1073 }1074 1075 1054 // SUE's cannot have function specifiers, either 1076 1055 // -
src/Parser/ParseNode.h
rca37445 r8ad6533 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 );249 248 250 249 DeclarationNode(); … … 314 313 Attr_t attr; 315 314 316 struct StaticAssert_t {317 ExpressionNode * condition;318 Expression * message;319 };320 StaticAssert_t assert;321 322 315 BuiltinType builtin; 323 316 -
src/Parser/parser.yy
rca37445 r8ad6533 1314 1314 static_assert: 1315 1315 STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11 1316 { $$ = DeclarationNode::newStaticAssert( $3, $5 ); }1316 { SemanticError( yylloc, "Static assert is currently unimplemented." ); $$ = nullptr; } 1317 1317 1318 1318 // C declaration syntax is notoriously confusing and error prone. Cforall provides its own type, variable and function -
src/ResolvExpr/CommonType.cc
rca37445 r8ad6533 27 27 #include "typeops.h" // for isFtype 28 28 29 #define DEBUG 30 #ifdef DEBUG 31 #define PRINT(x) x 32 #else 33 #define PRINT(x) 34 #endif 29 // #define DEBUG 35 30 36 31 namespace ResolvExpr { … … 75 70 // need unify to bind type variables 76 71 if ( unify( t1, t2, env, have, need, newOpen, indexer, common ) ) { 77 PRINT( 78 std::cerr << "unify success: " << widenFirst << " " << widenSecond << std::endl; 79 ) 72 // std::cerr << "unify success: " << widenFirst << " " << widenSecond << std::endl; 80 73 if ( (widenFirst || t2->get_qualifiers() <= t1->get_qualifiers()) && (widenSecond || t1->get_qualifiers() <= t2->get_qualifiers()) ) { 81 PRINT( 82 std::cerr << "widen okay" << std::endl; 83 ) 74 // std::cerr << "widen okay" << std::endl; 84 75 common->get_qualifiers() |= t1->get_qualifiers(); 85 76 common->get_qualifiers() |= t2->get_qualifiers(); … … 87 78 } 88 79 } 89 PRINT( 90 std::cerr << "exact unify failed: " << t1 << " " << t2 << std::endl; 91 ) 80 // std::cerr << "exact unify failed: " << t1 << " " << t2 << std::endl; 92 81 return nullptr; 93 82 } … … 105 94 // special case where one type has a reference depth of 1 larger than the other 106 95 if ( diff > 0 || diff < 0 ) { 107 PRINT( 108 std::cerr << "reference depth diff: " << diff << std::endl; 109 ) 96 // std::cerr << "reference depth diff: " << diff << std::endl; 110 97 Type * result = nullptr; 111 98 ReferenceType * ref1 = dynamic_cast< ReferenceType * >( type1 ); … … 122 109 if ( result && ref1 ) { 123 110 // formal is reference, so result should be reference 124 PRINT( 125 std::cerr << "formal is reference; result should be reference" << std::endl; 126 ) 111 // std::cerr << "formal is reference; result should be reference" << std::endl; 127 112 result = new ReferenceType( ref1->get_qualifiers(), result ); 128 113 } 129 PRINT( 130 std::cerr << "common type of reference [" << type1 << "] and [" << type2 << "] is [" << result << "]" << std::endl; 131 ) 114 // std::cerr << "common type of reference [" << type1 << "] and [" << type2 << "] is [" << result << "]" << std::endl; 132 115 return result; 133 116 } -
src/ResolvExpr/Resolver.cc
rca37445 r8ad6533 59 59 void previsit( TypeDecl *typeDecl ); 60 60 void previsit( EnumDecl * enumDecl ); 61 void previsit( StaticAssertDecl * assertDecl );62 61 63 62 void previsit( ArrayType * at ); … … 362 361 GuardValue( inEnumDecl ); 363 362 inEnumDecl = true; 364 }365 366 void Resolver::previsit( StaticAssertDecl * assertDecl ) {367 findIntegralExpression( assertDecl->condition, indexer );368 363 } 369 364 -
src/SymTab/Validate.cc
rca37445 r8ad6533 89 89 void previsit( StructDecl * aggregateDecl ); 90 90 void previsit( UnionDecl * aggregateDecl ); 91 void previsit( StaticAssertDecl * assertDecl );92 91 93 92 private: … … 297 296 } 298 297 299 bool shouldHoist( Declaration *decl ) {300 return dynamic_cast< StructDecl * >( decl ) || dynamic_cast< UnionDecl * >( decl ) || dynamic_cast< StaticAssertDecl * >( decl );298 bool isStructOrUnion( Declaration *decl ) { 299 return dynamic_cast< StructDecl * >( decl ) || dynamic_cast< UnionDecl * >( decl ); 301 300 } 302 301 … … 311 310 } // if 312 311 // Always remove the hoisted aggregate from the inner structure. 313 GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, shouldHoist, false ); } );312 GuardAction( [aggregateDecl]() { filter( aggregateDecl->members, isStructOrUnion, false ); } ); 314 313 } 315 314 … … 329 328 if ( inst->baseUnion ) { 330 329 declsToAddBefore.push_front( inst->baseUnion ); 331 }332 }333 334 void HoistStruct::previsit( StaticAssertDecl * assertDecl ) {335 if ( parentAggr ) {336 declsToAddBefore.push_back( assertDecl );337 330 } 338 331 } … … 637 630 forallFixer( pointer->base->forall, object ); 638 631 } // if 639 // ensure that operator names only apply to functions or function pointers640 if ( CodeGen::isOperator( object->name ) && ! dynamic_cast< FunctionType * >( object->type->stripDeclarator() ) ) {641 SemanticError( object->location, toCString( "operator ", object->name.c_str(), " is not a function or function pointer." ) );642 }643 632 object->fixUniqueId(); 644 633 } -
src/SynTree/Declaration.cc
rca37445 r8ad6533 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 106 83 // Local Variables: // 107 84 // tab-width: 4 // -
src/SynTree/Declaration.h
rca37445 r8ad6533 365 365 }; 366 366 367 class StaticAssertDecl : public Declaration {368 public:369 Expression * condition;370 ConstantExpr * message; // string literal371 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 383 367 std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ); 384 368 -
src/SynTree/Mutator.h
rca37445 r8ad6533 34 34 virtual Declaration * mutate( TypedefDecl * typeDecl ) = 0; 35 35 virtual AsmDecl * mutate( AsmDecl * asmDecl ) = 0; 36 virtual StaticAssertDecl * mutate( StaticAssertDecl * assertDecl ) = 0;37 36 38 37 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) = 0; -
src/SynTree/SynTree.h
rca37445 r8ad6533 38 38 class TypedefDecl; 39 39 class AsmDecl; 40 class StaticAssertDecl;41 40 42 41 class Statement; -
src/SynTree/Visitor.h
rca37445 r8ad6533 36 36 virtual void visit( TypedefDecl * typeDecl ) = 0; 37 37 virtual void visit( AsmDecl * asmDecl ) = 0; 38 virtual void visit( StaticAssertDecl * assertDecl ) = 0;39 38 40 39 virtual void visit( CompoundStmt * compoundStmt ) = 0; -
src/tests/.expect/references.txt
rca37445 r8ad6533 4 4 13 1 12 5 5 14 14 6 x = 6 ; x2 = 7897 x = 6 ; x2 = 9998 x = 12345 ; x2 = 9999 x = 22222 ; x2 = 99910 6 Default constructing a Y 11 7 Copy constructing a Y -
src/tests/operators.c
rca37445 r8ad6533 27 27 a(b); 28 28 a + b; 29 struct accumulator ?+?; // why not, eh? 30 a + b; 29 31 } 30 32 -
src/tests/references.c
rca37445 r8ad6533 46 46 47 47 int main() { 48 int x = 123456, x2 = 789,*p1 = &x, **p2 = &p1, ***p3 = &p2,48 int x = 123456, *p1 = &x, **p2 = &p1, ***p3 = &p2, 49 49 &r1 = x, &&r2 = r1, &&&r3 = r2; 50 50 ***p3 = 3; // change x 51 // ((int&)r3 = 3; // change x, ***r3 51 52 **p3 = &x; // change p1 53 // ((int*&)&r3) = &x; // change r1, (&*)**r3 52 54 *p3 = &p1; // change p2 55 // ((int**&)&&r3) = &p2; // change r2, (&(&*)*)*r3 56 // ((int***&)&&&r3) = p3; // change r3 to p3, (&(&(&*)*)*)r3 53 57 int y = 0, z = 11, & ar[3] = { x, y, z }; // initialize array of references 54 58 // &ar[1] = &z; // change reference array element … … 58 62 // sizeof( &ar[1] ) == sizeof( int *); // is true, i.e., the size of a reference 59 63 60 ((int*&)&r3) = &x; // change r1, (&*)**r361 x = 3;62 64 // test that basic reference properties are true - r1 should be an alias for x 63 65 printf("%d %d %d\n", x, r1, &x == &r1); … … 74 76 changeRef( r1 ); 75 77 printf("%d %d\n", r1, x); 76 77 ((int&)r3) = 6; // change x, ***r378 printf("x = %d ; x2 = %d\n", x, x2); // check that x was changed79 ((int*&)&r3) = &x2; // change r1 to refer to x2, (&*)**r380 ((int&)r3) = 999; // modify x281 printf("x = %d ; x2 = %d\n", x, x2); // check that x2 was changed82 ((int**&)&&r3) = p2; // change r2, (&(&*)*)*r383 ((int&)r3) = 12345; // modify x84 printf("x = %d ; x2 = %d\n", x, x2); // check that x was changed85 ((int***&)&&&r3) = p3; // change r3 to p3, (&(&(&*)*)*)r386 ((int&)r3) = 22222; // modify x87 printf("x = %d ; x2 = %d\n", x, x2); // check that x was changed88 78 89 79 // test that reference members are not implicitly constructed/destructed/assigned
Note: See TracChangeset
for help on using the changeset viewer.