Commit 3e119404 authored by Robert Griesemer's avatar Robert Griesemer

[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: 's avatarMatthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent e0a05c27
......@@ -185,6 +185,10 @@ func (p *noder) constDecl(decl *syntax.ConstDecl) []*Node {
}
func (p *noder) typeDecl(decl *syntax.TypeDecl) *Node {
if decl.Alias {
yyerror("type alias declarations unimplemented")
}
name := typedcl0(p.name(decl.Name))
name.Name.Param.Pragma = Pragma(decl.Pragma)
......
......@@ -74,6 +74,7 @@ type (
// Name Type
TypeDecl struct {
Name *Name
Alias bool
Type Expr
Group *Group // nil means not part of a group
Pragma Pragma
......
......@@ -325,7 +325,7 @@ func (p *parser) constDecl(group *Group) Decl {
return d
}
// TypeSpec = identifier Type .
// TypeSpec = identifier [ "=" ] Type .
func (p *parser) typeDecl(group *Group) Decl {
if trace {
defer p.trace("typeDecl")()
......@@ -335,6 +335,7 @@ func (p *parser) typeDecl(group *Group) Decl {
d.init(p)
d.Name = p.name()
d.Alias = p.got(_Assign)
d.Type = p.tryType()
if d.Type == nil {
p.syntax_error("in type declaration")
......
......@@ -619,7 +619,11 @@ func (p *printer) printRawNode(n Node) {
if n.Group == nil {
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:
if n.Group == nil {
......
......@@ -22,3 +22,20 @@ func TestPrint(t *testing.T) {
Fprint(os.Stdout, ast, true)
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)
}
}
}
// 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.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment