From 810d183070951ad841dbef18f61b99c290a85ec4 Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Thu, 25 Feb 2021 11:07:56 -0600 Subject: [PATCH] equiv_typedef: don't reject equivalence just for gensyms (#39778) This fixes the following: ``` julia> struct Symmetric{T,S<:AbstractMatrix{<:T}} <: AbstractMatrix{T} data::S uplo::Char end julia> struct Symmetric{T,S<:AbstractMatrix{<:T}} <: AbstractMatrix{T} data::S uplo::Char end ERROR: invalid redefinition of constant Symmetric ``` `Core._equiv_typedef` returns false which ends up triggering the error. --- src/builtins.c | 2 +- test/core.jl | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/builtins.c b/src/builtins.c index 10e2092a0be78..c85ea1750348e 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -1395,7 +1395,7 @@ static int equiv_type(jl_value_t *ta, jl_value_t *tb) while (jl_is_unionall(a)) { jl_unionall_t *ua = (jl_unionall_t*)a; jl_unionall_t *ub = (jl_unionall_t*)b; - if (!jl_egal(ua->var->lb, ub->var->lb) || !jl_egal(ua->var->ub, ub->var->ub) || + if (!jl_types_egal(ua->var->lb, ub->var->lb) || !jl_types_egal(ua->var->ub, ub->var->ub) || ua->var->name != ub->var->name) goto no; a = jl_instantiate_unionall(ua, (jl_value_t*)ub->var); diff --git a/test/core.jl b/test/core.jl index a159aeccf1d55..c360dc6ba5b13 100644 --- a/test/core.jl +++ b/test/core.jl @@ -7289,12 +7289,28 @@ end # issue #36104 module M36104 +using Test struct T36104 v::Vector{M36104.T36104} end struct T36104 # check that redefining it works, issue #21816 v::Vector{T36104} end +# with a gensymmed unionall +struct Symmetric{T,S<:AbstractMatrix{<:T}} <: AbstractMatrix{T} + data::S + uplo::Char +end +struct Symmetric{T,S<:AbstractMatrix{<:T}} <: AbstractMatrix{T} + data::S + uplo::Char +end +@test_throws ErrorException begin + struct Symmetric{T,S<:AbstractMatrix{T}} <: AbstractMatrix{T} + data::S + uplo::Char + end +end end @test fieldtypes(M36104.T36104) == (Vector{M36104.T36104},) @test_throws ErrorException("expected") @eval(struct X36104; x::error("expected"); end)