@@ -439,6 +439,16 @@ type optionalPtrField struct {
439
439
B * [3 ]byte `rlp:"optional"`
440
440
}
441
441
442
+ type nonOptionalPtrField struct {
443
+ A uint
444
+ B * [3 ]byte
445
+ }
446
+
447
+ type multipleOptionalFields struct {
448
+ A * [3 ]byte `rlp:"optional"`
449
+ B * [3 ]byte `rlp:"optional"`
450
+ }
451
+
442
452
type optionalPtrFieldNil struct {
443
453
A uint
444
454
B * [3 ]byte `rlp:"optional,nil"`
@@ -744,6 +754,30 @@ var decodeTests = []decodeTest{
744
754
ptr : new (optionalPtrField ),
745
755
value : optionalPtrField {A : 1 , B : & [3 ]byte {1 , 2 , 3 }},
746
756
},
757
+ {
758
+ // all optional fields nil
759
+ input : "C0" ,
760
+ ptr : new (multipleOptionalFields ),
761
+ value : multipleOptionalFields {A : nil , B : nil },
762
+ },
763
+ {
764
+ // all optional fields set
765
+ input : "C88301020383010203" ,
766
+ ptr : new (multipleOptionalFields ),
767
+ value : multipleOptionalFields {A : & [3 ]byte {1 , 2 , 3 }, B : & [3 ]byte {1 , 2 , 3 }},
768
+ },
769
+ {
770
+ // nil optional field appears before a non-nil one
771
+ input : "C58083010203" ,
772
+ ptr : new (multipleOptionalFields ),
773
+ error : "rlp: input string too short for [3]uint8, decoding into (rlp.multipleOptionalFields).A" ,
774
+ },
775
+ {
776
+ // decode a nil ptr into a ptr that is not nil or not optional
777
+ input : "C20180" ,
778
+ ptr : new (nonOptionalPtrField ),
779
+ error : "rlp: input string too short for [3]uint8, decoding into (rlp.nonOptionalPtrField).B" ,
780
+ },
747
781
{
748
782
input : "C101" ,
749
783
ptr : new (optionalPtrFieldNil ),
0 commit comments