mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The rule changes are as follows: * All functions (introduced with the 'func' keyword) have argument labels for arguments beyond the first, by default. Methods are no longer special in this regard. * The presence of a default argument no longer implies an argument label. The actual changes to the parser and printer are fairly simple; the rest of the noise is updating the standard library, overlays, tests, etc. With the standard library, this change is intended to be API neutral: I've added/removed #'s and _'s as appropriate to keep the user interface the same. If we want to separately consider using argument labels for more free functions now that the defaults in the language have shifted, we can tackle that separately. Fixes rdar://problem/17218256. Swift SVN r27704
486 lines
9.7 KiB
Swift
486 lines
9.7 KiB
Swift
// RUN: %target-run-simple-swift | FileCheck %s
|
|
|
|
// XFAIL: linux
|
|
|
|
import Darwin.C.tgmath
|
|
import CoreGraphics
|
|
|
|
// verifiers
|
|
|
|
func print3(op: String, _ d: Double, _ f: Float, _ g: CGFloat) {
|
|
#if arch(i386) || arch(arm)
|
|
if (f != Float(g) && f.isNaN != g.isNaN) {
|
|
println("\(op)(CGFloat) got \(g) instead of \(f)")
|
|
}
|
|
#else
|
|
if (d != Double(g) && d.isNaN != g.isNaN) {
|
|
println("\(op)(CGFloat) got \(g) instead of \(d)")
|
|
}
|
|
#endif
|
|
println("\(op) \(d) \(f) \(op)")
|
|
}
|
|
|
|
func print3(op: String, _ d: Bool, _ f: Bool, _ g: Bool) {
|
|
#if arch(i386) || arch(arm)
|
|
if (f != g) {
|
|
println("\(op)(CGFloat) got \(g) instead of \(f)")
|
|
}
|
|
#else
|
|
if (d != g) {
|
|
println("\(op)(CGFloat) got \(g) instead of \(d)")
|
|
}
|
|
#endif
|
|
println("\(op) \(d) \(f) \(op)")
|
|
}
|
|
|
|
func print3(op: String, _ d: Int, _ f: Int, _ g: Int) {
|
|
#if arch(i386) || arch(arm)
|
|
if (f != g) {
|
|
println("\(op)(CGFloat) got \(g) instead of \(f)")
|
|
}
|
|
#else
|
|
if (d != g) {
|
|
println("\(op)(CGFloat) got \(g) instead of \(d)")
|
|
}
|
|
#endif
|
|
println("\(op) \(d) \(f) \(op)")
|
|
}
|
|
|
|
func print6(op: String, _ d1: Double, _ d2: Double,
|
|
_ f1: Float, _ f2: Float, _ g1: CGFloat, _ g2: CGFloat)
|
|
{
|
|
#if arch(i386) || arch(arm)
|
|
if (f1 != Float(g1) || f2 != Float(g2)) {
|
|
println("\(op)(CGFloat) got \(g1),\(g2) instead of \(f1),\(f2)")
|
|
}
|
|
#else
|
|
if (d1 != Double(g1) || d2 != Double(g2)) {
|
|
println("\(op)(CGFloat) got \(g1),\(g2) instead of \(d1),\(d2)")
|
|
}
|
|
#endif
|
|
println("\(op) \(d1),\(d2) \(f1),\(f2) \(op)")
|
|
}
|
|
|
|
func print6(op: String, _ d1: Double, _ di: Int,
|
|
_ f1: Float, _ fi: Int, _ g1: CGFloat, _ gi: Int)
|
|
{
|
|
#if arch(i386) || arch(arm)
|
|
if (f1 != Float(g1) || fi != gi) {
|
|
println("\(op)(CGFloat) got \(g1),\(gi) instead of \(f1),\(fi)")
|
|
}
|
|
#else
|
|
if (d1 != Double(g1) || di != gi) {
|
|
println("\(op)(CGFloat) got \(g1),\(gi) instead of \(d1),\(di)")
|
|
}
|
|
#endif
|
|
println("\(op) \(d1),\(di) \(f1),\(fi) \(op)")
|
|
}
|
|
|
|
// inputs
|
|
let dx = Double(0.1)
|
|
let dy = Double(2.2)
|
|
let dz = Double(3.3)
|
|
|
|
let fx = Float(0.1)
|
|
let fy = Float(2.2)
|
|
let fz = Float(3.3)
|
|
|
|
let gx = CGFloat(0.1)
|
|
let gy = CGFloat(2.2)
|
|
let gz = CGFloat(3.3)
|
|
|
|
let ix = Int(11)
|
|
|
|
// outputs
|
|
var d1, d2: Double
|
|
var f1, f2: Float
|
|
var g1, g2: CGFloat
|
|
var i1, i2, i3: Int
|
|
var b1, b2, b3: Bool
|
|
|
|
// The order of these tests matches tgmath.swift.gyb.
|
|
|
|
println("Shopping is hard, let's do math")
|
|
// CHECK: Shopping is hard, let's do math
|
|
|
|
// Unary functions
|
|
|
|
d1 = acos(dx)
|
|
f1 = acos(fx)
|
|
g1 = acos(gx)
|
|
print3("acos", d1, f1, g1)
|
|
// CHECK-NEXT: acos 1.47062890563334 1.47063 acos
|
|
|
|
d1 = asin(dx)
|
|
f1 = asin(fx)
|
|
g1 = asin(gx)
|
|
print3("asin", d1, f1, g1)
|
|
// CHECK-NEXT: asin 0.10016742116156 0.100167 asin
|
|
|
|
d1 = atan(dx)
|
|
f1 = atan(fx)
|
|
g1 = atan(gx)
|
|
print3("atan", d1, f1, g1)
|
|
// CHECK-NEXT: atan 0.099668652491162 0.0996687 atan
|
|
|
|
d1 = cos(dx)
|
|
f1 = cos(fx)
|
|
g1 = cos(gx)
|
|
print3("cos", d1, f1, g1)
|
|
// CHECK-NEXT: cos 0.995004165278026 0.995004 cos
|
|
|
|
d1 = sin(dx)
|
|
f1 = sin(fx)
|
|
g1 = sin(gx)
|
|
print3("sin", d1, f1, g1)
|
|
// CHECK-NEXT: sin 0.0998334166468282 0.0998334 sin
|
|
|
|
d1 = tan(dx)
|
|
f1 = tan(fx)
|
|
g1 = tan(gx)
|
|
print3("tan", d1, f1, g1)
|
|
// CHECK-NEXT: tan 0.100334672085451 0.100335 tan
|
|
|
|
|
|
d1 = acosh(dx)
|
|
f1 = acosh(fx)
|
|
g1 = acosh(gx)
|
|
print3("acosh", d1, f1, g1)
|
|
// CHECK-NEXT: acosh nan nan acosh
|
|
|
|
d1 = asinh(dx)
|
|
f1 = asinh(fx)
|
|
g1 = asinh(gx)
|
|
print3("asinh", d1, f1, g1)
|
|
// CHECK-NEXT: asinh 0.0998340788992076 0.0998341 asinh
|
|
|
|
d1 = atanh(dx)
|
|
f1 = atanh(fx)
|
|
g1 = atanh(gx)
|
|
print3("atanh", d1, f1, g1)
|
|
// CHECK-NEXT: atanh 0.100335347731076 0.100335 atanh
|
|
|
|
d1 = cosh(dx)
|
|
f1 = cosh(fx)
|
|
g1 = cosh(gx)
|
|
print3("cosh", d1, f1, g1)
|
|
// CHECK-NEXT: cosh 1.0050041680558 1.005 cosh
|
|
|
|
d1 = sinh(dx)
|
|
f1 = sinh(fx)
|
|
g1 = sinh(gx)
|
|
print3("sinh", d1, f1, g1)
|
|
// CHECK-NEXT: sinh 0.100166750019844 0.100167 sinh
|
|
|
|
d1 = tanh(dx)
|
|
f1 = tanh(fx)
|
|
g1 = tanh(gx)
|
|
print3("tanh", d1, f1, g1)
|
|
// CHECK-NEXT: tanh 0.0996679946249558 0.099668 tanh
|
|
|
|
|
|
d1 = exp(dx)
|
|
f1 = exp(fx)
|
|
g1 = exp(gx)
|
|
print3("exp", d1, f1, g1)
|
|
// CHECK-NEXT: exp 1.10517091807565 1.10517 exp
|
|
|
|
d1 = exp2(dx)
|
|
f1 = exp2(fx)
|
|
g1 = exp2(gx)
|
|
print3("exp2", d1, f1, g1)
|
|
// CHECK-NEXT: exp2 1.07177346253629 1.07177 exp2
|
|
|
|
d1 = expm1(dx)
|
|
f1 = expm1(fx)
|
|
g1 = expm1(gx)
|
|
print3("expm1", d1, f1, g1)
|
|
// CHECK-NEXT: expm1 0.105170918075648 0.105171 expm1
|
|
|
|
|
|
d1 = log(dx)
|
|
f1 = log(fx)
|
|
g1 = log(gx)
|
|
print3("log", d1, f1, g1)
|
|
// CHECK-NEXT: log -2.30258509299405 -2.30259 log
|
|
|
|
d1 = log10(dx)
|
|
f1 = log10(fx)
|
|
g1 = log10(gx)
|
|
print3("log10", d1, f1, g1)
|
|
// CHECK-NEXT: log10 -1.0 -1.0 log10
|
|
|
|
d1 = log2(dx)
|
|
f1 = log2(fx)
|
|
g1 = log2(gx)
|
|
print3("log2", d1, f1, g1)
|
|
// CHECK-NEXT: log2 -3.32192809488736 -3.32193 log2
|
|
|
|
d1 = log1p(dx)
|
|
f1 = log1p(fx)
|
|
g1 = log1p(gx)
|
|
print3("log1p", d1, f1, g1)
|
|
// CHECK-NEXT: log1p 0.0953101798043249 0.0953102 log1p
|
|
|
|
d1 = logb(dx)
|
|
f1 = logb(fx)
|
|
g1 = logb(gx)
|
|
print3("logb", d1, f1, g1)
|
|
// CHECK-NEXT: logb -4.0 -4.0 logb
|
|
|
|
|
|
d1 = fabs(dx)
|
|
f1 = fabs(fx)
|
|
g1 = fabs(gx)
|
|
print3("fabs", d1, f1, g1)
|
|
// CHECK-NEXT: fabs 0.1 0.1 fabs
|
|
|
|
d1 = cbrt(dx)
|
|
f1 = cbrt(fx)
|
|
g1 = cbrt(gx)
|
|
print3("cbrt", d1, f1, g1)
|
|
// CHECK-NEXT: cbrt 0.464158883361278 0.464159 cbrt
|
|
|
|
d1 = sqrt(dx)
|
|
f1 = sqrt(fx)
|
|
g1 = sqrt(gx)
|
|
print3("sqrt", d1, f1, g1)
|
|
// CHECK-NEXT: sqrt 0.316227766016838 0.316228 sqrt
|
|
|
|
d1 = erf(dx)
|
|
f1 = erf(fx)
|
|
g1 = erf(gx)
|
|
print3("erf", d1, f1, g1)
|
|
// CHECK-NEXT: erf 0.112462916018285 0.112463 erf
|
|
|
|
d1 = erfc(dx)
|
|
f1 = erfc(fx)
|
|
g1 = erfc(gx)
|
|
print3("erfc", d1, f1, g1)
|
|
// CHECK-NEXT: erfc 0.887537083981715 0.887537 erfc
|
|
|
|
d1 = tgamma(dx)
|
|
f1 = tgamma(fx)
|
|
g1 = tgamma(gx)
|
|
print3("tgamma", d1, f1, g1)
|
|
// CHECK-NEXT: tgamma 9.51350769866873 9.51351 tgamma
|
|
|
|
|
|
d1 = ceil(dx)
|
|
f1 = ceil(fx)
|
|
g1 = ceil(gx)
|
|
print3("ceil", d1, f1, g1)
|
|
// CHECK-NEXT: ceil 1.0 1.0 ceil
|
|
|
|
d1 = floor(dx)
|
|
f1 = floor(fx)
|
|
g1 = floor(gx)
|
|
print3("floor", d1, f1, g1)
|
|
// CHECK-NEXT: floor 0.0 0.0 floor
|
|
|
|
d1 = nearbyint(dx)
|
|
f1 = nearbyint(fx)
|
|
g1 = nearbyint(gx)
|
|
print3("nearbyint", d1, f1, g1)
|
|
// CHECK-NEXT: nearbyint 0.0 0.0 nearbyint
|
|
|
|
d1 = rint(dx)
|
|
f1 = rint(fx)
|
|
g1 = rint(gx)
|
|
print3("rint", d1, f1, g1)
|
|
// CHECK-NEXT: rint 0.0 0.0 rint
|
|
|
|
d1 = round(dx)
|
|
f1 = round(fx)
|
|
g1 = round(gx)
|
|
print3("round", d1, f1, g1)
|
|
// CHECK-NEXT: round 0.0 0.0 round
|
|
|
|
d1 = trunc(dx)
|
|
f1 = trunc(fx)
|
|
g1 = trunc(gx)
|
|
print3("trunc", d1, f1, g1)
|
|
// CHECK-NEXT: trunc 0.0 0.0 trunc
|
|
|
|
|
|
// Binary functions
|
|
|
|
d1 = atan2(dx, dy)
|
|
f1 = atan2(fx, fy)
|
|
g1 = atan2(gx, gy)
|
|
print3("atan2", d1, f1, g1)
|
|
// CHECK-NEXT: atan2 0.045423279421577 0.0454233 atan2
|
|
|
|
d1 = hypot(dx, dy)
|
|
f1 = hypot(fx, fy)
|
|
g1 = hypot(gx, gy)
|
|
print3("hypot", d1, f1, g1)
|
|
// CHECK-NEXT: hypot 2.20227155455452 2.20227 hypot
|
|
|
|
d1 = pow(dx, dy)
|
|
f1 = pow(fx, fy)
|
|
g1 = pow(gx, gy)
|
|
print3("pow", d1, f1, g1)
|
|
// CHECK-NEXT: pow 0.00630957344480193 0.00630957 pow
|
|
|
|
d1 = fmod(dx, dy)
|
|
f1 = fmod(fx, fy)
|
|
g1 = fmod(gx, gy)
|
|
print3("fmod", d1, f1, g1)
|
|
// CHECK-NEXT: fmod 0.1 0.1 fmod
|
|
|
|
d1 = remainder(dx, dy)
|
|
f1 = remainder(fx, fy)
|
|
g1 = remainder(gx, gy)
|
|
print3("remainder", d1, f1, g1)
|
|
// CHECK-NEXT: remainder 0.1 0.1 remainder
|
|
|
|
d1 = copysign(dx, dy)
|
|
f1 = copysign(fx, fy)
|
|
g1 = copysign(gx, gy)
|
|
print3("copysign", d1, f1, g1)
|
|
// CHECK-NEXT: copysign 0.1 0.1 copysign
|
|
|
|
d1 = nextafter(dx, dy)
|
|
f1 = nextafter(fx, fy)
|
|
g1 = nextafter(gx, gy)
|
|
print3("nextafter", d1, f1, g1)
|
|
// CHECK-NEXT: nextafter 0.1 0.1 nextafter
|
|
|
|
d1 = fdim(dx, dy)
|
|
f1 = fdim(fx, fy)
|
|
g1 = fdim(gx, gy)
|
|
print3("fdim", d1, f1, g1)
|
|
// CHECK-NEXT: fdim 0.0 0.0 fdim
|
|
|
|
d1 = fmax(dx, dy)
|
|
f1 = fmax(fx, fy)
|
|
g1 = fmax(gx, gy)
|
|
print3("fmax", d1, f1, g1)
|
|
// CHECK-NEXT: fmax 2.2 2.2 fmax
|
|
|
|
d1 = fmin(dx, dy)
|
|
f1 = fmin(fx, fy)
|
|
g1 = fmin(gx, gy)
|
|
print3("fmin", d1, f1, g1)
|
|
// CHECK-NEXT: fmin 0.1 0.1 fmin
|
|
|
|
|
|
// Other functions
|
|
|
|
i1 = fpclassify(dx)
|
|
i2 = fpclassify(fx)
|
|
i3 = fpclassify(gx)
|
|
print3("fpclassify", i1, i2, i3)
|
|
// CHECK-NEXT: fpclassify 4 4 fpclassify
|
|
|
|
b1 = isnormal(dx)
|
|
b2 = isnormal(fx)
|
|
b3 = isnormal(gx)
|
|
print3("isnormal", b1, b2, b3)
|
|
// CHECK-NEXT: isnormal true true isnormal
|
|
|
|
b1 = isfinite(dx)
|
|
b2 = isfinite(fx)
|
|
b3 = isfinite(gx)
|
|
print3("isfinite", b1, b2, b3)
|
|
// CHECK-NEXT: isfinite true true isfinite
|
|
|
|
b1 = isinf(dx)
|
|
b2 = isinf(fx)
|
|
b3 = isinf(gx)
|
|
print3("isinf", b1, b2, b3)
|
|
// CHECK-NEXT: isinf false false isinf
|
|
|
|
b1 = isnan(dx)
|
|
b2 = isnan(fx)
|
|
b3 = isnan(gx)
|
|
print3("isnan", b1, b2, b3)
|
|
// CHECK-NEXT: isnan false false isnan
|
|
|
|
i1 = signbit(dx)
|
|
i2 = signbit(fx)
|
|
i3 = signbit(gx)
|
|
print3("signbit", i1, i2, i3)
|
|
// CHECK-NEXT: signbit 0 0 signbit
|
|
|
|
(d1, d2) = modf(dy)
|
|
(f1, f2) = modf(fy)
|
|
(g1, g2) = modf(gy)
|
|
print6("modf", d1,d2, f1,f2, g1,g2)
|
|
// CHECK-NEXT: modf 2.0,0.2 2.0,0.2 modf
|
|
|
|
d1 = ldexp(dx, ix)
|
|
f1 = ldexp(fx, ix)
|
|
g1 = ldexp(gx, ix)
|
|
print3("ldexp", d1, f1, g1)
|
|
// CHECK-NEXT: ldexp 204.8 204.8 ldexp
|
|
|
|
(d1, i1) = frexp(dy)
|
|
(f1, i2) = frexp(fy)
|
|
(g1, i3) = frexp(gy)
|
|
print6("frexp", d1,i1, f1,i2, g1,i3)
|
|
// CHECK-NEXT: frexp 0.55,2 0.55,2 frexp
|
|
|
|
i1 = ilogb(dy)
|
|
i2 = ilogb(fy)
|
|
i3 = ilogb(gy)
|
|
print3("ilogb", i1, i2, i3)
|
|
// CHECK-NEXT: ilogb 1 1 ilogb
|
|
|
|
d1 = scalbn(dx, ix)
|
|
f1 = scalbn(fx, ix)
|
|
g1 = scalbn(gx, ix)
|
|
print3("scalbn", d1, f1, g1)
|
|
// CHECK-NEXT: scalbn 204.8 204.8 scalbn
|
|
|
|
(d1, i1) = lgamma(dx)
|
|
(f1, i2) = lgamma(fx)
|
|
(g1, i3) = lgamma(gx)
|
|
print6("lgamma", d1,i1, f1,i2, g1,i3)
|
|
// CHECK-NEXT: lgamma 2.25271265173421,1 2.25271,1 lgamma
|
|
|
|
(d1, i1) = remquo(dz, dy)
|
|
(f1, i2) = remquo(fz, fy)
|
|
(g1, i3) = remquo(gz, gy)
|
|
print6("remquo", d1,i1, f1,i2, g1,i3)
|
|
// CHECK-NEXT: remquo 1.1,1 1.1,1 remquo
|
|
|
|
d1 = nan("12345")
|
|
f1 = nan("12345")
|
|
g1 = nan("12345")
|
|
print3("nan", d1, f1, g1)
|
|
// CHECK-NEXT: nan nan nan nan
|
|
|
|
d1 = fma(dx, dy, dz)
|
|
f1 = fma(fx, fy, fz)
|
|
g1 = fma(gx, gy, gz)
|
|
print3("fma", d1, f1, g1)
|
|
// CHECK-NEXT: fma 3.52 3.52 fma
|
|
|
|
|
|
d1 = j0(dx)
|
|
println("j0 \(d1) j0")
|
|
// CHECK-NEXT: j0 0.99750156206604 j0
|
|
|
|
d1 = j1(dx)
|
|
println("j1 \(d1) j1")
|
|
// CHECK-NEXT: j1 0.049937526036242 j1
|
|
|
|
d1 = jn(ix, dx)
|
|
println("jn \(d1) jn")
|
|
// CHECK-NEXT: jn 1.22299266103565e-22 jn
|
|
|
|
d1 = y0(dx)
|
|
println("y0 \(d1) y0")
|
|
// CHECK-NEXT: y0 -1.53423865135037 y0
|
|
|
|
d1 = y1(dx)
|
|
println("y1 \(d1) y1")
|
|
// CHECK-NEXT: y1 -6.45895109470203 y1
|
|
|
|
d1 = yn(ix, dx)
|
|
println("yn \(d1) yn")
|
|
// CHECK-NEXT: yn -2.36620129448696e+20 yn
|
|
|