diff --git a/.run/Demo1.run.xml b/.run/Demo1.run.xml
index 653910c..055866b 100644
--- a/.run/Demo1.run.xml
+++ b/.run/Demo1.run.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/.run/Demo10.run.xml b/.run/Demo10.run.xml
index 94bfc43..3f6bf8b 100644
--- a/.run/Demo10.run.xml
+++ b/.run/Demo10.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo12.run.xml b/.run/Demo12.run.xml
new file mode 100644
index 0000000..5d75b19
--- /dev/null
+++ b/.run/Demo12.run.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Demo2.run.xml b/.run/Demo2.run.xml
index 882e77a..3b10a4e 100644
--- a/.run/Demo2.run.xml
+++ b/.run/Demo2.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo3.run.xml b/.run/Demo3.run.xml
index a949e95..9d0224e 100644
--- a/.run/Demo3.run.xml
+++ b/.run/Demo3.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo4.run.xml b/.run/Demo4.run.xml
index 57afa15..a84cbe3 100644
--- a/.run/Demo4.run.xml
+++ b/.run/Demo4.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo5.run.xml b/.run/Demo5.run.xml
index cb543d1..e392f42 100644
--- a/.run/Demo5.run.xml
+++ b/.run/Demo5.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo6.run.xml b/.run/Demo6.run.xml
index b6c3fdc..a55fc8e 100644
--- a/.run/Demo6.run.xml
+++ b/.run/Demo6.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo7.run.xml b/.run/Demo7.run.xml
index 6f25770..e8479ec 100644
--- a/.run/Demo7.run.xml
+++ b/.run/Demo7.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo8.run.xml b/.run/Demo8.run.xml
index 4bb76fe..d4554e1 100644
--- a/.run/Demo8.run.xml
+++ b/.run/Demo8.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/.run/Demo9.run.xml b/.run/Demo9.run.xml
index a6bf203..1002732 100644
--- a/.run/Demo9.run.xml
+++ b/.run/Demo9.run.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/playground/BugFarm/Bug1/Main.snow b/playground/BugFarm/Bug1/Main.snow
index 4a13b7d..134096c 100644
--- a/playground/BugFarm/Bug1/Main.snow
+++ b/playground/BugFarm/Bug1/Main.snow
@@ -1,17 +1,21 @@
module: Main
function: main
- parameter:
return_type: int
body:
- declare n1: int =1
- declare n2: int =2
- declare n3: int =1
- if n1 ==1 then
- if n2 ==2 then
- n3 =3
- end if
- end if
- return n3
+ foo()
+
+ return 0
+ end body
+ end function
+
+ function: foo
+ return_type: int
+ body:
+ if false then
+ return 1
+ end if
+
+ return 0
end body
end function
end module
\ No newline at end of file
diff --git a/playground/Demo1/Main.snow b/playground/Demo/Demo1/Main.snow
similarity index 100%
rename from playground/Demo1/Main.snow
rename to playground/Demo/Demo1/Main.snow
diff --git a/playground/Demo1/Math.snow b/playground/Demo/Demo1/Math.snow
similarity index 100%
rename from playground/Demo1/Math.snow
rename to playground/Demo/Demo1/Math.snow
diff --git a/playground/Demo10/Main.snow b/playground/Demo/Demo10/Main.snow
similarity index 100%
rename from playground/Demo10/Main.snow
rename to playground/Demo/Demo10/Main.snow
diff --git a/playground/Demo11/Main.snow b/playground/Demo/Demo11/Main.snow
similarity index 100%
rename from playground/Demo11/Main.snow
rename to playground/Demo/Demo11/Main.snow
diff --git a/playground/Demo/Demo12/Main.snow b/playground/Demo/Demo12/Main.snow
new file mode 100644
index 0000000..134096c
--- /dev/null
+++ b/playground/Demo/Demo12/Main.snow
@@ -0,0 +1,21 @@
+module: Main
+ function: main
+ return_type: int
+ body:
+ foo()
+
+ return 0
+ end body
+ end function
+
+ function: foo
+ return_type: int
+ body:
+ if false then
+ return 1
+ end if
+
+ return 0
+ end body
+ end function
+end module
\ No newline at end of file
diff --git a/playground/Demo2/Main.snow b/playground/Demo/Demo2/Main.snow
similarity index 100%
rename from playground/Demo2/Main.snow
rename to playground/Demo/Demo2/Main.snow
diff --git a/playground/Demo3/Main.snow b/playground/Demo/Demo3/Main.snow
similarity index 100%
rename from playground/Demo3/Main.snow
rename to playground/Demo/Demo3/Main.snow
diff --git a/playground/Demo4/Main.snow b/playground/Demo/Demo4/Main.snow
similarity index 100%
rename from playground/Demo4/Main.snow
rename to playground/Demo/Demo4/Main.snow
diff --git a/playground/Demo5/Main.snow b/playground/Demo/Demo5/Main.snow
similarity index 100%
rename from playground/Demo5/Main.snow
rename to playground/Demo/Demo5/Main.snow
diff --git a/playground/Demo6/Main.snow b/playground/Demo/Demo6/Main.snow
similarity index 100%
rename from playground/Demo6/Main.snow
rename to playground/Demo/Demo6/Main.snow
diff --git a/playground/Demo7/Main.snow b/playground/Demo/Demo7/Main.snow
similarity index 100%
rename from playground/Demo7/Main.snow
rename to playground/Demo/Demo7/Main.snow
diff --git a/playground/Demo8/Main.snow b/playground/Demo/Demo8/Main.snow
similarity index 100%
rename from playground/Demo8/Main.snow
rename to playground/Demo/Demo8/Main.snow
diff --git a/playground/Demo9/Main.snow b/playground/Demo/Demo9/Main.snow
similarity index 100%
rename from playground/Demo9/Main.snow
rename to playground/Demo/Demo9/Main.snow
diff --git a/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java b/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java
index e6d69c3..66385b6 100644
--- a/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java
+++ b/src/main/java/org/jcnc/snow/compiler/semantic/core/FunctionChecker.java
@@ -2,11 +2,13 @@ package org.jcnc.snow.compiler.semantic.core;
import org.jcnc.snow.compiler.parser.ast.FunctionNode;
import org.jcnc.snow.compiler.parser.ast.ModuleNode;
+import org.jcnc.snow.compiler.parser.ast.ReturnNode;
import org.jcnc.snow.compiler.semantic.analyzers.base.StatementAnalyzer;
import org.jcnc.snow.compiler.semantic.error.SemanticError;
import org.jcnc.snow.compiler.semantic.symbol.Symbol;
import org.jcnc.snow.compiler.semantic.symbol.SymbolKind;
import org.jcnc.snow.compiler.semantic.symbol.SymbolTable;
+import org.jcnc.snow.compiler.semantic.type.BuiltinType;
/**
* {@code FunctionChecker} 是语义分析阶段中用于检查函数体语句合法性的调度器。
@@ -79,6 +81,19 @@ public record FunctionChecker(Context ctx) {
));
}
}
+
+ // 检查非 void 函数是否至少包含一条 return 语句
+ var returnType = ctx.parseType(fn.returnType());
+ if (returnType != BuiltinType.VOID) {
+ boolean hasReturn = fn.body().stream()
+ .anyMatch(stmtNode -> stmtNode instanceof ReturnNode);
+ if (!hasReturn) {
+ ctx.errors().add(new SemanticError(
+ fn,
+ "非 void 函数必须包含至少一条 return 语句"
+ ));
+ }
+ }
}
}
}