@@ -1116,8 +1116,17 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
1116
1116
1117
1117
if (!istuple ) {
1118
1118
if (jl_is_vararg_type ((jl_value_t * )dt ) && ntp == 2 ) {
1119
- if (!jl_is_long (iparams [1 ]) && !jl_is_typevar (iparams [1 ])) {
1120
- jl_type_error_rt ("Vararg" , "count" , (jl_value_t * )jl_long_type , iparams [1 ]);
1119
+ jl_value_t * lenparam = iparams [1 ];
1120
+ if (jl_is_typevar (lenparam )) {
1121
+ jl_tvar_t * N = (jl_tvar_t * )lenparam ;
1122
+ if (!(N -> lb == jl_bottom_type && N -> ub == (jl_value_t * )jl_any_type ))
1123
+ jl_error ("TypeVar in Vararg length must have bounds Union{} and Any" );
1124
+ }
1125
+ else if (!jl_is_long (lenparam )) {
1126
+ jl_type_error_rt ("Vararg" , "count" , (jl_value_t * )jl_long_type , lenparam );
1127
+ }
1128
+ else if (jl_unbox_long (lenparam ) < 0 ) {
1129
+ jl_errorf ("Vararg length is negative: %zd" , jl_unbox_long (lenparam ));
1121
1130
}
1122
1131
}
1123
1132
// check parameters against bounds in type definition
@@ -1159,8 +1168,7 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
1159
1168
}
1160
1169
if (jl_is_long (va1 )) {
1161
1170
ssize_t nt = jl_unbox_long (va1 );
1162
- if (nt < 0 )
1163
- jl_errorf ("apply_type: Vararg length N is negative: %zd" , nt );
1171
+ assert (nt >= 0 );
1164
1172
if (nt == 0 || !jl_has_free_typevars (va0 )) {
1165
1173
if (cacheable ) JL_UNLOCK (& typecache_lock ); // Might GC
1166
1174
if (ntp == 1 ) {
0 commit comments