diff --git a/src/jltypes.c b/src/jltypes.c index 0d59bdc3e659e..7b4f761be035b 100644 --- a/src/jltypes.c +++ b/src/jltypes.c @@ -1068,6 +1068,7 @@ static jl_value_t *normalize_vararg(jl_value_t *va) return va; } +int obviously_egal(jl_value_t *a, jl_value_t *b); static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value_t **iparams, size_t ntp, int cacheable, jl_typestack_t *stack, jl_typeenv_t *env) { @@ -1088,7 +1089,7 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value // normalize types equal to wrappers (prepare for wrapper_id) jl_value_t *tw = extract_wrapper(pi); if (tw && tw != pi && (tn != jl_type_typename || jl_typeof(pi) == jl_typeof(tw)) && - jl_types_equal(pi, tw)) { + obviously_egal(pi, tw)) { iparams[i] = tw; if (p) jl_gc_wb(p, tw); } diff --git a/src/subtype.c b/src/subtype.c index 6cee9d9de2eb7..6fed13f1a7d37 100644 --- a/src/subtype.c +++ b/src/subtype.c @@ -186,7 +186,7 @@ static void restore_env(jl_stenv_t *e, jl_value_t *root, jl_savedenv_t *se) JL_N // type utilities // quickly test that two types are identical -static int obviously_egal(jl_value_t *a, jl_value_t *b) +int obviously_egal(jl_value_t *a, jl_value_t *b) { if (a == b) return 1; if (jl_typeof(a) != jl_typeof(b)) return 0; diff --git a/test/core.jl b/test/core.jl index 9695d06d8f7bf..732da8b292e3c 100644 --- a/test/core.jl +++ b/test/core.jl @@ -226,6 +226,14 @@ let elT = T22624.body.body.body.types[1].parameters[1] @test elT2.body.types[1].parameters[1] === elT2 @test Base.isconcretetype(elT2.body.types[1]) end +struct T22624b{A,B,C}; v::Vector{T22624b{Integer,A}}; end +let elT = T22624b.body.body.body.types[1].parameters[1] + @test elT == T22624b{Integer, T22624b.var, C} where C + elT2 = elT.body.types[1].parameters[1] + @test elT2 == T22624b{Integer, Integer, C} where C + @test elT2.body.types[1].parameters[1] === elT2 + @test Base.isconcretetype(elT2.body.types[1]) +end # issue #3890 mutable struct A3890{T1}