mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
parent
29545906c0
commit
b743b7ab50
@ -500,12 +500,22 @@ func (cs *compileState) parseStmt(block *block, fname string, stmt ast.Stmt, inP
|
|||||||
}
|
}
|
||||||
if expr.Const != nil {
|
if expr.Const != nil {
|
||||||
switch outT.Main {
|
switch outT.Main {
|
||||||
|
case shaderir.Bool:
|
||||||
|
if expr.Const.Kind() != gconstant.Bool {
|
||||||
|
cs.addError(stmt.Pos(), fmt.Sprintf("cannot use type %s as type %s in return argument", t.String(), &outT))
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
t = shaderir.Type{Main: shaderir.Bool}
|
||||||
case shaderir.Int:
|
case shaderir.Int:
|
||||||
if !cs.forceToInt(stmt, &expr) {
|
if !cs.forceToInt(stmt, &expr) {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
t = shaderir.Type{Main: shaderir.Int}
|
t = shaderir.Type{Main: shaderir.Int}
|
||||||
case shaderir.Float:
|
case shaderir.Float:
|
||||||
|
if gconstant.ToFloat(expr.Const).Kind() == gconstant.Unknown {
|
||||||
|
cs.addError(stmt.Pos(), fmt.Sprintf("cannot use type %s as type %s in return argument", t.String(), &outT))
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
t = shaderir.Type{Main: shaderir.Float}
|
t = shaderir.Type{Main: shaderir.Float}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3249,3 +3249,45 @@ func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue #2706
|
||||||
|
func TestSyntaxReturnConst(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
typ string
|
||||||
|
stmt string
|
||||||
|
err bool
|
||||||
|
}{
|
||||||
|
{typ: "bool", stmt: "true", err: false},
|
||||||
|
{typ: "int", stmt: "true", err: true},
|
||||||
|
{typ: "float", stmt: "true", err: true},
|
||||||
|
{typ: "bool", stmt: "1", err: true},
|
||||||
|
{typ: "int", stmt: "1", err: false},
|
||||||
|
{typ: "float", stmt: "1", err: false},
|
||||||
|
{typ: "bool", stmt: "1.0", err: true},
|
||||||
|
{typ: "int", stmt: "1.0", err: false},
|
||||||
|
{typ: "float", stmt: "1.0", err: false},
|
||||||
|
{typ: "bool", stmt: "1.1", err: true},
|
||||||
|
{typ: "int", stmt: "1.1", err: true},
|
||||||
|
{typ: "float", stmt: "1.1", err: false},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range cases {
|
||||||
|
typ := c.typ
|
||||||
|
stmt := c.stmt
|
||||||
|
src := fmt.Sprintf(`package main
|
||||||
|
|
||||||
|
func Foo() %s {
|
||||||
|
return %s
|
||||||
|
}
|
||||||
|
|
||||||
|
func Fragment(position vec4, texCoord vec2, color vec4) vec4 {
|
||||||
|
return position
|
||||||
|
}`, typ, stmt)
|
||||||
|
_, err := compileToIR([]byte(src))
|
||||||
|
if err == nil && c.err {
|
||||||
|
t.Errorf("return %s for type %s must return an error but does not", stmt, typ)
|
||||||
|
} else if err != nil && !c.err {
|
||||||
|
t.Errorf("return %s for type %s must not return nil but returned %v", stmt, typ, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user