124124
125125promote_type () = (@_pure_meta ; Bottom)
126126promote_type (T) = (@_pure_meta ; T)
127- promote_type (T, S, U, V... ) = (@_pure_meta ; promote_type (T, promote_type (S, U, V... )))
127+ promote_type (T, S, U, V... ) = (@_inline_meta ; promote_type (T, promote_type (S, U, V... )))
128128
129129promote_type (:: Type{Bottom} , :: Type{Bottom} ) = (@_pure_meta ; Bottom)
130130promote_type (:: Type{T} , :: Type{T} ) where {T} = (@_pure_meta ; T)
@@ -152,7 +152,7 @@ BigFloat
152152```
153153"""
154154function promote_type (:: Type{T} , :: Type{S} ) where {T,S}
155- @_pure_meta
155+ @_inline_meta
156156 # Try promote_rule in both orders. Typically only one is defined,
157157 # and there is a fallback returning Bottom below, so the common case is
158158 # promote_type(T, S) =>
@@ -161,26 +161,29 @@ function promote_type(::Type{T}, ::Type{S}) where {T,S}
161161 promote_result (T, S, promote_rule (T,S), promote_rule (S,T))
162162end
163163
164- promote_rule (T, S ) = (@_pure_meta ; Bottom)
164+ promote_rule (:: Type{<:Any} , :: Type{<:Any} ) = (@_inline_meta ; Bottom)
165165
166- promote_result (t,s,T,S) = (@_pure_meta ; promote_type (T,S))
166+ promote_result (:: Type{<:Any} , :: Type{<:Any} , :: Type{T} , :: Type{S} ) where {T,S} = (@_inline_meta ; promote_type (T,S))
167167# If no promote_rule is defined, both directions give Bottom. In that
168168# case use typejoin on the original types instead.
169- promote_result (:: Type{T} ,:: Type{S} ,:: Type{Bottom} ,:: Type{Bottom} ) where {T,S} = (@_pure_meta ; typejoin (T, S))
169+ promote_result (:: Type{T} ,:: Type{S} ,:: Type{Bottom} ,:: Type{Bottom} ) where {T,S} = (@_inline_meta ; typejoin (T, S))
170170
171171promote () = ()
172172promote (x) = (x,)
173173function promote (x:: T , y:: S ) where {T,S}
174+ @_inline_meta
174175 (convert (promote_type (T,S),x), convert (promote_type (T,S),y))
175176end
176- promote_typeof (x) = (@_pure_meta ; typeof (x))
177- promote_typeof (x, xs... ) = (@_pure_meta ; promote_type (typeof (x), promote_typeof (xs... )))
177+ promote_typeof (x) = (@_inline_meta ; typeof (x))
178+ promote_typeof (x, xs... ) = (@_inline_meta ; promote_type (typeof (x), promote_typeof (xs... )))
178179function promote (x, y, z)
180+ @_inline_meta
179181 (convert (promote_typeof (x,y,z), x),
180182 convert (promote_typeof (x,y,z), y),
181183 convert (promote_typeof (x,y,z), z))
182184end
183185function promote (x, y, zs... )
186+ @_inline_meta
184187 (convert (promote_typeof (x,y,zs... ), x),
185188 convert (promote_typeof (x,y,zs... ), y),
186189 convert (Tuple{Vararg{promote_typeof (x,y,zs... )}}, zs)... )
@@ -195,16 +198,16 @@ end
195198# happens, and +(promote(x,y)...) is called again, causing a stack
196199# overflow.
197200function promote_result (:: Type{T} ,:: Type{S} ,:: Type{Bottom} ,:: Type{Bottom} ) where {T<: Number ,S<: Number }
198- @_pure_meta
201+ @_inline_meta
199202 promote_to_supertype (T, S, typejoin (T,S))
200203end
201204
202205# promote numeric types T and S to typejoin(T,S) if T<:S or S<:T
203206# for example this makes promote_type(Integer,Real) == Real without
204207# promoting arbitrary pairs of numeric types to Number.
205- promote_to_supertype (:: Type{T} , :: Type{T} , :: Type{T} ) where {T<: Number } = (@_pure_meta ; T)
206- promote_to_supertype (:: Type{T} , :: Type{S} , :: Type{T} ) where {T<: Number ,S<: Number } = (@_pure_meta ; T)
207- promote_to_supertype (:: Type{T} , :: Type{S} , :: Type{S} ) where {T<: Number ,S<: Number } = (@_pure_meta ; S)
208+ promote_to_supertype (:: Type{T} , :: Type{T} , :: Type{T} ) where {T<: Number } = (@_inline_meta ; T)
209+ promote_to_supertype (:: Type{T} , :: Type{S} , :: Type{T} ) where {T<: Number ,S<: Number } = (@_inline_meta ; T)
210+ promote_to_supertype (:: Type{T} , :: Type{S} , :: Type{S} ) where {T<: Number ,S<: Number } = (@_inline_meta ; S)
208211promote_to_supertype (:: Type{T} , :: Type{S} , :: Type ) where {T<: Number ,S<: Number } =
209212 error (" no promotion exists for " , T, " and " , S)
210213
@@ -304,15 +307,15 @@ minmax(x::Real, y::Real) = minmax(promote(x, y)...)
304307# "Promotion" that takes a function into account and tries to preserve
305308# non-concrete types. These are meant to be used mainly by elementwise
306309# operations, so it is advised against overriding them
307- _default_type (T:: Type ) = (@_pure_meta ; T)
310+ _default_type (T:: Type ) = (@_inline_meta ; T)
308311
309312if isdefined (Core, :Inference )
310313 const _return_type = Core. Inference. return_type
311314else
312315 _return_type (f:: ANY , t:: ANY ) = Any
313316end
314317
315- promote_op (:: Any... ) = (@_pure_meta ; Any)
318+ promote_op (:: Any... ) = (@_inline_meta ; Any)
316319function promote_op {S} (f, :: Type{S} )
317320 @_inline_meta
318321 T = _return_type (f, Tuple{_default_type (S)})
0 commit comments