1
0
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:
Robert Griesemer 2016-12-16 16:28:30 -08:00
parent e0a05c274a
commit 3e11940437
6 changed files with 87 additions and 2 deletions

View File

@ -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)

View File

@ -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

View File

@ -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")

View File

@ -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 {

View File

@ -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
View 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.