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