Changes in / [54cd1a51:4d5c5b6a]
- Files:
-
- 9 edited
-
src/AST/Expr.cpp (modified) (3 diffs)
-
src/AST/Expr.hpp (modified) (3 diffs)
-
src/AST/Util.cpp (modified) (1 diff)
-
src/AST/Util.hpp (modified) (1 diff)
-
src/ResolvExpr/CandidateFinder.cpp (modified) (3 diffs)
-
src/main.cpp (modified) (1 diff)
-
tests/.expect/alloc-ERROR.arm64.txt (modified) (1 diff)
-
tests/.expect/alloc-ERROR.x64.txt (modified) (1 diff)
-
tests/.expect/alloc-ERROR.x86.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.cpp
r54cd1a51 r4d5c5b6a 26 26 #include "Stmt.hpp" 27 27 #include "Type.hpp" 28 #include "Util.hpp" // for TranslationDeps 28 29 #include "TypeSubstitution.hpp" 29 30 #include "Common/Utility.hpp" … … 280 281 // --- SizeofExpr 281 282 282 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type ) 283 : SizeofExpr( loc, type, nullptr ) {} 284 285 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type, const Type * result ) 286 : Expr( loc, result ), type( type ) {} 283 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * t ) 284 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {} 287 285 288 286 // --- AlignofExpr 289 287 290 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type ) 291 : AlignofExpr( loc, type, nullptr ) {} 292 293 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type, const Type * result ) 294 : Expr( loc, result ), type( type ) {} 288 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t ) 289 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {} 295 290 296 291 // --- CountofExpr 297 292 298 293 CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t ) 299 : Expr( loc ), type( t ) {}294 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {} 300 295 301 296 // --- OffsetofExpr 302 297 303 298 OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem ) 304 : OffsetofExpr( loc, ty, mem, nullptr ) {} 305 306 OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res ) 307 : Expr( loc, res ), type( ty ), member( mem ) { 299 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( ty ), member( mem ) { 308 300 assert( type ); 309 301 assert( member ); … … 313 305 314 306 OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty ) 315 : Expr( loc ), type( ty ) { 307 : Expr( loc, new ArrayType{ 308 ast::TranslationDeps::getSizeType(), nullptr, FixedLen, DynamicDim } 309 ), type( ty ) { 316 310 assert( type ); 317 311 } -
src/AST/Expr.hpp
r54cd1a51 r4d5c5b6a 483 483 484 484 SizeofExpr( const CodeLocation & loc, const Type * t ); 485 SizeofExpr( const CodeLocation & loc, const Type * t, const Type * r );486 485 487 486 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } … … 497 496 498 497 AlignofExpr( const CodeLocation & loc, const Type * t ); 499 AlignofExpr( const CodeLocation & loc, const Type * t, const Type * r );500 498 501 499 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } … … 540 538 541 539 OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem ); 542 OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res );543 540 544 541 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } -
src/AST/Util.cpp
r54cd1a51 r4d5c5b6a 384 384 } 385 385 386 namespace { 387 const TranslationUnit * transUnit = 0; 388 } 389 390 void TranslationDeps::evolve( TranslationUnit & u ) { 391 transUnit = &u; 392 } 393 394 const ast::Type * TranslationDeps::getSizeType() { 395 static const ast::Type * zd_abstract = new TypeInstType{ "size_t", TypeDecl::Kind::Dtype }; 396 static const ast::Type * ld_concrete = new BasicType( BasicKind::LongUnsignedInt ); 397 if ( ! transUnit ) { 398 // early state 399 // as if `size_t` in program text were freshly parsed 400 return zd_abstract; 401 } else if ( transUnit->global.sizeType ) { 402 // late state, normal run 403 // whatever size_t was defined as 404 return transUnit->global.sizeType; 405 } else { 406 // late state, no prelude (-n) 407 // placeholder: cfa-cpp is being used experimentally, stay out of the way 408 return ld_concrete; 409 } 410 } 411 412 386 413 } // namespace ast -
src/AST/Util.hpp
r54cd1a51 r4d5c5b6a 26 26 void checkInvariants( TranslationUnit & ); 27 27 28 /// Maintains an AST-module state for contextual information needed in 29 /// ast::* implementations, notably constructors: 30 /// early: while parsing, use bootstrap versions 31 /// late: once a whole TranslationUnit exists, use its answers 32 /// When the program is in the later state, ast::* construcors effectively get 33 /// the benefit of WithTranslationUnit, without having to pass them one. 34 class TranslationDeps { 35 36 TranslationDeps() = delete; 37 38 friend class SizeofExpr; 39 friend class AlignofExpr; 40 friend class CountofExpr; 41 friend class OffsetofExpr; 42 friend class OffsetPackExpr; 43 44 /// Appropriate return type for built-in expressions that report on sizes 45 static const Type * getSizeType(); 46 47 public: 48 /// Transition from early to late states 49 static void evolve( TranslationUnit & ); 50 }; 51 28 52 } -
src/ResolvExpr/CandidateFinder.cpp
r54cd1a51 r4d5c5b6a 1486 1486 1487 1487 void Finder::postvisit( const ast::SizeofExpr * sizeofExpr ) { 1488 const ast::Type * type = resolveTypeof( sizeofExpr->type, context );1489 const ast::Type * sizeType = context.global.sizeType.get();1490 1488 addCandidate( 1491 new ast::SizeofExpr( sizeofExpr->location, type, sizeType ), 1492 tenv ); 1493 } 1494 1495 void Finder::postvisit( const ast::AlignofExpr * alignofExpr ) { 1496 const ast::Type * type = resolveTypeof( alignofExpr->type, context ); 1497 const ast::Type * sizeType = context.global.sizeType.get(); 1498 addCandidate( 1499 new ast::AlignofExpr( alignofExpr->location, type, sizeType ), 1489 new ast::SizeofExpr{ 1490 sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) }, 1500 1491 tenv ); 1501 1492 } … … 1525 1516 } 1526 1517 1518 void Finder::postvisit( const ast::AlignofExpr * alignofExpr ) { 1519 addCandidate( 1520 new ast::AlignofExpr{ 1521 alignofExpr->location, resolveTypeof( alignofExpr->type, context ) }, 1522 tenv ); 1523 } 1524 1527 1525 void Finder::postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) { 1528 1526 const ast::BaseInstType * aggInst; … … 1531 1529 else return; 1532 1530 1533 const ast::Type * sizeType = context.global.sizeType.get();1534 1531 for ( const ast::Decl * member : aggInst->lookup( offsetofExpr->member ) ) { 1535 1532 auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( member ); 1536 1533 addCandidate( 1537 new ast::OffsetofExpr ( offsetofExpr->location, aggInst, dwt, sizeType ), tenv );1534 new ast::OffsetofExpr{ offsetofExpr->location, aggInst, dwt }, tenv ); 1538 1535 } 1539 1536 } -
src/main.cpp
r54cd1a51 r4d5c5b6a 199 199 Stats::Time::StopBlock(); 200 200 201 ast::TranslationDeps::evolve( transUnit ); 202 201 203 PASS( "Hoist Type Decls", Validate::hoistTypeDecls, transUnit ); 202 204 -
tests/.expect/alloc-ERROR.arm64.txt
r54cd1a51 r4d5c5b6a 16 16 Name: stp 17 17 18 ... with resolved type: 19 unsigned long int 18 20 19 21 -
tests/.expect/alloc-ERROR.x64.txt
r54cd1a51 r4d5c5b6a 16 16 Name: stp 17 17 18 ... with resolved type: 19 unsigned long int 18 20 19 21 -
tests/.expect/alloc-ERROR.x86.txt
r54cd1a51 r4d5c5b6a 16 16 Name: stp 17 17 18 ... with resolved type: 19 unsigned int 18 20 19 21
Note:
See TracChangeset
for help on using the changeset viewer.