--- /dev/null
+package a
+
+// This file tests facts produced by ctrlflow.
+
+import (
+ "log"
+ "os"
+ "runtime"
+ "syscall"
+ "testing"
+
+ "lib"
+)
+
+var cond bool
+
+func a() { // want a:"noReturn"
+ if cond {
+ b()
+ } else {
+ for {
+ }
+ }
+}
+
+func b() { // want b:"noReturn"
+ select {}
+}
+
+func f(x int) { // no fact here
+ switch x {
+ case 0:
+ os.Exit(0)
+ case 1:
+ panic(0)
+ }
+ // default case returns
+}
+
+type T int
+
+func (T) method1() { // want method1:"noReturn"
+ a()
+}
+
+func (T) method2() { // (may return)
+ if cond {
+ a()
+ }
+}
+
+// Checking for the noreturn fact associated with F ensures that
+// ctrlflow proved each of the listed functions was "noReturn".
+//
+func standardFunctions(x int) { // want standardFunctions:"noReturn"
+ t := new(testing.T)
+ switch x {
+ case 0:
+ t.FailNow()
+ case 1:
+ t.Fatal()
+ case 2:
+ t.Fatalf("")
+ case 3:
+ t.Skip()
+ case 4:
+ t.SkipNow()
+ case 5:
+ t.Skipf("")
+ case 6:
+ log.Fatal()
+ case 7:
+ log.Fatalf("")
+ case 8:
+ log.Fatalln()
+ case 9:
+ os.Exit(0)
+ case 10:
+ syscall.Exit(0)
+ case 11:
+ runtime.Goexit()
+ case 12:
+ log.Panic()
+ case 13:
+ log.Panicln()
+ case 14:
+ log.Panicf("")
+ default:
+ panic(0)
+ }
+}
+
+// False positives are possible.
+// This function is marked noReturn but in fact returns.
+//
+func spurious() { // want spurious:"noReturn"
+ defer func() { recover() }()
+ panic(nil)
+}
+
+func noBody()
+
+func g() {
+ lib.CanReturn()
+}
+
+func h() { // want h:"noReturn"
+ lib.NoReturn()
+}