bind: skip unsupported functions in function sets

Change-Id: Ibac8f11503ff088600e75c16edab7d20d8128157
Reviewed-on: https://go-review.googlesource.com/35332
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/bind/genclasses.go b/bind/genclasses.go
index 4aa903b..7e99683 100644
--- a/bind/genclasses.go
+++ b/bind/genclasses.go
@@ -585,7 +585,12 @@
 	minp := maxp
 	// sort the function variants into argument sizes.
 	buckets := make(map[int][]*java.Func)
+	numF := 0
 	for _, f := range fs.Funcs {
+		if !g.isFuncSupported(f) {
+			continue
+		}
+		numF++
 		n := len(f.Params)
 		if n < minp {
 			minp = n
@@ -596,7 +601,7 @@
 	}
 	g.Printf(" {\n")
 	g.Indent()
-	if fs.Variadic {
+	if len(buckets) != 1 {
 		// Switch over the number of arguments.
 		g.Printf("switch %d + len(a%d) {\n", minp, minp)
 	}
@@ -605,7 +610,7 @@
 		if len(funcs) == 0 {
 			continue
 		}
-		if fs.Variadic {
+		if len(buckets) != 1 {
 			g.Printf("case %d:\n", i)
 			g.Indent()
 		}
@@ -651,7 +656,7 @@
 				g.Printf("__a%d", i)
 			}
 			g.Printf(")\n")
-			g.genFuncRet(fs, f)
+			g.genFuncRet(fs, f, numF > 1)
 			if len(preds) > 0 {
 				g.Outdent()
 				g.Printf("}\n")
@@ -661,21 +666,21 @@
 				g.Printf("}\n")
 			}
 		}
-		if fs.Variadic {
+		if len(buckets) != 1 {
 			g.Outdent()
 		}
 	}
-	if fs.Variadic {
+	if len(buckets) != 1 {
 		g.Printf("}\n")
 	}
-	if fs.Variadic || len(fs.Funcs) > 1 {
+	if numF > 1 {
 		g.Printf("panic(\"no overloaded method found for %s.%s that matched the arguments\")\n", cls.Name, fs.Name)
 	}
 	g.Outdent()
 	g.Printf("}\n\n")
 }
 
-func (g *ClassGen) genFuncRet(fs *java.FuncSet, f *java.Func) {
+func (g *ClassGen) genFuncRet(fs *java.FuncSet, f *java.Func, mustReturn bool) {
 	if f.Ret != nil {
 		g.genRead("_res", "res.res", f.Ret, modeRetained)
 		g.genRefRead("_exc", "res.exc", "error", "proxy_error", true)
@@ -692,7 +697,7 @@
 				// signature does. Use nil as a placeholder return value.
 				g.Printf("return nil\n")
 			}
-		} else if fs.Variadic || len(fs.Funcs) > 1 {
+		} else if mustReturn {
 			// If there are overloaded variants, return here to avoid the fallback
 			// panic generated in genFuncBody.
 			g.Printf("return\n")
diff --git a/bind/testpkg/javapkg/classes.go b/bind/testpkg/javapkg/classes.go
index b4fea5a..f6cd17b 100644
--- a/bind/testpkg/javapkg/classes.go
+++ b/bind/testpkg/javapkg/classes.go
@@ -16,6 +16,7 @@
 	"Java/java/lang/Object"
 	"Java/java/lang/Runnable"
 	"Java/java/net"
+	"Java/java/nio"
 	"Java/java/util"
 	"Java/java/util/concurrent"
 	gopkg "Java/javapkg"
@@ -192,3 +193,8 @@
 // works.
 func NameClashingPackages(_ net.Socket, _ xnet.SocketFactory) {
 }
+
+func testReferenceToUnsupportedParameters() {
+	var ib nio.IntBuffer
+	ib.Put(nil)
+}