Changeset 857b5f9
- Timestamp:
- Jan 23, 2025, 12:09:40 PM (3 months ago)
- Branches:
- master
- Children:
- 9e72bae3
- Parents:
- 829821c
- Location:
- src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/AST/Expr.cpp ¶
r829821c r857b5f9 283 283 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( t ) {} 284 284 285 // --- CountExpr286 287 CountExpr::CountExpr( const CodeLocation & loc, const Expr * e )288 : Expr( loc, new BasicType( BasicKind::LongUnsignedInt) ), expr(e), type( nullptr ) {}289 290 CountExpr::CountExpr( const CodeLocation & loc, const Type * t )291 : Expr( loc, new BasicType( BasicKind::LongUnsignedInt) ), expr(nullptr), type( t ) {}292 293 285 // --- AlignofExpr 294 286 295 287 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t ) 296 288 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( t ) {} 289 290 // --- CountofExpr 291 292 CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t ) 293 : Expr( loc, new BasicType( BasicKind::LongUnsignedInt) ), type( t ) {} 297 294 298 295 // --- OffsetofExpr -
TabularUnified src/AST/Expr.hpp ¶
r829821c r857b5f9 490 490 }; 491 491 492 class CountExpr final : public Expr {493 public:494 ptr<Expr> expr;495 ptr<Type> type;496 497 CountExpr( const CodeLocation & loc, const Expr * t );498 CountExpr( const CodeLocation & loc, const Type * t );499 500 const Expr * accept( Visitor & v )const override { return v.visit( this ); }501 private:502 CountExpr * clone() const override { return new CountExpr( *this ); }503 MUTATE_FRIEND504 };505 506 492 /// alignof expression, e.g. `alignof(int)`, `alignof 3+4` 507 493 class AlignofExpr final : public Expr { … … 514 500 private: 515 501 AlignofExpr * clone() const override { return new AlignofExpr{ *this }; } 502 MUTATE_FRIEND 503 }; 504 505 /// countof expression, e.g. `countof(AnEnum)`, `countof pred(Head)` 506 class CountofExpr final : public Expr { 507 public: 508 ptr<Type> type; 509 510 CountofExpr( const CodeLocation & loc, const Type * t ); 511 512 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } 513 private: 514 CountofExpr * clone() const override { return new CountofExpr( *this ); } 516 515 MUTATE_FRIEND 517 516 }; -
TabularUnified src/AST/Fwd.hpp ¶
r829821c r857b5f9 86 86 class ConstantExpr; 87 87 class SizeofExpr; 88 class CountExpr;89 88 class AlignofExpr; 89 class CountofExpr; 90 90 class UntypedOffsetofExpr; 91 91 class OffsetofExpr; -
TabularUnified src/AST/Pass.hpp ¶
r829821c r857b5f9 173 173 const ast::Expr * visit( const ast::ConstantExpr * ) override final; 174 174 const ast::Expr * visit( const ast::SizeofExpr * ) override final; 175 const ast::Expr * visit( const ast::CountExpr * ) override final;176 175 const ast::Expr * visit( const ast::AlignofExpr * ) override final; 176 const ast::Expr * visit( const ast::CountofExpr * ) override final; 177 177 const ast::Expr * visit( const ast::UntypedOffsetofExpr * ) override final; 178 178 const ast::Expr * visit( const ast::OffsetofExpr * ) override final; -
TabularUnified src/AST/Pass.impl.hpp ¶
r829821c r857b5f9 1350 1350 1351 1351 //-------------------------------------------------------------------------- 1352 // CountExpr1353 template< typename core_t >1354 const ast::Expr * ast::Pass< core_t >::visit( const ast::CountExpr * node ) {1355 VISIT_START( node );1356 if ( __visit_children() ) {1357 {1358 guard_symtab guard { *this };1359 maybe_accept( node, &CountExpr::result );1360 }1361 if ( node->type ) {1362 maybe_accept( node, &CountExpr::type );1363 } else {1364 maybe_accept( node, &CountExpr::expr );1365 }1366 }1367 VISIT_END( Expr, node );1368 }1369 1370 //--------------------------------------------------------------------------1371 1352 // AlignofExpr 1372 1353 template< typename core_t > … … 1380 1361 } 1381 1362 maybe_accept( node, &AlignofExpr::type ); 1363 } 1364 1365 VISIT_END( Expr, node ); 1366 } 1367 1368 //-------------------------------------------------------------------------- 1369 // CountofExpr 1370 template< typename core_t > 1371 const ast::Expr * ast::Pass< core_t >::visit( const ast::CountofExpr * node ) { 1372 VISIT_START( node ); 1373 1374 if ( __visit_children() ) { 1375 { 1376 guard_symtab guard { *this }; 1377 maybe_accept( node, &CountofExpr::result ); 1378 } 1379 maybe_accept( node, &CountofExpr::type ); 1382 1380 } 1383 1381 -
TabularUnified src/AST/Print.cpp ¶
r829821c r857b5f9 1207 1207 } 1208 1208 1209 virtual const ast::Expr * visit( const ast::Count Expr * node ) override final {1209 virtual const ast::Expr * visit( const ast::CountofExpr * node ) override final { 1210 1210 os << "Count Expression on: "; 1211 1211 ++indent; 1212 if ( node->type ) node->type->accept( *this ); 1213 else safe_print( node->expr ); 1212 safe_print( node->type ); 1214 1213 --indent; 1215 1214 postprint( node ); -
TabularUnified src/AST/Visitor.hpp ¶
r829821c r857b5f9 76 76 virtual const ast::Expr * visit( const ast::ConstantExpr * ) = 0; 77 77 virtual const ast::Expr * visit( const ast::SizeofExpr * ) = 0; 78 virtual const ast::Expr * visit( const ast::CountExpr * ) = 0;79 78 virtual const ast::Expr * visit( const ast::AlignofExpr * ) = 0; 79 virtual const ast::Expr * visit( const ast::CountofExpr * ) = 0; 80 80 virtual const ast::Expr * visit( const ast::UntypedOffsetofExpr * ) = 0; 81 81 virtual const ast::Expr * visit( const ast::OffsetofExpr * ) = 0; -
TabularUnified src/Common/CodeLocationTools.cpp ¶
r829821c r857b5f9 154 154 macro(ConstantExpr, Expr) \ 155 155 macro(SizeofExpr, Expr) \ 156 macro(CountExpr, Expr ) \157 156 macro(AlignofExpr, Expr) \ 157 macro(CountofExpr, Expr ) \ 158 158 macro(UntypedOffsetofExpr, Expr) \ 159 159 macro(OffsetofExpr, Expr) \ -
TabularUnified src/Parser/parser.yy ¶
r829821c r857b5f9 946 946 } 947 947 | COUNTOF unary_expression 948 { $$ = new ExpressionNode( new ast::Count Expr( yylloc, maybeMoveBuild( $2) ) ); }948 { $$ = new ExpressionNode( new ast::CountofExpr( yylloc, new ast::TypeofType( maybeMoveBuild( $2 ) ) ) ); } 949 949 | COUNTOF '(' type_no_function ')' 950 { $$ = new ExpressionNode( new ast::Count Expr( yylloc, maybeMoveBuildType( $3 ) ) ); }950 { $$ = new ExpressionNode( new ast::CountofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); } 951 951 ; 952 952 -
TabularUnified src/ResolvExpr/CandidateFinder.cpp ¶
r829821c r857b5f9 672 672 void postvisit( const ast::SizeofExpr * sizeofExpr ); 673 673 void postvisit( const ast::AlignofExpr * alignofExpr ); 674 void postvisit( const ast::CountofExpr * countExpr ); 674 675 void postvisit( const ast::AddressExpr * addressExpr ); 675 676 void postvisit( const ast::LabelAddressExpr * labelExpr ); … … 697 698 void postvisit( const ast::UntypedInitExpr * initExpr ); 698 699 void postvisit( const ast::QualifiedNameExpr * qualifiedExpr ); 699 void postvisit( const ast::CountExpr * countExpr );700 700 701 701 void postvisit( const ast::InitExpr * ) { … … 941 941 } 942 942 } 943 944 943 945 944 /// Adds aggregate member interpretations … … 1269 1268 ? conversionCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env ) 1270 1269 : castCost( fromType, toType, cand->expr->get_lvalue(), symtab, cand->env ); 1271 1270 1272 1271 // Redefine enum cast 1273 1272 auto argAsEnum = fromType.as<ast::EnumInstType>(); … … 1493 1492 } 1494 1493 1495 void Finder::postvisit( const ast::CountExpr * countExpr ) { 1496 const ast::UntypedExpr * untyped = nullptr; 1497 if ( countExpr->type ) { 1498 auto enumInst = countExpr->type.as<ast::EnumInstType>(); 1499 if ( enumInst ) { 1500 addCandidate( ast::ConstantExpr::from_ulong(countExpr->location, enumInst->base->members.size()), tenv ); 1501 return; 1502 } 1503 auto untypedFirst = ast::UntypedExpr::createCall( countExpr->location, "lowerBound", {} ); 1504 auto castFirst = new ast::CastExpr( countExpr->location, untypedFirst , countExpr->type ); 1505 untyped = ast::UntypedExpr::createCall( 1506 countExpr->location, "Countof", { castFirst } 1507 ); 1508 } 1509 if (!untyped) untyped = ast::UntypedExpr::createCall( 1510 countExpr->location, "Countof", { countExpr->expr } 1494 void Finder::postvisit( const ast::CountofExpr * countExpr ) { 1495 if ( auto enumInst = countExpr->type.as<ast::EnumInstType>() ) { 1496 addCandidate( ast::ConstantExpr::from_ulong( countExpr->location, enumInst->base->members.size()), tenv ); 1497 return; 1498 } 1499 auto untypedFirst = ast::UntypedExpr::createCall( countExpr->location, "lowerBound", {} ); 1500 auto castFirst = new ast::CastExpr( countExpr->location, untypedFirst , countExpr->type ); 1501 const ast::UntypedExpr * untyped = ast::UntypedExpr::createCall( 1502 countExpr->location, "Countof", { castFirst } 1511 1503 ); 1512 1504 CandidateFinder finder( context, tenv ); … … 1514 1506 CandidateList winners = findMinCost( finder.candidates ); 1515 1507 if ( winners.size() == 0 ) { 1516 SemanticError( countExpr ->expr, "Countof is not implemented for operand: " );1517 } 1518 if ( winners.size() != 1519 SemanticError( countExpr ->expr, "Ambiguous expression in countof operand: " );1508 SemanticError( countExpr, "Countof is not implemented: " ); 1509 } 1510 if ( winners.size() != 1 ) { 1511 SemanticError( countExpr, "Ambiguous expression in countof: " ); 1520 1512 } 1521 1513 CandidateRef & choice = winners.front();
Note: See TracChangeset
for help on using the changeset viewer.