Changes in / [3d618a0:d93b813]
- Files:
-
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Expr.cpp
r3d618a0 rd93b813 276 276 // --- SizeofExpr 277 277 278 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Expr * e ) 279 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), expr( e ), type( nullptr ) {} 280 278 281 SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * t ) 279 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( t ) {}282 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), expr( nullptr ), type( t ) {} 280 283 281 284 // --- CountExpr … … 289 292 // --- AlignofExpr 290 293 294 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Expr * e ) 295 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), expr( e ), type( nullptr ) {} 296 291 297 AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t ) 292 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( t ) {}298 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), expr( nullptr ), type( t ) {} 293 299 294 300 // --- OffsetofExpr -
src/AST/Expr.hpp
r3d618a0 rd93b813 480 480 class SizeofExpr final : public Expr { 481 481 public: 482 ptr<Type> type;483 484 SizeofExpr( const CodeLocation & loc, const Type * t );485 486 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }487 private:488 SizeofExpr * clone() const override { return new SizeofExpr{ *this }; }489 MUTATE_FRIEND490 };491 492 class CountExpr final : public Expr {493 public:494 482 ptr<Expr> expr; 495 483 ptr<Type> type; 496 484 485 SizeofExpr( const CodeLocation & loc, const Expr * e ); 486 SizeofExpr( const CodeLocation & loc, const Type * t ); 487 // deliberately no disambiguating overload for nullptr_t 488 489 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } 490 private: 491 SizeofExpr * clone() const override { return new SizeofExpr{ *this }; } 492 MUTATE_FRIEND 493 }; 494 495 class CountExpr final : public Expr { 496 public: 497 ptr<Expr> expr; 498 ptr<Type> type; 499 497 500 CountExpr( const CodeLocation & loc, const Expr * t ); 498 501 CountExpr( const CodeLocation & loc, const Type * t ); … … 507 510 class AlignofExpr final : public Expr { 508 511 public: 512 ptr<Expr> expr; 509 513 ptr<Type> type; 510 514 515 AlignofExpr( const CodeLocation & loc, const Expr * e ); 511 516 AlignofExpr( const CodeLocation & loc, const Type * t ); 517 // deliberately no disambiguating overload for nullptr_t 512 518 513 519 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } -
src/AST/Pass.hpp
r3d618a0 rd93b813 342 342 /// set visit_children false of all child nodes should be ignored 343 343 struct WithShortCircuiting { 344 bool visit_children = true;344 bool visit_children; 345 345 }; 346 346 -
src/AST/Pass.impl.hpp
r3d618a0 rd93b813 1319 1319 maybe_accept( node, &SizeofExpr::result ); 1320 1320 } 1321 maybe_accept( node, &SizeofExpr::type ); 1321 if ( node->type ) { 1322 maybe_accept( node, &SizeofExpr::type ); 1323 } else { 1324 maybe_accept( node, &SizeofExpr::expr ); 1325 } 1322 1326 } 1323 1327 … … 1355 1359 maybe_accept( node, &AlignofExpr::result ); 1356 1360 } 1357 maybe_accept( node, &AlignofExpr::type ); 1361 if ( node->type ) { 1362 maybe_accept( node, &AlignofExpr::type ); 1363 } else { 1364 maybe_accept( node, &AlignofExpr::expr ); 1365 } 1358 1366 } 1359 1367 -
src/AST/Print.cpp
r3d618a0 rd93b813 1152 1152 os << "Sizeof Expression on: "; 1153 1153 ++indent; 1154 node->type->accept( *this ); 1154 if ( node->type ) node->type->accept( *this ); 1155 else safe_print( node->expr ); 1155 1156 --indent; 1156 1157 postprint( node ); … … 1172 1173 os << "Alignof Expression on: "; 1173 1174 ++indent; 1174 node->type->accept( *this ); 1175 if ( node->type ) node->type->accept( *this ); 1176 else safe_print( node->expr ); 1175 1177 --indent; 1176 1178 postprint( node ); -
src/AST/Util.cpp
r3d618a0 rd93b813 104 104 } 105 105 assertf( false, "Member not found." ); 106 } 107 108 template<typename node_t> 109 void oneOfExprOrType( const node_t * node ) { 110 if ( node->expr ) { 111 assertf( node->expr && !node->type, "Exactly one of expr or type should be set." ); 112 } else { 113 assertf( !node->expr && node->type, "Exactly one of expr or type should be set." ); 114 } 106 115 } 107 116 … … 150 159 previsit( (const ParseNode *)node ); 151 160 memberMatchesAggregate( node ); 161 } 162 163 void previsit( const SizeofExpr * node ) { 164 previsit( (const ParseNode *)node ); 165 oneOfExprOrType( node ); 166 } 167 168 void previsit( const AlignofExpr * node ) { 169 previsit( (const ParseNode *)node ); 170 oneOfExprOrType( node ); 152 171 } 153 172 -
src/CodeGen/CodeGenerator.cpp
r3d618a0 rd93b813 744 744 extension( expr ); 745 745 output << "sizeof("; 746 if ( auto type = expr->type.as<ast::TypeofType>() ) { 747 type->expr->accept( *visitor ); 748 } else { 746 if ( expr->type ) { 749 747 output << genType( expr->type, "", options ); 748 } else { 749 expr->expr->accept( *visitor ); 750 750 } 751 751 output << ")"; … … 756 756 extension( expr ); 757 757 output << "__alignof__("; 758 if ( auto type = expr->type.as<ast::TypeofType>() ) { 759 type->expr->accept( *visitor ); 760 } else { 758 if ( expr->type ) { 761 759 output << genType( expr->type, "", options ); 760 } else { 761 expr->expr->accept( *visitor ); 762 762 } 763 763 output << ")"; -
src/Concurrency/Waitfor.cpp
r3d618a0 rd93b813 230 230 ast::ConstantExpr::from_int( location, 0 ), 231 231 new ast::SizeofExpr( location, 232 new ast::TypeofType( 233 new ast::VariableExpr( location, acceptables ) ) ), 232 new ast::VariableExpr( location, acceptables ) ), 234 233 } 235 234 ); -
src/GenPoly/Box.cpp
r3d618a0 rd93b813 1925 1925 ast::Expr const * PolyGenericCalculator::postvisit( 1926 1926 ast::SizeofExpr const * expr ) { 1927 ast::Expr const * gen = genSizeof( expr->location, expr->type ); 1927 ast::Type const * type = expr->type ? expr->type : expr->expr->result; 1928 ast::Expr const * gen = genSizeof( expr->location, type ); 1928 1929 return ( gen ) ? gen : expr; 1929 1930 } … … 1931 1932 ast::Expr const * PolyGenericCalculator::postvisit( 1932 1933 ast::AlignofExpr const * expr ) { 1933 ast::Expr const * gen = genAlignof( expr->location, expr->type ); 1934 ast::Type const * type = expr->type ? expr->type : expr->expr->result; 1935 ast::Expr const * gen = genAlignof( expr->location, type ); 1934 1936 return ( gen ) ? gen : expr; 1935 1937 } -
src/GenPoly/GenPoly.cpp
r3d618a0 rd93b813 299 299 ast::SizeofExpr const * r = as<ast::SizeofExpr>(rhs); 300 300 301 assert( l->type ); 302 assert( r->type ); 301 assert((l->type != nullptr) ^ (l->expr != nullptr)); 302 assert((r->type != nullptr) ^ (r->expr != nullptr)); 303 if ( !(l->type && r->type) ) return false; 303 304 304 305 // mutual recursion with type poly compatibility -
src/GenPoly/Lvalue.cpp
r3d618a0 rd93b813 607 607 ast::SizeofExpr const * ReferenceTypeElimination::previsit( 608 608 ast::SizeofExpr const * expr ) { 609 if ( expr->expr ) return expr; 609 610 return ast::mutate_field( expr, &ast::SizeofExpr::type, 610 611 expr->type->stripReferences() ); … … 613 614 ast::AlignofExpr const * ReferenceTypeElimination::previsit( 614 615 ast::AlignofExpr const * expr ) { 616 if ( expr->expr ) return expr; 615 617 return ast::mutate_field( expr, &ast::AlignofExpr::type, 616 618 expr->type->stripReferences() ); -
src/Parser/StatementNode.cpp
r3d618a0 rd93b813 11 11 // Created On : Sat May 16 14:59:41 2015 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Mon Sep 9 11:28:07 202414 // Update Count : 4 3013 // Last Modified On : Fri Aug 11 11:44:15 2023 14 // Update Count : 429 15 15 // 16 16 … … 208 208 209 209 ast::Stmt * build_for( const CodeLocation & location, ForCtrl * forctl, StatementNode * stmt, StatementNode * else_ ) { 210 std::vector<ast::ptr<ast::Stmt>> astinit; // maybe empty210 std::vector<ast::ptr<ast::Stmt>> astinit; // maybe empty 211 211 buildMoveList( forctl->init, astinit ); 212 212 213 213 if ( forctl->range_over ) { 214 214 ast::Expr * range_over = maybeMoveBuild( forctl->range_over ); 215 auto kind = forctl->kind; // save before delete, used in return216 215 delete forctl; 217 216 return new ast::ForStmt( location, 218 217 std::move( astinit ), 219 range_over, kind == OperKinds::LEThan,218 range_over, forctl->kind == OperKinds::LEThan, 220 219 buildMoveSingle( stmt ), 221 220 buildMoveOptional( else_ ) -
src/Parser/TypeData.cpp
r3d618a0 rd93b813 1476 1476 } else if ( cur->has_enumeratorValue() ) { 1477 1477 ast::Expr * initValue; 1478 if ( ret->isCfa && ret->base ) { 1479 CodeLocation location = cur->enumeratorValue->location; 1480 initValue = new ast::CastExpr( location, maybeMoveBuild( cur->consume_enumeratorValue() ), ret->base ); 1478 if (ret->isCfa && ret->base) { 1479 initValue = new ast::CastExpr( cur->enumeratorValue->location, maybeMoveBuild( cur->consume_enumeratorValue() ), ret->base ); 1481 1480 } else { 1482 1481 initValue = maybeMoveBuild( cur->consume_enumeratorValue() ); -
src/Parser/parser.yy
r3d618a0 rd93b813 927 927 { $$ = new ExpressionNode( build_unary_val( yylloc, OperKinds::Decr, $2 ) ); } 928 928 | SIZEOF unary_expression 929 { $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, new ast::TypeofType( maybeMoveBuild( $2 )) ) ); }929 { $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, maybeMoveBuild( $2 ) ) ); } 930 930 | SIZEOF '(' type_no_function ')' 931 931 { $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); } 932 932 | ALIGNOF unary_expression // GCC, variable alignment 933 { $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, new ast::TypeofType( maybeMoveBuild( $2 )) ) ); }933 { $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuild( $2 ) ) ); } 934 934 | ALIGNOF '(' type_no_function ')' // GCC, type alignment 935 935 { $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); } -
src/ResolvExpr/CandidateFinder.cpp
r3d618a0 rd93b813 10 10 // Created On : Wed Jun 5 14:30:00 2019 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Sep 9 11:30:11202413 // Update Count : 512 // Last Modified On : Sat Jun 22 08:07:26 2024 13 // Update Count : 4 14 14 // 15 15 … … 1239 1239 CandidateList matches; 1240 1240 Cost minExprCost = Cost::infinity; 1241 //Cost minCastCost = Cost::infinity;1241 Cost minCastCost = Cost::infinity; 1242 1242 for ( CandidateRef & cand : finder.candidates ) { 1243 1243 ast::ptr< ast::Type > fromType = cand->expr->result; … … 1482 1482 1483 1483 void Finder::postvisit( const ast::SizeofExpr * sizeofExpr ) { 1484 addCandidate( 1485 new ast::SizeofExpr{ 1486 sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) }, 1487 tenv ); 1484 if ( sizeofExpr->type ) { 1485 addCandidate( 1486 new ast::SizeofExpr{ 1487 sizeofExpr->location, resolveTypeof( sizeofExpr->type, context ) }, 1488 tenv ); 1489 } else { 1490 // find all candidates for the argument to sizeof 1491 CandidateFinder finder( context, tenv ); 1492 finder.find( sizeofExpr->expr ); 1493 // find the lowest-cost candidate, otherwise ambiguous 1494 CandidateList winners = findMinCost( finder.candidates ); 1495 if ( winners.size() != 1 ) { 1496 SemanticError( 1497 sizeofExpr->expr.get(), "Ambiguous expression in sizeof operand: " ); 1498 } 1499 // return the lowest-cost candidate 1500 CandidateRef & choice = winners.front(); 1501 choice->expr = referenceToRvalueConversion( choice->expr, choice->cost ); 1502 choice->cost = Cost::zero; 1503 addCandidate( *choice, new ast::SizeofExpr{ sizeofExpr->location, choice->expr } ); 1504 } 1488 1505 } 1489 1506 … … 1520 1537 1521 1538 void Finder::postvisit( const ast::AlignofExpr * alignofExpr ) { 1522 addCandidate( 1523 new ast::AlignofExpr{ 1524 alignofExpr->location, resolveTypeof( alignofExpr->type, context ) }, 1525 tenv ); 1539 if ( alignofExpr->type ) { 1540 addCandidate( 1541 new ast::AlignofExpr{ 1542 alignofExpr->location, resolveTypeof( alignofExpr->type, context ) }, 1543 tenv ); 1544 } else { 1545 // find all candidates for the argument to alignof 1546 CandidateFinder finder( context, tenv ); 1547 finder.find( alignofExpr->expr ); 1548 // find the lowest-cost candidate, otherwise ambiguous 1549 CandidateList winners = findMinCost( finder.candidates ); 1550 if ( winners.size() != 1 ) { 1551 SemanticError( 1552 alignofExpr->expr.get(), "Ambiguous expression in alignof operand: " ); 1553 } 1554 // return the lowest-cost candidate 1555 CandidateRef & choice = winners.front(); 1556 choice->expr = referenceToRvalueConversion( choice->expr, choice->cost ); 1557 choice->cost = Cost::zero; 1558 addCandidate( 1559 *choice, new ast::AlignofExpr{ alignofExpr->location, choice->expr } ); 1560 } 1526 1561 } 1527 1562 -
src/ResolvExpr/ConversionCost.cpp
r3d618a0 rd93b813 192 192 193 193 Cost enumCastCost ( 194 const ast::EnumInstType * src, const ast::EnumInstType * dst, 194 const ast::EnumInstType * src, const ast::EnumInstType * dst, 195 195 const ast::SymbolTable & symtab, const ast::TypeEnvironment & env 196 196 ); … … 488 488 // (dst) src is safe is src is a subtype of dst, or dst {inline src, ...} 489 489 Cost enumCastCost ( 490 const ast::EnumInstType * src, const ast::EnumInstType * dst, 490 const ast::EnumInstType * src, const ast::EnumInstType * dst, 491 491 const ast::SymbolTable & symtab, const ast::TypeEnvironment & env 492 492 ) { -
src/ResolvExpr/Unify.cpp
r3d618a0 rd93b813 234 234 if ( !e2so ) return; 235 235 236 assert((e1->type != nullptr) ^ (e1->expr != nullptr)); 237 assert((e2so->type != nullptr) ^ (e2so->expr != nullptr)); 238 if ( !(e1->type && e2so->type) ) return; 239 236 240 // expression unification calls type unification (mutual recursion) 237 241 result = unifyExact( e1->type, e2so->type, tenv, need, have, open, widen ); -
src/Validate/InitializerLength.cpp
r3d618a0 rd93b813 29 29 /// int x[] = { 1, 2, 3 }; 30 30 /// int y[][2] = { { 1, 2, 3 }, { 1, 2, 3 } }; 31 /// char z[] = "hello";32 31 /// here x and y are known at compile-time to have length 3, so change this into 33 32 /// int x[3] = { 1, 2, 3 }; 34 33 /// int y[3][2] = { { 1, 2, 3 }, { 1, 2, 3 } }; 35 /// char z[6] = "hello";36 34 struct InitializerLength { 37 35 const ast::ObjectDecl * previsit( const ast::ObjectDecl * decl ); 38 36 }; 39 37 40 ast::ConstantExpr * makeDimension( const ast::ObjectDecl * decl ) {41 if ( auto init = decl->init.as<ast::ListInit>() ) {42 return ast::ConstantExpr::from_ulong( decl->location, init->size() );43 } else if ( auto init = decl->init.as<ast::SingleInit>() ) {44 if ( auto constant = init->value.as<ast::ConstantExpr>() ) {45 if ( auto type = constant->result.as<ast::ArrayType>() ) {46 if ( auto dim = type->dimension.as<ast::ConstantExpr>() ) {47 ast::ConstantExpr * dimension = ast::deepCopy( dim );48 dimension->location = decl->location;49 return dimension;50 }51 }52 }53 }54 return nullptr;55 }56 57 38 const ast::ObjectDecl * InitializerLength::previsit( const ast::ObjectDecl * decl ) { 58 39 if ( auto type = decl->type.as<ast::ArrayType>() ) { 59 40 if ( type->dimension ) return decl; 60 if ( auto dimension = makeDimension( decl) ) {41 if ( auto init = decl->init.as<ast::ListInit>() ) { 61 42 ast::ObjectDecl * mutDecl = ast::mutate( decl ); 62 43 ast::ArrayType * mutType = ast::mutate( type ); 63 mutType->dimension = dimension; 44 mutType->dimension = ast::ConstantExpr::from_ulong( 45 mutDecl->location, init->size() ); 64 46 mutDecl->type = mutType; 65 47 return mutDecl; -
tests/.expect/alloc-ERROR.txt
r3d618a0 rd93b813 11 11 ...to: 12 12 Name: dim 13 Sizeof Expression on: type-of expressionApplying untyped:13 Sizeof Expression on: Applying untyped: 14 14 Name: *? 15 15 ...to: -
tests/.expect/extension.arm64.txt
r3d618a0 rd93b813 465 465 } 466 466 { 467 ((void)__extension__ sizeof( signed int));467 ((void)__extension__ sizeof(3)); 468 468 } 469 469 … … 473 473 474 474 { 475 ((void)__extension__ __alignof__( signed int));475 ((void)__extension__ __alignof__(__extension__ _X1ai_2)); 476 476 } 477 477 -
tests/.expect/extension.x64.txt
r3d618a0 rd93b813 465 465 } 466 466 { 467 ((void)__extension__ sizeof( signed int));467 ((void)__extension__ sizeof(3)); 468 468 } 469 469 … … 473 473 474 474 { 475 ((void)__extension__ __alignof__( signed int));475 ((void)__extension__ __alignof__(__extension__ _X1ai_2)); 476 476 } 477 477 -
tests/.expect/extension.x86.txt
r3d618a0 rd93b813 465 465 } 466 466 { 467 ((void)__extension__ sizeof( signed int));467 ((void)__extension__ sizeof(3)); 468 468 } 469 469 … … 473 473 474 474 { 475 ((void)__extension__ __alignof__( signed int));475 ((void)__extension__ __alignof__(__extension__ _X1ai_2)); 476 476 } 477 477
Note: See TracChangeset
for help on using the changeset viewer.