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 { ...@@ -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 ( ...@@ -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 { ...@@ -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 { ...@@ -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) { ...@@ -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) { ...@@ -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)
}
}
}
// 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