mirror of
https://github.com/golang/go
synced 2024-11-23 05:20:11 -07:00
[dev.typealias] cmd/compile: recognize type aliases but complain for now (not yet supported)
Added test file. For #18130. Change-Id: Ifcfd7cd1acf9dd6a2f4f3d85979d232bb6b8c6b1 Reviewed-on: https://go-review.googlesource.com/34988 Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
e0a05c274a
commit
3e11940437
@ -185,6 +185,10 @@ func (p *noder) constDecl(decl *syntax.ConstDecl) []*Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *noder) typeDecl(decl *syntax.TypeDecl) *Node {
|
func (p *noder) typeDecl(decl *syntax.TypeDecl) *Node {
|
||||||
|
if decl.Alias {
|
||||||
|
yyerror("type alias declarations unimplemented")
|
||||||
|
}
|
||||||
|
|
||||||
name := typedcl0(p.name(decl.Name))
|
name := typedcl0(p.name(decl.Name))
|
||||||
name.Name.Param.Pragma = Pragma(decl.Pragma)
|
name.Name.Param.Pragma = Pragma(decl.Pragma)
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ type (
|
|||||||
// Name Type
|
// Name Type
|
||||||
TypeDecl struct {
|
TypeDecl struct {
|
||||||
Name *Name
|
Name *Name
|
||||||
|
Alias bool
|
||||||
Type Expr
|
Type Expr
|
||||||
Group *Group // nil means not part of a group
|
Group *Group // nil means not part of a group
|
||||||
Pragma Pragma
|
Pragma Pragma
|
||||||
|
@ -325,7 +325,7 @@ func (p *parser) constDecl(group *Group) Decl {
|
|||||||
return d
|
return d
|
||||||
}
|
}
|
||||||
|
|
||||||
// TypeSpec = identifier Type .
|
// TypeSpec = identifier [ "=" ] Type .
|
||||||
func (p *parser) typeDecl(group *Group) Decl {
|
func (p *parser) typeDecl(group *Group) Decl {
|
||||||
if trace {
|
if trace {
|
||||||
defer p.trace("typeDecl")()
|
defer p.trace("typeDecl")()
|
||||||
@ -335,6 +335,7 @@ func (p *parser) typeDecl(group *Group) Decl {
|
|||||||
d.init(p)
|
d.init(p)
|
||||||
|
|
||||||
d.Name = p.name()
|
d.Name = p.name()
|
||||||
|
d.Alias = p.got(_Assign)
|
||||||
d.Type = p.tryType()
|
d.Type = p.tryType()
|
||||||
if d.Type == nil {
|
if d.Type == nil {
|
||||||
p.syntax_error("in type declaration")
|
p.syntax_error("in type declaration")
|
||||||
|
@ -619,7 +619,11 @@ func (p *printer) printRawNode(n Node) {
|
|||||||
if n.Group == nil {
|
if n.Group == nil {
|
||||||
p.print(_Type, blank)
|
p.print(_Type, blank)
|
||||||
}
|
}
|
||||||
p.print(n.Name, blank, n.Type)
|
p.print(n.Name, blank)
|
||||||
|
if n.Alias {
|
||||||
|
p.print(_Assign, blank)
|
||||||
|
}
|
||||||
|
p.print(n.Type)
|
||||||
|
|
||||||
case *VarDecl:
|
case *VarDecl:
|
||||||
if n.Group == nil {
|
if n.Group == nil {
|
||||||
|
@ -22,3 +22,20 @@ func TestPrint(t *testing.T) {
|
|||||||
Fprint(os.Stdout, ast, true)
|
Fprint(os.Stdout, ast, true)
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPrintString(t *testing.T) {
|
||||||
|
for _, want := range []string{
|
||||||
|
"package p",
|
||||||
|
"package p; type _ = int; type T1 = struct{}; type ( _ = *struct{}; T2 = float32 )",
|
||||||
|
// TODO(gri) expand
|
||||||
|
} {
|
||||||
|
ast, err := ParseBytes([]byte(want), nil, nil, 0)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if got := String(ast); got != want {
|
||||||
|
t.Errorf("%q: got %q", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
58
test/alias2.go
Normal file
58
test/alias2.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Test basic restrictions on type aliases.
|
||||||
|
|
||||||
|
// The compiler doesn't implement type aliases yet,
|
||||||
|
// so for now we get the same error (unimplemented)
|
||||||
|
// everywhere, OR-ed into the ERROR checks.
|
||||||
|
// TODO(gri) remove the need for "unimplemented"
|
||||||
|
|
||||||
|
package p
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
. "reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Valid type alias declarations.
|
||||||
|
|
||||||
|
type _ = int // ERROR "unimplemented"
|
||||||
|
type _ = struct{} // ERROR "unimplemented"
|
||||||
|
type _ = reflect.Value // ERROR "unimplemented"
|
||||||
|
type _ = Value // ERROR "unimplemented"
|
||||||
|
|
||||||
|
type (
|
||||||
|
a1 = int // ERROR "unimplemented"
|
||||||
|
a2 = struct{} // ERROR "unimplemented"
|
||||||
|
a3 = reflect.Value // ERROR "unimplemented"
|
||||||
|
a4 = Value // ERROR "unimplemented"
|
||||||
|
)
|
||||||
|
|
||||||
|
func _() {
|
||||||
|
type _ = int // ERROR "unimplemented"
|
||||||
|
type _ = struct{} // ERROR "unimplemented"
|
||||||
|
type _ = reflect.Value // ERROR "unimplemented"
|
||||||
|
type _ = Value // ERROR "unimplemented"
|
||||||
|
|
||||||
|
type (
|
||||||
|
a1 = int // ERROR "unimplemented"
|
||||||
|
a2 = struct{} // ERROR "unimplemented"
|
||||||
|
a3 = reflect.Value // ERROR "unimplemented"
|
||||||
|
a4 = Value // ERROR "unimplemented"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalid type alias declarations.
|
||||||
|
|
||||||
|
type _ = reflect.ValueOf // ERROR "reflect.ValueOf is not a type|unimplemented"
|
||||||
|
|
||||||
|
type b1 = struct{} // ERROR "unimplemented"
|
||||||
|
func (b1) m() {} // disabled ERROR "invalid receiver type"
|
||||||
|
|
||||||
|
// TODO(gri) expand
|
||||||
|
// It appears that type-checking exits after some more severe errors, so we may
|
||||||
|
// need more test files.
|
Loading…
Reference in New Issue
Block a user