Changeset 54cd1a51
- Timestamp:
- Feb 11, 2025, 6:08:19 PM (7 months ago)
- Branches:
- master
- Children:
- 502ff9e, a8404d9
- Parents:
- 4d5c5b6a (diff), 691bf0a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.cpp
r4d5c5b6a r54cd1a51 26 26 #include "Stmt.hpp" 27 27 #include "Type.hpp" 28 #include "Util.hpp" // for TranslationDeps29 28 #include "TypeSubstitution.hpp" 30 29 #include "Common/Utility.hpp" … … 281 280 // --- SizeofExpr 282 281 283 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * t ) 284 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {} 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 ) {} 285 287 286 288 // --- AlignofExpr 287 289 288 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t ) 289 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {} 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 ) {} 290 295 291 296 // --- CountofExpr 292 297 293 298 CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t ) 294 : Expr( loc , ast::TranslationDeps::getSizeType()), type( t ) {}299 : Expr( loc ), type( t ) {} 295 300 296 301 // --- OffsetofExpr 297 302 298 303 OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem ) 299 : Expr( loc, ast::TranslationDeps::getSizeType() ), type( ty ), member( 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 ) { 300 308 assert( type ); 301 309 assert( member ); … … 305 313 306 314 OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty ) 307 : Expr( loc, new ArrayType{ 308 ast::TranslationDeps::getSizeType(), nullptr, FixedLen, DynamicDim } 309 ), type( ty ) { 315 : Expr( loc ), type( ty ) { 310 316 assert( type ); 311 317 } -
src/AST/Expr.hpp
r4d5c5b6a r54cd1a51 483 483 484 484 SizeofExpr( const CodeLocation & loc, const Type * t ); 485 SizeofExpr( const CodeLocation & loc, const Type * t, const Type * r ); 485 486 486 487 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } … … 496 497 497 498 AlignofExpr( const CodeLocation & loc, const Type * t ); 499 AlignofExpr( const CodeLocation & loc, const Type * t, const Type * r ); 498 500 499 501 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } … … 538 540 539 541 OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem ); 542 OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res ); 540 543 541 544 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } -
src/AST/Util.cpp
r4d5c5b6a r54cd1a51 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 state399 // as if `size_t` in program text were freshly parsed400 return zd_abstract;401 } else if ( transUnit->global.sizeType ) {402 // late state, normal run403 // whatever size_t was defined as404 return transUnit->global.sizeType;405 } else {406 // late state, no prelude (-n)407 // placeholder: cfa-cpp is being used experimentally, stay out of the way408 return ld_concrete;409 }410 }411 412 413 386 } // namespace ast -
src/AST/Util.hpp
r4d5c5b6a r54cd1a51 26 26 void checkInvariants( TranslationUnit & ); 27 27 28 /// Maintains an AST-module state for contextual information needed in29 /// ast::* implementations, notably constructors:30 /// early: while parsing, use bootstrap versions31 /// late: once a whole TranslationUnit exists, use its answers32 /// When the program is in the later state, ast::* construcors effectively get33 /// 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 sizes45 static const Type * getSizeType();46 47 public:48 /// Transition from early to late states49 static void evolve( TranslationUnit & );50 };51 52 28 } -
src/ResolvExpr/CandidateFinder.cpp
r4d5c5b6a r54cd1a51 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(); 1488 1490 addCandidate( 1489 new ast::SizeofExpr{ 1490 sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) }, 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 ), 1491 1500 tenv ); 1492 1501 } … … 1516 1525 } 1517 1526 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 1525 1527 void Finder::postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) { 1526 1528 const ast::BaseInstType * aggInst; … … 1529 1531 else return; 1530 1532 1533 const ast::Type * sizeType = context.global.sizeType.get(); 1531 1534 for ( const ast::Decl * member : aggInst->lookup( offsetofExpr->member ) ) { 1532 1535 auto dwt = strict_dynamic_cast< const ast::DeclWithType * >( member ); 1533 1536 addCandidate( 1534 new ast::OffsetofExpr { offsetofExpr->location, aggInst, dwt }, tenv );1537 new ast::OffsetofExpr( offsetofExpr->location, aggInst, dwt, sizeType ), tenv ); 1535 1538 } 1536 1539 } -
src/main.cpp
r4d5c5b6a r54cd1a51 199 199 Stats::Time::StopBlock(); 200 200 201 ast::TranslationDeps::evolve( transUnit );202 203 201 PASS( "Hoist Type Decls", Validate::hoistTypeDecls, transUnit ); 204 202 -
tests/.expect/alloc-ERROR.arm64.txt
r4d5c5b6a r54cd1a51 16 16 Name: stp 17 17 18 ... with resolved type:19 unsigned long int20 18 21 19 -
tests/.expect/alloc-ERROR.x64.txt
r4d5c5b6a r54cd1a51 16 16 Name: stp 17 17 18 ... with resolved type:19 unsigned long int20 18 21 19 -
tests/.expect/alloc-ERROR.x86.txt
r4d5c5b6a r54cd1a51 16 16 Name: stp 17 17 18 ... with resolved type:19 unsigned int20 18 21 19
Note:
See TracChangeset
for help on using the changeset viewer.