From c746059a86348b03b09d6452de5bb1a4e58612dd Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 3 May 2023 12:16:40 -0700 Subject: [PATCH] go/types, types2: rename allowVersionf to verifyVersionf Follow-up on comment in CL 491715. Change-Id: Ie6a71859e791434b7ab53c5524f35718a3567ecb Reviewed-on: https://go-review.googlesource.com/c/go/+/492236 Auto-Submit: Robert Griesemer Reviewed-by: Robert Findley Run-TryBot: Robert Griesemer TryBot-Result: Gopher Robot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/types2/builtins.go | 12 ++++++------ src/cmd/compile/internal/types2/call.go | 6 +++--- src/cmd/compile/internal/types2/decl.go | 4 ++-- src/cmd/compile/internal/types2/expr.go | 2 +- src/cmd/compile/internal/types2/resolver.go | 4 ++-- src/cmd/compile/internal/types2/typeset.go | 6 +++--- src/cmd/compile/internal/types2/typexpr.go | 4 ++-- src/cmd/compile/internal/types2/version.go | 4 ++-- src/go/types/builtins.go | 12 ++++++------ src/go/types/call.go | 6 +++--- src/go/types/decl.go | 4 ++-- src/go/types/expr.go | 2 +- src/go/types/resolver.go | 4 ++-- src/go/types/typeset.go | 6 +++--- src/go/types/typexpr.go | 4 ++-- src/go/types/version.go | 4 ++-- 16 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/cmd/compile/internal/types2/builtins.go b/src/cmd/compile/internal/types2/builtins.go index d91f98471e..3dcef64146 100644 --- a/src/cmd/compile/internal/types2/builtins.go +++ b/src/cmd/compile/internal/types2/builtins.go @@ -234,7 +234,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( case _Clear: // clear(m) - if !check.allowVersionf(check.pkg, call.Fun, go1_21, "clear") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_21, "clear") { return } @@ -625,7 +625,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( case _Add: // unsafe.Add(ptr unsafe.Pointer, len IntegerType) unsafe.Pointer - if !check.allowVersionf(check.pkg, call.Fun, go1_17, "unsafe.Add") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_17, "unsafe.Add") { return } @@ -760,7 +760,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( case _Slice: // unsafe.Slice(ptr *T, len IntegerType) []T - if !check.allowVersionf(check.pkg, call.Fun, go1_17, "unsafe.Slice") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_17, "unsafe.Slice") { return } @@ -784,7 +784,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( case _SliceData: // unsafe.SliceData(slice []T) *T - if !check.allowVersionf(check.pkg, call.Fun, go1_20, "unsafe.SliceData") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_20, "unsafe.SliceData") { return } @@ -802,7 +802,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( case _String: // unsafe.String(ptr *byte, len IntegerType) string - if !check.allowVersionf(check.pkg, call.Fun, go1_20, "unsafe.String") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_20, "unsafe.String") { return } @@ -825,7 +825,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) ( case _StringData: // unsafe.StringData(str string) *byte - if !check.allowVersionf(check.pkg, call.Fun, go1_20, "unsafe.StringData") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_20, "unsafe.StringData") { return } diff --git a/src/cmd/compile/internal/types2/call.go b/src/cmd/compile/internal/types2/call.go index 040de8da52..c6d1590016 100644 --- a/src/cmd/compile/internal/types2/call.go +++ b/src/cmd/compile/internal/types2/call.go @@ -29,7 +29,7 @@ func (check *Checker) funcInst(tsig *Signature, pos syntax.Pos, x *operand, inst } else { instErrPos = pos } - versionErr := !check.allowVersionf(check.pkg, instErrPos, go1_18, "function instantiation") + versionErr := !check.verifyVersionf(check.pkg, instErrPos, go1_18, "function instantiation") // targs and xlist are the type arguments and corresponding type expressions, or nil. var targs []Type @@ -292,7 +292,7 @@ func (check *Checker) callExpr(x *operand, call *syntax.CallExpr) exprKind { // is an error checking its arguments (for example, if an incorrect number // of arguments is supplied). if got == want && want > 0 { - check.allowVersionf(check.pkg, inst, go1_18, "function instantiation") + check.verifyVersionf(check.pkg, inst, go1_18, "function instantiation") sig = check.instantiateSignature(inst.Pos(), sig, targs, xlist) assert(sig.TypeParams().Len() == 0) // signature is not generic anymore @@ -505,7 +505,7 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []T } } // at the moment we only support implicit instantiations of argument functions - _ = len(genericArgs) > 0 && check.allowVersionf(check.pkg, args[genericArgs[0]], go1_21, "implicitly instantiated function as argument") + _ = len(genericArgs) > 0 && check.verifyVersionf(check.pkg, args[genericArgs[0]], go1_21, "implicitly instantiated function as argument") // tparams holds the type parameters of the callee and generic function arguments, if any: // the first n type parameters belong to the callee, followed by mi type parameters for each diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go index d35a044ffc..193308f197 100644 --- a/src/cmd/compile/internal/types2/decl.go +++ b/src/cmd/compile/internal/types2/decl.go @@ -492,7 +492,7 @@ func (check *Checker) typeDecl(obj *TypeName, tdecl *syntax.TypeDecl, def *Named check.validType(t) } // If typ is local, an error was already reported where typ is specified/defined. - _ = check.isImportedConstraint(rhs) && check.allowVersionf(check.pkg, tdecl.Type, go1_18, "using type constraint %s", rhs) + _ = check.isImportedConstraint(rhs) && check.verifyVersionf(check.pkg, tdecl.Type, go1_18, "using type constraint %s", rhs) }).describef(obj, "validType(%s)", obj.Name()) alias := tdecl.Alias @@ -505,7 +505,7 @@ func (check *Checker) typeDecl(obj *TypeName, tdecl *syntax.TypeDecl, def *Named // alias declaration if alias { - check.allowVersionf(check.pkg, tdecl, go1_9, "type aliases") + check.verifyVersionf(check.pkg, tdecl, go1_9, "type aliases") check.brokenAlias(obj) rhs = check.typ(tdecl.Type) check.validAlias(obj, rhs) diff --git a/src/cmd/compile/internal/types2/expr.go b/src/cmd/compile/internal/types2/expr.go index 7dda8267c8..295c497054 100644 --- a/src/cmd/compile/internal/types2/expr.go +++ b/src/cmd/compile/internal/types2/expr.go @@ -977,7 +977,7 @@ func (check *Checker) shift(x, y *operand, e syntax.Expr, op syntax.Operator) { // Check that RHS is otherwise at least of integer type. switch { case allInteger(y.typ): - if !allUnsigned(y.typ) && !check.allowVersionf(check.pkg, y, go1_13, invalidOp+"signed shift count %s", y) { + if !allUnsigned(y.typ) && !check.verifyVersionf(check.pkg, y, go1_13, invalidOp+"signed shift count %s", y) { x.mode = invalid return } diff --git a/src/cmd/compile/internal/types2/resolver.go b/src/cmd/compile/internal/types2/resolver.go index f856dae47c..e1fe5aa9b7 100644 --- a/src/cmd/compile/internal/types2/resolver.go +++ b/src/cmd/compile/internal/types2/resolver.go @@ -406,7 +406,7 @@ func (check *Checker) collectObjects() { } case *syntax.TypeDecl: - _ = len(s.TParamList) != 0 && check.allowVersionf(pkg, s.TParamList[0], go1_18, "type parameter") + _ = len(s.TParamList) != 0 && check.verifyVersionf(pkg, s.TParamList[0], go1_18, "type parameter") obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Value, nil) check.declarePkgObj(s.Name, obj, &declInfo{file: fileScope, tdecl: s}) @@ -453,7 +453,7 @@ func (check *Checker) collectObjects() { } check.recordDef(s.Name, obj) } - _ = len(s.TParamList) != 0 && !hasTParamError && check.allowVersionf(pkg, s.TParamList[0], go1_18, "type parameter") + _ = len(s.TParamList) != 0 && !hasTParamError && check.verifyVersionf(pkg, s.TParamList[0], go1_18, "type parameter") info := &declInfo{file: fileScope, fdecl: s} // Methods are not package-level objects but we still track them in the // object map so that we can handle them like regular functions (if the diff --git a/src/cmd/compile/internal/types2/typeset.go b/src/cmd/compile/internal/types2/typeset.go index 7873cc2162..fe1d8773cd 100644 --- a/src/cmd/compile/internal/types2/typeset.go +++ b/src/cmd/compile/internal/types2/typeset.go @@ -278,7 +278,7 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_ assert(!isTypeParam(typ)) tset := computeInterfaceTypeSet(check, pos, u) // If typ is local, an error was already reported where typ is specified/defined. - if check != nil && check.isImportedConstraint(typ) && !check.allowVersionf(check.pkg, pos, go1_18, "embedding constraint interface %s", typ) { + if check != nil && check.isImportedConstraint(typ) && !check.verifyVersionf(check.pkg, pos, go1_18, "embedding constraint interface %s", typ) { continue } comparable = tset.comparable @@ -287,7 +287,7 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_ } terms = tset.terms case *Union: - if check != nil && !check.allowVersionf(check.pkg, pos, go1_18, "embedding interface element %s", u) { + if check != nil && !check.verifyVersionf(check.pkg, pos, go1_18, "embedding interface element %s", u) { continue } tset := computeUnionTypeSet(check, unionSets, pos, u) @@ -301,7 +301,7 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_ if u == Typ[Invalid] { continue } - if check != nil && !check.allowVersionf(check.pkg, pos, go1_18, "embedding non-interface type %s", typ) { + if check != nil && !check.verifyVersionf(check.pkg, pos, go1_18, "embedding non-interface type %s", typ) { continue } terms = termlist{{false, typ}} diff --git a/src/cmd/compile/internal/types2/typexpr.go b/src/cmd/compile/internal/types2/typexpr.go index 31407e0a59..1670b12a96 100644 --- a/src/cmd/compile/internal/types2/typexpr.go +++ b/src/cmd/compile/internal/types2/typexpr.go @@ -42,7 +42,7 @@ func (check *Checker) ident(x *operand, e *syntax.Name, def *Named, wantType boo } return case universeAny, universeComparable: - if !check.allowVersionf(check.pkg, e, go1_18, "predeclared %s", e.Value) { + if !check.verifyVersionf(check.pkg, e, go1_18, "predeclared %s", e.Value) { return // avoid follow-on errors } } @@ -271,7 +271,7 @@ func (check *Checker) typInternal(e0 syntax.Expr, def *Named) (T Type) { } case *syntax.IndexExpr: - check.allowVersionf(check.pkg, e, go1_18, "type instantiation") + check.verifyVersionf(check.pkg, e, go1_18, "type instantiation") return check.instantiatedType(e.X, unpackExpr(e.Index), def) case *syntax.ParenExpr: diff --git a/src/cmd/compile/internal/types2/version.go b/src/cmd/compile/internal/types2/version.go index ad3aa85693..3b655aad38 100644 --- a/src/cmd/compile/internal/types2/version.go +++ b/src/cmd/compile/internal/types2/version.go @@ -140,9 +140,9 @@ func (check *Checker) allowVersion(pkg *Package, at poser, v version) bool { return check.version.equal(go0_0) || !check.version.before(v) } -// allowVersionf is like allowVersion but also accepts a format string and arguments +// verifyVersionf is like allowVersion but also accepts a format string and arguments // which are used to report a version error if allowVersion returns false. -func (check *Checker) allowVersionf(pkg *Package, at poser, v version, format string, args ...interface{}) bool { +func (check *Checker) verifyVersionf(pkg *Package, at poser, v version, format string, args ...interface{}) bool { if !check.allowVersion(pkg, at, v) { check.versionErrorf(at, v, format, args...) return false diff --git a/src/go/types/builtins.go b/src/go/types/builtins.go index 203c248df1..361a760211 100644 --- a/src/go/types/builtins.go +++ b/src/go/types/builtins.go @@ -235,7 +235,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b case _Clear: // clear(m) - if !check.allowVersionf(check.pkg, call.Fun, go1_21, "clear") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_21, "clear") { return } @@ -626,7 +626,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b case _Add: // unsafe.Add(ptr unsafe.Pointer, len IntegerType) unsafe.Pointer - if !check.allowVersionf(check.pkg, call.Fun, go1_17, "unsafe.Add") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_17, "unsafe.Add") { return } @@ -761,7 +761,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b case _Slice: // unsafe.Slice(ptr *T, len IntegerType) []T - if !check.allowVersionf(check.pkg, call.Fun, go1_17, "unsafe.Slice") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_17, "unsafe.Slice") { return } @@ -785,7 +785,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b case _SliceData: // unsafe.SliceData(slice []T) *T - if !check.allowVersionf(check.pkg, call.Fun, go1_20, "unsafe.SliceData") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_20, "unsafe.SliceData") { return } @@ -803,7 +803,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b case _String: // unsafe.String(ptr *byte, len IntegerType) string - if !check.allowVersionf(check.pkg, call.Fun, go1_20, "unsafe.String") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_20, "unsafe.String") { return } @@ -826,7 +826,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b case _StringData: // unsafe.StringData(str string) *byte - if !check.allowVersionf(check.pkg, call.Fun, go1_20, "unsafe.StringData") { + if !check.verifyVersionf(check.pkg, call.Fun, go1_20, "unsafe.StringData") { return } diff --git a/src/go/types/call.go b/src/go/types/call.go index 68537355c3..f03d9137a6 100644 --- a/src/go/types/call.go +++ b/src/go/types/call.go @@ -31,7 +31,7 @@ func (check *Checker) funcInst(tsig *Signature, pos token.Pos, x *operand, ix *t } else { instErrPos = atPos(pos) } - versionErr := !check.allowVersionf(check.pkg, instErrPos, go1_18, "function instantiation") + versionErr := !check.verifyVersionf(check.pkg, instErrPos, go1_18, "function instantiation") // targs and xlist are the type arguments and corresponding type expressions, or nil. var targs []Type @@ -297,7 +297,7 @@ func (check *Checker) callExpr(x *operand, call *ast.CallExpr) exprKind { // is an error checking its arguments (for example, if an incorrect number // of arguments is supplied). if got == want && want > 0 { - check.allowVersionf(check.pkg, atPos(ix.Lbrack), go1_18, "function instantiation") + check.verifyVersionf(check.pkg, atPos(ix.Lbrack), go1_18, "function instantiation") sig = check.instantiateSignature(ix.Pos(), sig, targs, xlist) assert(sig.TypeParams().Len() == 0) // signature is not generic anymore @@ -508,7 +508,7 @@ func (check *Checker) arguments(call *ast.CallExpr, sig *Signature, targs []Type } } // at the moment we only support implicit instantiations of argument functions - _ = len(genericArgs) > 0 && check.allowVersionf(check.pkg, args[genericArgs[0]], go1_21, "implicitly instantiated function as argument") + _ = len(genericArgs) > 0 && check.verifyVersionf(check.pkg, args[genericArgs[0]], go1_21, "implicitly instantiated function as argument") // tparams holds the type parameters of the callee and generic function arguments, if any: // the first n type parameters belong to the callee, followed by mi type parameters for each diff --git a/src/go/types/decl.go b/src/go/types/decl.go index 89022f0259..4b7fb331c6 100644 --- a/src/go/types/decl.go +++ b/src/go/types/decl.go @@ -561,7 +561,7 @@ func (check *Checker) typeDecl(obj *TypeName, tdecl *ast.TypeSpec, def *Named) { check.validType(t) } // If typ is local, an error was already reported where typ is specified/defined. - _ = check.isImportedConstraint(rhs) && check.allowVersionf(check.pkg, tdecl.Type, go1_18, "using type constraint %s", rhs) + _ = check.isImportedConstraint(rhs) && check.verifyVersionf(check.pkg, tdecl.Type, go1_18, "using type constraint %s", rhs) }).describef(obj, "validType(%s)", obj.Name()) alias := tdecl.Assign.IsValid() @@ -574,7 +574,7 @@ func (check *Checker) typeDecl(obj *TypeName, tdecl *ast.TypeSpec, def *Named) { // alias declaration if alias { - check.allowVersionf(check.pkg, atPos(tdecl.Assign), go1_9, "type aliases") + check.verifyVersionf(check.pkg, atPos(tdecl.Assign), go1_9, "type aliases") check.brokenAlias(obj) rhs = check.typ(tdecl.Type) check.validAlias(obj, rhs) diff --git a/src/go/types/expr.go b/src/go/types/expr.go index 5dba1f9d8b..0e4e6667d8 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -955,7 +955,7 @@ func (check *Checker) shift(x, y *operand, e ast.Expr, op token.Token) { // Check that RHS is otherwise at least of integer type. switch { case allInteger(y.typ): - if !allUnsigned(y.typ) && !check.allowVersionf(check.pkg, y, go1_13, invalidOp+"signed shift count %s", y) { + if !allUnsigned(y.typ) && !check.verifyVersionf(check.pkg, y, go1_13, invalidOp+"signed shift count %s", y) { x.mode = invalid return } diff --git a/src/go/types/resolver.go b/src/go/types/resolver.go index 52facdd02a..6e175a7615 100644 --- a/src/go/types/resolver.go +++ b/src/go/types/resolver.go @@ -386,7 +386,7 @@ func (check *Checker) collectObjects() { check.declarePkgObj(name, obj, di) } case typeDecl: - _ = d.spec.TypeParams.NumFields() != 0 && check.allowVersionf(pkg, d.spec.TypeParams.List[0], go1_18, "type parameter") + _ = d.spec.TypeParams.NumFields() != 0 && check.verifyVersionf(pkg, d.spec.TypeParams.List[0], go1_18, "type parameter") obj := NewTypeName(d.spec.Name.Pos(), pkg, d.spec.Name.Name, nil) check.declarePkgObj(d.spec.Name, obj, &declInfo{file: fileScope, tdecl: d.spec}) case funcDecl: @@ -442,7 +442,7 @@ func (check *Checker) collectObjects() { } check.recordDef(d.decl.Name, obj) } - _ = d.decl.Type.TypeParams.NumFields() != 0 && !hasTParamError && check.allowVersionf(pkg, d.decl.Type.TypeParams.List[0], go1_18, "type parameter") + _ = d.decl.Type.TypeParams.NumFields() != 0 && !hasTParamError && check.verifyVersionf(pkg, d.decl.Type.TypeParams.List[0], go1_18, "type parameter") info := &declInfo{file: fileScope, fdecl: d.decl} // Methods are not package-level objects but we still track them in the // object map so that we can handle them like regular functions (if the diff --git a/src/go/types/typeset.go b/src/go/types/typeset.go index 330d158365..9489f6ae87 100644 --- a/src/go/types/typeset.go +++ b/src/go/types/typeset.go @@ -276,7 +276,7 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T assert(!isTypeParam(typ)) tset := computeInterfaceTypeSet(check, pos, u) // If typ is local, an error was already reported where typ is specified/defined. - if check != nil && check.isImportedConstraint(typ) && !check.allowVersionf(check.pkg, atPos(pos), go1_18, "embedding constraint interface %s", typ) { + if check != nil && check.isImportedConstraint(typ) && !check.verifyVersionf(check.pkg, atPos(pos), go1_18, "embedding constraint interface %s", typ) { continue } comparable = tset.comparable @@ -285,7 +285,7 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T } terms = tset.terms case *Union: - if check != nil && !check.allowVersionf(check.pkg, atPos(pos), go1_18, "embedding interface element %s", u) { + if check != nil && !check.verifyVersionf(check.pkg, atPos(pos), go1_18, "embedding interface element %s", u) { continue } tset := computeUnionTypeSet(check, unionSets, pos, u) @@ -299,7 +299,7 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T if u == Typ[Invalid] { continue } - if check != nil && !check.allowVersionf(check.pkg, atPos(pos), go1_18, "embedding non-interface type %s", typ) { + if check != nil && !check.verifyVersionf(check.pkg, atPos(pos), go1_18, "embedding non-interface type %s", typ) { continue } terms = termlist{{false, typ}} diff --git a/src/go/types/typexpr.go b/src/go/types/typexpr.go index 54ffb3d3df..8347e8ec76 100644 --- a/src/go/types/typexpr.go +++ b/src/go/types/typexpr.go @@ -43,7 +43,7 @@ func (check *Checker) ident(x *operand, e *ast.Ident, def *Named, wantType bool) } return case universeAny, universeComparable: - if !check.allowVersionf(check.pkg, e, go1_18, "predeclared %s", e.Name) { + if !check.verifyVersionf(check.pkg, e, go1_18, "predeclared %s", e.Name) { return // avoid follow-on errors } } @@ -272,7 +272,7 @@ func (check *Checker) typInternal(e0 ast.Expr, def *Named) (T Type) { case *ast.IndexExpr, *ast.IndexListExpr: ix := typeparams.UnpackIndexExpr(e) - check.allowVersionf(check.pkg, inNode(e, ix.Lbrack), go1_18, "type instantiation") + check.verifyVersionf(check.pkg, inNode(e, ix.Lbrack), go1_18, "type instantiation") return check.instantiatedType(ix, def) case *ast.ParenExpr: diff --git a/src/go/types/version.go b/src/go/types/version.go index 25b169d0d0..8962e2f06c 100644 --- a/src/go/types/version.go +++ b/src/go/types/version.go @@ -141,9 +141,9 @@ func (check *Checker) allowVersion(pkg *Package, at positioner, v version) bool return check.version.equal(go0_0) || !check.version.before(v) } -// allowVersionf is like allowVersion but also accepts a format string and arguments +// verifyVersionf is like allowVersion but also accepts a format string and arguments // which are used to report a version error if allowVersion returns false. -func (check *Checker) allowVersionf(pkg *Package, at positioner, v version, format string, args ...interface{}) bool { +func (check *Checker) verifyVersionf(pkg *Package, at positioner, v version, format string, args ...interface{}) bool { if !check.allowVersion(pkg, at, v) { check.versionErrorf(at, v, format, args...) return false -- 2.50.0