@@ -26,11 +26,11 @@ function (string $size): void {
2626
2727function (string $ size ): void {
2828 if (preg_match_all ('/ab(?P<num>\d+)?/ ' , $ size , $ matches )) {
29- assertType ("array{0: list<string>, num: list<''|decimal-int-string>, 1: list<''|decimal-int-string>} " , $ matches );
29+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<''|decimal-int-string>, 1: non-empty- list<''|decimal-int-string>} " , $ matches );
3030 } else {
3131 assertType ("array{} " , $ matches );
3232 }
33- assertType ("array{}|array{0: list<string>, num: list<''|decimal-int-string>, 1: list<''|decimal-int-string>} " , $ matches );
33+ assertType ("array{}|array{0: non-empty- list<string>, num: non-empty- list<''|decimal-int-string>, 1: non-empty- list<''|decimal-int-string>} " , $ matches );
3434};
3535
3636function (string $ size ): void {
@@ -44,20 +44,20 @@ function (string $size): void {
4444
4545function (string $ size ): void {
4646 if (preg_match_all ('/ab(?P<num>\d+)?/ ' , $ size , $ matches ) != false ) {
47- assertType ("array{0: list<string>, num: list<''|decimal-int-string>, 1: list<''|decimal-int-string>} " , $ matches );
47+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<''|decimal-int-string>, 1: non-empty- list<''|decimal-int-string>} " , $ matches );
4848 } else {
4949 assertType ("array{} " , $ matches );
5050 }
51- assertType ("array{}|array{0: list<string>, num: list<''|decimal-int-string>, 1: list<''|decimal-int-string>} " , $ matches );
51+ assertType ("array{}|array{0: non-empty- list<string>, num: non-empty- list<''|decimal-int-string>, 1: non-empty- list<''|decimal-int-string>} " , $ matches );
5252};
5353
5454function (string $ size ): void {
5555 if (preg_match_all ('/ab(?P<num>\d+)?/ ' , $ size , $ matches ) == true ) {
56- assertType ("array{0: list<string>, num: list<''|decimal-int-string>, 1: list<''|decimal-int-string>} " , $ matches );
56+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<''|decimal-int-string>, 1: non-empty- list<''|decimal-int-string>} " , $ matches );
5757 } else {
5858 assertType ("array{} " , $ matches );
5959 }
60- assertType ("array{}|array{0: list<string>, num: list<''|decimal-int-string>, 1: list<''|decimal-int-string>} " , $ matches );
60+ assertType ("array{}|array{0: non-empty- list<string>, num: non-empty- list<''|decimal-int-string>, 1: non-empty- list<''|decimal-int-string>} " , $ matches );
6161};
6262
6363function (string $ size ): void {
@@ -76,61 +76,61 @@ function (string $size): void {
7676
7777function (string $ size ): void {
7878 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches )) {
79- assertType ("array{0: list<string>, num: list<decimal-int-string>, 1: list<decimal-int-string>, suffix: list<''|'ab'>, 2: list<''|'ab'>} " , $ matches );
79+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<decimal-int-string>, 1: non-empty- list<decimal-int-string>, suffix: non-empty- list<''|'ab'>, 2: non-empty- list<''|'ab'>} " , $ matches );
8080 }
8181};
8282
8383function (string $ size ): void {
8484 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_UNMATCHED_AS_NULL )) {
85- assertType ("array{0: list<string>, num: list<decimal-int-string>, 1: list<decimal-int-string>, suffix: list<'ab'|null>, 2: list<'ab'|null>} " , $ matches );
85+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<decimal-int-string>, 1: non-empty- list<decimal-int-string>, suffix: non-empty- list<'ab'|null>, 2: non-empty- list<'ab'|null>} " , $ matches );
8686 }
8787};
8888
8989function (string $ size ): void {
9090 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_SET_ORDER )) {
91- assertType ("list<array{0: string, num: decimal-int-string, 1: decimal-int-string, suffix?: 'ab', 2?: 'ab'}> " , $ matches );
91+ assertType ("non-empty- list<array{0: string, num: decimal-int-string, 1: decimal-int-string, suffix?: 'ab', 2?: 'ab'}> " , $ matches );
9292 }
9393};
9494
9595function (string $ size ): void {
9696 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_PATTERN_ORDER )) {
97- assertType ("array{0: list<string>, num: list<decimal-int-string>, 1: list<decimal-int-string>, suffix: list<''|'ab'>, 2: list<''|'ab'>} " , $ matches );
97+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<decimal-int-string>, 1: non-empty- list<decimal-int-string>, suffix: non-empty- list<''|'ab'>, 2: non-empty- list<''|'ab'>} " , $ matches );
9898 }
9999};
100100
101101function (string $ size ): void {
102102 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_UNMATCHED_AS_NULL |PREG_SET_ORDER )) {
103- assertType ("list<array{0: string, num: decimal-int-string, 1: decimal-int-string, suffix: 'ab'|null, 2: 'ab'|null}> " , $ matches );
103+ assertType ("non-empty- list<array{0: string, num: decimal-int-string, 1: decimal-int-string, suffix: 'ab'|null, 2: 'ab'|null}> " , $ matches );
104104 }
105105};
106106
107107function (string $ size ): void {
108108 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_UNMATCHED_AS_NULL |PREG_PATTERN_ORDER )) {
109- assertType ("array{0: list<string>, num: list<decimal-int-string>, 1: list<decimal-int-string>, suffix: list<'ab'|null>, 2: list<'ab'|null>} " , $ matches );
109+ assertType ("array{0: non-empty- list<string>, num: non-empty- list<decimal-int-string>, 1: non-empty- list<decimal-int-string>, suffix: non-empty- list<'ab'|null>, 2: non-empty- list<'ab'|null>} " , $ matches );
110110 }
111111};
112112
113113function (string $ size ): void {
114114 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_SET_ORDER |PREG_OFFSET_CAPTURE )) {
115- assertType ("list<array{0: array{string, int<-1, max>}, num: array{decimal-int-string, int<-1, max>}, 1: array{decimal-int-string, int<-1, max>}, suffix?: array{'ab', int<-1, max>}, 2?: array{'ab', int<-1, max>}}> " , $ matches );
115+ assertType ("non-empty- list<array{0: array{string, int<-1, max>}, num: array{decimal-int-string, int<-1, max>}, 1: array{decimal-int-string, int<-1, max>}, suffix?: array{'ab', int<-1, max>}, 2?: array{'ab', int<-1, max>}}> " , $ matches );
116116 }
117117};
118118
119119function (string $ size ): void {
120120 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_PATTERN_ORDER |PREG_OFFSET_CAPTURE )) {
121- assertType ("array{0: list<array{string, int<-1, max>}>, num: list<array{decimal-int-string, int<-1, max>}>, 1: list<array{decimal-int-string, int<-1, max>}>, suffix: list<array{''|'ab', int<-1, max>}>, 2: list<array{''|'ab', int<-1, max>}>} " , $ matches );
121+ assertType ("array{0: non-empty- list<array{string, int<-1, max>}>, num: non-empty- list<array{decimal-int-string, int<-1, max>}>, 1: non-empty- list<array{decimal-int-string, int<-1, max>}>, suffix: non-empty- list<array{''|'ab', int<-1, max>}>, 2: non-empty- list<array{''|'ab', int<-1, max>}>} " , $ matches );
122122 }
123123};
124124
125125function (string $ size ): void {
126126 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_UNMATCHED_AS_NULL |PREG_SET_ORDER |PREG_OFFSET_CAPTURE )) {
127- assertType ("list<array{0: array{string|null, int<-1, max>}, num: array{decimal-int-string|null, int<-1, max>}, 1: array{decimal-int-string|null, int<-1, max>}, suffix: array{'ab'|null, int<-1, max>}, 2: array{'ab'|null, int<-1, max>}}> " , $ matches );
127+ assertType ("non-empty- list<array{0: array{string|null, int<-1, max>}, num: array{decimal-int-string|null, int<-1, max>}, 1: array{decimal-int-string|null, int<-1, max>}, suffix: array{'ab'|null, int<-1, max>}, 2: array{'ab'|null, int<-1, max>}}> " , $ matches );
128128 }
129129};
130130
131131function (string $ size ): void {
132132 if (preg_match_all ('/ab(?P<num>\d+)(?P<suffix>ab)?/ ' , $ size , $ matches , PREG_UNMATCHED_AS_NULL |PREG_PATTERN_ORDER |PREG_OFFSET_CAPTURE )) {
133- assertType ("array{0: list<array{string|null, int<-1, max>}>, num: list<array{decimal-int-string|null, int<-1, max>}>, 1: list<array{decimal-int-string|null, int<-1, max>}>, suffix: list<array{'ab'|null, int<-1, max>}>, 2: list<array{'ab'|null, int<-1, max>}>} " , $ matches );
133+ assertType ("array{0: non-empty- list<array{string|null, int<-1, max>}>, num: non-empty- list<array{decimal-int-string|null, int<-1, max>}>, 1: non-empty- list<array{decimal-int-string|null, int<-1, max>}>, suffix: non-empty- list<array{'ab'|null, int<-1, max>}>, 2: non-empty- list<array{'ab'|null, int<-1, max>}>} " , $ matches );
134134 }
135135};
136136
@@ -165,17 +165,31 @@ public function sayBar(string $content): void
165165
166166 function doFoobar (string $ s ): void {
167167 if (preg_match_all ('/(foo)?(bar)?(baz)?/ ' , $ s , $ matches , PREG_OFFSET_CAPTURE )) {
168- assertType ("array{list<array{string, int<-1, max>}>, list<array{''|'foo', int<-1, max>}>, list<array{''|'bar', int<-1, max>}>, list<array{''|'baz', int<-1, max>}>} " , $ matches );
168+ assertType ("array{non-empty- list<array{string, int<-1, max>}>, non-empty- list<array{''|'foo', int<-1, max>}>, non-empty- list<array{''|'bar', int<-1, max>}>, non-empty- list<array{''|'baz', int<-1, max>}>} " , $ matches );
169169 }
170170 }
171171
172172 function doFoobarNull (string $ s ): void {
173173 if (preg_match_all ('/(foo)?(bar)?(baz)?/ ' , $ s , $ matches , PREG_OFFSET_CAPTURE |PREG_UNMATCHED_AS_NULL )) {
174- assertType ("array{list<array{string|null, int<-1, max>}>, list<array{'foo'|null, int<-1, max>}>, list<array{'bar'|null, int<-1, max>}>, list<array{'baz'|null, int<-1, max>}>} " , $ matches );
174+ assertType ("array{non-empty- list<array{string|null, int<-1, max>}>, non-empty- list<array{'foo'|null, int<-1, max>}>, non-empty- list<array{'bar'|null, int<-1, max>}>, non-empty- list<array{'baz'|null, int<-1, max>}>} " , $ matches );
175175 }
176176 }
177177}
178178
179+ function bug14781 (string $ s ): void {
180+ if (preg_match_all ('/(\d+)/ ' , $ s , $ matches )) {
181+ assertType ('array{non-empty-list<string>, non-empty-list<decimal-int-string>} ' , $ matches );
182+ // accessing offset 0 is safe because the lists are non-empty
183+ assertType ('string ' , $ matches [0 ][0 ]);
184+ assertType ('decimal-int-string ' , $ matches [1 ][0 ]);
185+ }
186+
187+ if (preg_match_all ('/(\d+)/ ' , $ s , $ setMatches , PREG_SET_ORDER )) {
188+ assertType ('non-empty-list<array{string, decimal-int-string}> ' , $ setMatches );
189+ assertType ('array{string, decimal-int-string} ' , $ setMatches [0 ]);
190+ }
191+ }
192+
179193function bug11661 (): void {
180194 preg_match_all ('/(ERR)?(.+)/ ' , 'abc ' , $ results , PREG_SET_ORDER );
181195 assertType ("list<array{string, ''|'ERR', non-empty-string}> " , $ results );
0 commit comments