// check whether non-interface type t
// satisifes inteface type iface.
int
-ifaceokT2I(Type *t, Type *iface, Type **m)
+ifaceokT2I(Type *t0, Type *iface, Type **m)
{
- Type *im, *tm;
+ Type *t, *im, *tm;
int imhash;
- t = methtype(t);
+ t = methtype(t0);
+
+ // stopgap: check for
+ // non-pointer type in T2I, methods want pointers.
+ // supposed to do something better eventually
+ // but this will catch errors while we decide the
+ // details of the "better" solution.
+ if(t == t0 && t->methptr == 2) {
+ yyerror("probably wanted *%T not %T", t, t);
+ *m = iface->type;
+ return 0;
+ }
// if this is too slow,
// could sort these first
var smallptr SmallPtr = SmallPtr{ 12345 };
var intptr IntPtr = 12345;
- test("bigptr", bigptr);
+// test("bigptr", bigptr);
test("&bigptr", &bigptr);
- test("smallptr", smallptr);
+// test("smallptr", smallptr);
test("&smallptr", &smallptr);
- test("intptr", intptr);
+// test("intptr", intptr);
test("&intptr", &intptr);
}
func (p *S2) Get() int { return p.i }
func (p *S2) Put(i int) { p.i = i }
-func f4() {
- s := S2{1};
- var i I1 = s;
- i.Put(2);
- check(i.Get() == 2, "f4 i");
- check(s.i == 1, "f4 s");
-}
+// func f4() {
+// s := S2{1};
+// var i I1 = s;
+// i.Put(2);
+// check(i.Get() == 2, "f4 i");
+// check(s.i == 1, "f4 s");
+// }
func f5() {
s := S2{1};
func (p *S4) Get() int64 { return p.l }
func (p *S4) Put(i int64) { p.l = i }
-func f10() {
- s := S4{1, 2, 3, 4};
- var i I2 = s;
- i.Put(5);
- check(i.Get() == 5, "f10 i");
- check(s.l == 4, "f10 s");
-}
+// func f10() {
+// s := S4{1, 2, 3, 4};
+// var i I2 = s;
+// i.Put(5);
+// check(i.Get() == 5, "f10 i");
+// check(s.l == 4, "f10 s");
+// }
func f11() {
s := S4{1, 2, 3, 4};
f1();
f2();
f3();
- f4();
+// f4();
f5();
f6();
f7();
f8();
f9();
- f10();
+// f10();
f11();
f12();
if fail > 0 {
// if we had a list of identifiers, it must be followed by a type
typ := P.tryParameterType();
-
+
return list, typ;
}
}
list.Init(0);
list.Push(&ast.Field{idents, typ, nil});
-
+
for P.tok == token.COMMA {
P.next();
idents := P.parseIdentList2(nil);
loc := P.loc;
P.expect(token.FUNC);
sig := P.parseSignature();
-
+
return &ast.FunctionType{loc, sig};
}
// embedded interface
typ = x;
}
-
+
return &ast.Field{idents, typ, nil};
}
end = P.loc;
P.expect(token.RBRACE);
P.opt_semi = true;
-
+
// convert vector
methods = make([]*ast.Field, list.Len());
for i := list.Len() - 1; i >= 0; i-- {
P.error(P.loc, "anonymous field expected");
}
}
-
+
return &ast.Field{idents, typ, tag};
}
loc := P.loc;
var end scanner.Location;
var fields []*ast.Field;
-
+
P.expect(token.STRUCT);
if P.tok == token.LBRACE {
P.next();
}
}
- return ast.StructType{loc, fields, end};
+ return &ast.StructType{loc, fields, end};
}
P.expect(tok);
P.parseStatementList(b.List);
-
+
if tok == token.LBRACE {
b.End = P.loc;
P.expect(token.RBRACE);
var x ast.Expr = &ast.BasicLit{P.loc, P.tok, P.val};
P.expect(token.STRING); // always satisfied
-
+
for P.tok == token.STRING {
y := &ast.BasicLit{P.loc, P.tok, P.val};
P.next();
x := &ast.BasicLit{P.loc, P.tok, P.val};
P.next();
return x;
-
+
case token.STRING:
return P.parseStringLit();
if P.tok != token.LBRACE {
prev_lev := P.expr_lev;
- P.expr_lev = -1;
+ P.expr_lev = -1;
if P.tok != token.SEMICOLON {
init = P.parseSimpleStat(isForStat);
// TODO check for range clause and exit if found
} else {
P.expect(token.STRING); // use expect() error handling
}
-
+
return &ast.ImportDecl{loc, ident, path};
}
P.next();
vals = P.parseExpressionList();
}
-
+
return &ast.ConstDecl{loc, idents, typ, vals};
}
ident := P.parseIdent();
typ := P.parseType();
-
+
return &ast.TypeDecl{loc, ident, typ};
}
vals = P.parseExpressionList();
}
}
-
+
return &ast.VarDecl{loc, idents, typ, vals};
}
case token.TYPE: return P.parseTypeSpec(loc);
case token.VAR: return P.parseVarSpec(loc);
}
-
+
unreachable();
return nil;
}
end := P.loc;
P.expect(token.RPAREN);
P.opt_semi = true;
-
+
// convert vector
decls := make([]ast.Decl, list.Len());
for i := 0; i < list.Len(); i++ {
decls[i] = list.At(i).(ast.Decl);
}
-
+
return &ast.DeclList{loc, keyword, decls, end};
}
case token.FUNC:
return P.parseFunctionDecl();
}
-
+
loc := P.loc;
P.error(loc, "declaration expected");
P.next(); // make progress
for i := 0; i < list.Len(); i++ {
imports[i] = list.At(i).(ast.Decl);
}
-
+
return imports;
}