@@ -629,6 +629,80 @@ contract Recursive_Ok is Parent {
629629 }
630630}
631631
632+ // ==== Omitting validations of *_unchained for non-parent contracts ====
633+
634+ contract Parent_With_Unchained is Initializable {
635+ uint64 x;
636+ function __Parent_init () onlyInitializing internal {
637+ __Parent_init_unchained ();
638+ }
639+
640+ function __Parent_init_unchained () onlyInitializing internal {
641+ x = 1 ;
642+ }
643+ }
644+
645+ contract Child_With_Unchained_Ok is Initializable , Parent_With_Unchained {
646+ uint64 y;
647+ function __Child_init () onlyInitializing internal {
648+ __Parent_init_unchained ();
649+ __Child_init_unchained ();
650+ }
651+
652+ function __Child_init_unchained () onlyInitializing internal {
653+ y = 1 ;
654+ }
655+ }
656+
657+ contract Child_Missing_Parent_Unchained_Call_Bad is Initializable , Parent_With_Unchained {
658+ uint64 y;
659+ function __Child_init () onlyInitializing internal {
660+ // missing call to __Parent_init_unchained
661+ __Child_init_unchained ();
662+ }
663+
664+ function __Child_init_unchained () onlyInitializing internal {
665+ y = 1 ;
666+ }
667+ }
668+
669+ contract Child_Duplicate_Parent_Unchained_Call_Bad is Initializable , Parent_With_Unchained {
670+ uint64 y;
671+ function __Child_init () onlyInitializing internal {
672+ __Parent_init_unchained ();
673+ __Parent_init_unchained ();
674+ __Child_init_unchained ();
675+ }
676+
677+ function __Child_init_unchained () onlyInitializing internal {
678+ y = 1 ;
679+ }
680+ }
681+
682+ contract Parent2_With_Unchained is Initializable {
683+ uint64 x2;
684+ function __Parent2_init () onlyInitializing internal {
685+ __Parent2_init_unchained ();
686+ }
687+
688+ function __Parent2_init_unchained () onlyInitializing internal {
689+ x2 = 1 ;
690+ }
691+ }
692+
693+ contract Child_Wrong_Order_Parent_Unchained_Call_Warning is Initializable , Parent_With_Unchained , Parent2_With_Unchained {
694+ uint64 y;
695+ function __Child_init () onlyInitializing internal {
696+ __Child_init_unchained ();
697+ __Parent2_init_unchained ();
698+ __Parent_init_unchained ();
699+ }
700+
701+ function __Child_init_unchained () onlyInitializing internal {
702+ y = 1 ;
703+ }
704+ }
705+
632706// ==== Complex ERC20 examples ====
633707
634708contract ERC20_Ok is Initializable , ERC20Upgradeable , ERC20BurnableUpgradeable , ERC20PausableUpgradeable , OwnableUpgradeable , ERC20PermitUpgradeable , ERC20FlashMintUpgradeable , UUPSUpgradeable {
0 commit comments