|
1 | 1 | use crate::c_ast::c_decl::{CDeclId, CDeclKind, CFieldId}; |
2 | 2 | use crate::c_ast::c_stmt::CStmtId; |
3 | 3 | use crate::c_ast::c_type::{CQualTypeId, CTypeId, CTypeKind}; |
4 | | -use crate::c_ast::{Located, TypedAstContext}; |
| 4 | +use crate::c_ast::{Located, SomeId, TypedAstContext}; |
5 | 5 | use c2rust_ast_exporter::clang_ast::LRValue; |
6 | 6 | use std::fmt::{self, Debug, Display}; |
7 | 7 | use std::ops::Index; |
@@ -540,6 +540,164 @@ pub enum Designator { |
540 | 540 | } |
541 | 541 |
|
542 | 542 | impl TypedAstContext { |
| 543 | + pub(super) fn add_expr_parents(&mut self, id: CExprId, kind: &CExprKind) { |
| 544 | + use CExprKind::*; |
| 545 | + let parent = SomeId::Expr(id); |
| 546 | + |
| 547 | + match *kind { |
| 548 | + Literal(..) => {} |
| 549 | + |
| 550 | + Unary(_, _, expr, _) => { |
| 551 | + self.add_parent(expr, parent); |
| 552 | + } |
| 553 | + |
| 554 | + UnaryType(_, _, expr, _) => { |
| 555 | + if let Some(expr) = expr { |
| 556 | + self.add_parent(expr, parent); |
| 557 | + } |
| 558 | + } |
| 559 | + |
| 560 | + OffsetOf(_, ref kind) => match *kind { |
| 561 | + OffsetOfKind::Constant(..) => {} |
| 562 | + OffsetOfKind::Variable(_, _, expr) => { |
| 563 | + self.add_parent(expr, parent); |
| 564 | + } |
| 565 | + }, |
| 566 | + |
| 567 | + Binary(_, _, lhs, rhs, _, _) => { |
| 568 | + self.add_parent(lhs, parent); |
| 569 | + self.add_parent(rhs, parent); |
| 570 | + } |
| 571 | + |
| 572 | + ImplicitCast(_, expr, _, _, _) => { |
| 573 | + self.add_parent(expr, parent); |
| 574 | + } |
| 575 | + |
| 576 | + ExplicitCast(_, expr, _, _, _) => { |
| 577 | + self.add_parent(expr, parent); |
| 578 | + } |
| 579 | + |
| 580 | + ConstantExpr(_, expr, _) => { |
| 581 | + self.add_parent(expr, parent); |
| 582 | + } |
| 583 | + |
| 584 | + DeclRef(..) => {} |
| 585 | + |
| 586 | + Call(_, func, ref args) => { |
| 587 | + self.add_parent(func, parent); |
| 588 | + |
| 589 | + for &arg in args { |
| 590 | + self.add_parent(arg, parent); |
| 591 | + } |
| 592 | + } |
| 593 | + |
| 594 | + Member(_, expr, _, _, _) => { |
| 595 | + self.add_parent(expr, parent); |
| 596 | + } |
| 597 | + |
| 598 | + ArraySubscript(_, lhs, rhs, _) => { |
| 599 | + self.add_parent(lhs, parent); |
| 600 | + self.add_parent(rhs, parent); |
| 601 | + } |
| 602 | + |
| 603 | + Conditional(_, cond, lhs, rhs) => { |
| 604 | + self.add_parent(cond, parent); |
| 605 | + self.add_parent(lhs, parent); |
| 606 | + self.add_parent(rhs, parent); |
| 607 | + } |
| 608 | + |
| 609 | + BinaryConditional(_, cond, rhs) => { |
| 610 | + self.add_parent(cond, parent); |
| 611 | + self.add_parent(rhs, parent); |
| 612 | + } |
| 613 | + |
| 614 | + InitList(_, ref exprs, _, syntactic_form) => { |
| 615 | + for &expr in exprs { |
| 616 | + self.add_parent(expr, parent); |
| 617 | + } |
| 618 | + |
| 619 | + if let Some(syntactic_form) = syntactic_form { |
| 620 | + self.add_parent(syntactic_form, parent); |
| 621 | + } |
| 622 | + } |
| 623 | + |
| 624 | + ImplicitValueInit(..) => {} |
| 625 | + |
| 626 | + Paren(_, expr) => { |
| 627 | + self.add_parent(expr, parent); |
| 628 | + } |
| 629 | + |
| 630 | + CompoundLiteral(_, expr) => { |
| 631 | + self.add_parent(expr, parent); |
| 632 | + } |
| 633 | + |
| 634 | + Predefined(_, expr) => { |
| 635 | + self.add_parent(expr, parent); |
| 636 | + } |
| 637 | + |
| 638 | + Statements(_, stmt) => { |
| 639 | + self.add_parent(stmt, parent); |
| 640 | + } |
| 641 | + |
| 642 | + VAArg(_, expr) => { |
| 643 | + self.add_parent(expr, parent); |
| 644 | + } |
| 645 | + |
| 646 | + ShuffleVector(_, ref exprs) => { |
| 647 | + for &expr in exprs { |
| 648 | + self.add_parent(expr, parent); |
| 649 | + } |
| 650 | + } |
| 651 | + |
| 652 | + ConvertVector(_, ref exprs) => { |
| 653 | + for &expr in exprs { |
| 654 | + self.add_parent(expr, parent); |
| 655 | + } |
| 656 | + } |
| 657 | + |
| 658 | + DesignatedInitExpr(_, _, expr) => { |
| 659 | + self.add_parent(expr, parent); |
| 660 | + } |
| 661 | + |
| 662 | + Choose(_, cond, lhs, rhs, _) => { |
| 663 | + self.add_parent(cond, parent); |
| 664 | + self.add_parent(lhs, parent); |
| 665 | + self.add_parent(rhs, parent); |
| 666 | + } |
| 667 | + |
| 668 | + Atomic { |
| 669 | + ptr, |
| 670 | + order, |
| 671 | + val1, |
| 672 | + order_fail, |
| 673 | + val2, |
| 674 | + weak, |
| 675 | + .. |
| 676 | + } => { |
| 677 | + self.add_parent(ptr, parent); |
| 678 | + self.add_parent(order, parent); |
| 679 | + |
| 680 | + if let Some(val1) = val1 { |
| 681 | + self.add_parent(val1, parent); |
| 682 | + } |
| 683 | + |
| 684 | + if let Some(order_fail) = order_fail { |
| 685 | + self.add_parent(order_fail, parent); |
| 686 | + } |
| 687 | + |
| 688 | + if let Some(val2) = val2 { |
| 689 | + self.add_parent(val2, parent); |
| 690 | + } |
| 691 | + |
| 692 | + if let Some(weak) = weak { |
| 693 | + self.add_parent(weak, parent); |
| 694 | + } |
| 695 | + } |
| 696 | + |
| 697 | + BadExpr => {} |
| 698 | + } |
| 699 | + } |
| 700 | + |
543 | 701 | pub fn is_null_expr(&self, expr_id: CExprId) -> bool { |
544 | 702 | use CExprKind::*; |
545 | 703 | match self[expr_id].kind { |
|
0 commit comments