Changes in / [c0d00b6:c6e2c18]
- Location:
- src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
rc0d00b6 rc6e2c18 855 855 DeclarationWithType *adapteeDecl = adapterType->get_parameters().front(); 856 856 adapteeDecl->set_name( "_adaptee" ); 857 // do not carry over attributes to real type parameters/return values 858 for ( DeclarationWithType * dwt : realType->parameters ) { 859 deleteAll( dwt->get_type()->attributes ); 860 dwt->get_type()->attributes.clear(); 861 } 862 for ( DeclarationWithType * dwt : realType->returnVals ) { 863 deleteAll( dwt->get_type()->attributes ); 864 dwt->get_type()->attributes.clear(); 865 } 857 866 ApplicationExpr *adapteeApp = new ApplicationExpr( new CastExpr( new VariableExpr( adapteeDecl ), new PointerType( Type::Qualifiers(), realType ) ) ); 858 867 Statement *bodyStmt; -
src/Parser/TypeData.cc
rc0d00b6 rc6e2c18 792 792 793 793 794 NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage ) {794 NamedTypeDecl * buildSymbolic( const TypeData * td, std::list< Attribute * > attributes, const string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage ) { 795 795 assert( td->kind == TypeData::Symbolic ); 796 796 NamedTypeDecl * ret; … … 803 803 buildList( td->symbolic.params, ret->get_parameters() ); 804 804 buildList( td->symbolic.assertions, ret->get_assertions() ); 805 ret->base->attributes.splice( ret->base->attributes.end(), attributes ); 805 806 return ret; 806 807 } // buildSymbolic … … 866 867 return buildEnum( td, attributes, linkage ); 867 868 } else if ( td->kind == TypeData::Symbolic ) { 868 return buildSymbolic( td, name, scs, linkage );869 return buildSymbolic( td, attributes, name, scs, linkage ); 869 870 } else { 870 871 return (new ObjectDecl( name, scs, linkage, bitfieldWidth, typebuild( td ), init, attributes ))->set_asmName( asmName ); -
src/Parser/parser.yy
rc0d00b6 rc6e2c18 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Nov 20 09:45:36 201713 // Update Count : 29 4512 // Last Modified On : Sun Nov 26 11:36:36 2017 13 // Update Count : 2969 14 14 // 15 15 … … 345 345 %type<en> type_list 346 346 347 %type<decl> type_qualifier type_qualifier_name type_qualifier_list_opt type_qualifier_list347 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list 348 348 %type<decl> type_specifier type_specifier_nobody 349 349 … … 379 379 // `---' matches start of TYPEGENname '(' 380 380 // Must be: 381 // Foo( int ) ( *fp )( int );381 // Foo( int ) ( *fp )( int ); 382 382 383 383 // Order of these lines matters (low-to-high precedence). … … 1058 1058 with_statement: 1059 1059 WITH '(' tuple_expression_list ')' statement 1060 { $$ = nullptr; }// FIX ME1060 { throw SemanticError("With clause is currently unimplemented."); $$ = nullptr; } // FIX ME 1061 1061 ; 1062 1062 … … 1064 1064 mutex_statement: 1065 1065 MUTEX '(' argument_expression_list ')' statement 1066 { $$ = nullptr; }// FIX ME1066 { throw SemanticError("Mutex statement is currently unimplemented."); $$ = nullptr; } // FIX ME 1067 1067 ; 1068 1068 … … 1280 1280 c_declaration pop ';' 1281 1281 | cfa_declaration pop ';' // CFA 1282 | STATICASSERT '(' constant_expression ',' string_literal ')' ';' // C11 1283 { throw SemanticError("Static assert is currently unimplemented."); $$ = nullptr; } // FIX ME 1282 1284 ; 1283 1285 … … 1587 1589 | ATOMIC 1588 1590 { $$ = DeclarationNode::newTypeQualifier( Type::Atomic ); } 1589 | FORALL '(' 1591 | forall 1592 ; 1593 1594 forall: 1595 FORALL '(' 1590 1596 { 1591 1597 typedefTable.enterScope(); … … 2374 2380 $$ = $2; 2375 2381 } 2382 | forall '{' external_definition_list '}' // CFA, namespace 2376 2383 ; 2377 2384 … … 2399 2406 with_clause_opt: 2400 2407 // empty 2401 { $$ = nullptr; } // FIX ME2408 { $$ = nullptr; } 2402 2409 | WITH '(' tuple_expression_list ')' 2403 { $$ = nullptr; }// FIX ME2410 { throw SemanticError("With clause is currently unimplemented."); $$ = nullptr; } // FIX ME 2404 2411 ; 2405 2412 … … 2418 2425 $$ = $2->addFunctionBody( $4 )->addType( $1 ); 2419 2426 } 2427 // handles default int return type, OBSOLESCENT (see 1) 2420 2428 | type_qualifier_list function_declarator with_clause_opt compound_statement 2421 2429 { … … 2424 2432 $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 ); 2425 2433 } 2434 // handles default int return type, OBSOLESCENT (see 1) 2426 2435 | declaration_qualifier_list function_declarator with_clause_opt compound_statement 2427 2436 { … … 2430 2439 $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 ); 2431 2440 } 2441 // handles default int return type, OBSOLESCENT (see 1) 2432 2442 | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement 2433 2443 { … … 2445 2455 $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5 )->addType( $1 ); 2446 2456 } 2457 // handles default int return type, OBSOLESCENT (see 1) 2447 2458 | type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2448 2459 { … … 2451 2462 $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5 )->addQualifiers( $1 ); 2452 2463 } 2453 2454 // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4) 2464 // handles default int return type, OBSOLESCENT (see 1) 2455 2465 | declaration_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2456 2466 { … … 2459 2469 $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5 )->addQualifiers( $1 ); 2460 2470 } 2471 // handles default int return type, OBSOLESCENT (see 1) 2461 2472 | declaration_qualifier_list type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement 2462 2473 { -
src/SymTab/Autogen.cc
rc0d00b6 rc6e2c18 375 375 continue; 376 376 } 377 memCtorType->parameters.push_back( new ObjectDecl( field->name, Type::StorageClasses(), LinkageSpec::Cforall, 0, field->get_type()->clone(), 0 ) ); 377 // do not carry over field's attributes to parameter type 378 Type * paramType = field->get_type()->clone(); 379 deleteAll( paramType->attributes ); 380 paramType->attributes.clear(); 381 // add a parameter corresponding to this field 382 memCtorType->parameters.push_back( new ObjectDecl( field->name, Type::StorageClasses(), LinkageSpec::Cforall, nullptr, paramType, nullptr ) ); 378 383 FunctionDecl * ctor = genFunc( "?{}", memCtorType->clone(), functionNesting ); 379 384 makeFieldCtorBody( aggregateDecl->members.begin(), aggregateDecl->members.end(), ctor ); … … 506 511 break; 507 512 } 508 memCtorType->parameters.push_back( new ObjectDecl( field->name, Type::StorageClasses(), LinkageSpec::Cforall, nullptr, field->get_type()->clone(), nullptr ) ); 513 // do not carry over field's attributes to parameter type 514 Type * paramType = field->get_type()->clone(); 515 deleteAll( paramType->attributes ); 516 paramType->attributes.clear(); 517 // add a parameter corresponding to this field 518 memCtorType->parameters.push_back( new ObjectDecl( field->name, Type::StorageClasses(), LinkageSpec::Cforall, nullptr, paramType, nullptr ) ); 509 519 FunctionDecl * ctor = genFunc( "?{}", memCtorType->clone(), functionNesting ); 510 520 ObjectDecl * srcParam = strict_dynamic_cast<ObjectDecl *>( ctor->type->parameters.back() ); -
src/SymTab/Validate.cc
rc0d00b6 rc6e2c18 201 201 Declaration * postmutate( TraitDecl * contextDecl ); 202 202 203 void premutate( FunctionType * ftype ); 204 203 205 private: 204 206 template<typename AggDecl> … … 214 216 TypeDeclMap typedeclNames; 215 217 int scopeLevel; 218 bool inFunctionType = false; 216 219 }; 217 220 … … 725 728 Type *ret = def->second.first->base->clone(); 726 729 ret->get_qualifiers() |= typeInst->get_qualifiers(); 730 // attributes are not carried over from typedef to function parameters/return values 731 if ( ! inFunctionType ) { 732 ret->attributes.splice( ret->attributes.end(), typeInst->attributes ); 733 } else { 734 deleteAll( ret->attributes ); 735 ret->attributes.clear(); 736 } 727 737 // place instance parameters on the typedef'd type 728 738 if ( ! typeInst->parameters.empty() ) { … … 901 911 Declaration *EliminateTypedef::postmutate( TraitDecl * traitDecl ) { 902 912 return handleAggregate( traitDecl ); 913 } 914 915 void EliminateTypedef::premutate( FunctionType * ) { 916 GuardValue( inFunctionType ); 917 inFunctionType = true; 903 918 } 904 919 -
src/tests/polymorphism.c
rc0d00b6 rc6e2c18 47 47 S s; 48 48 s.i = i; 49 assert (s.i == i);49 assertf(s.i == i, "struct operation fails in polymorphic context."); 50 50 51 51 B b; … … 73 73 { 74 74 // test aggregates with polymorphic members 75 typedef uint32_t x_type;76 typedef uint64_t y_type;75 typedef __attribute__((aligned(8))) uint32_t x_type; 76 typedef __attribute__((aligned(8))) uint64_t y_type; 77 77 78 78 x_type x = 3; … … 89 89 // ensure that the size of aggregates with polymorphic members 90 90 // matches the size of the aggregates in a monomorphic context 91 assert( struct_size(x, y) == sizeof(S) ); 92 assert( union_size(x, y) == sizeof(U) ); 91 size_t ssz = struct_size(x, y); 92 size_t usz = union_size(x, y); 93 assertf( ssz == sizeof(S), "struct size differs in polymorphic context: %zd / %zd", ssz, sizeof(S)); 94 assertf( usz == sizeof(U), "union size differs in polymorphic context: %zd / %zd", usz, sizeof(U)); 93 95 94 96 y_type ?=?(y_type & this, zero_t) { … … 111 113 u.f2 = 0; 112 114 u.f1 = x; 113 assert (ret == u.f2);115 assertf(ret == u.f2, "union operation fails in polymorphic context."); 114 116 } 115 117 }
Note: See TracChangeset
for help on using the changeset viewer.