From f4d96cfa535f5a7f3740547e07856ab557288b76 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 9 Jul 2025 23:58:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9C=A8=E9=9D=9E=20void=20=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=B8=AD=E5=BC=BA=E5=88=B6=E4=BD=BF=E7=94=A8=20return?= =?UTF-8?q?=20=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 FunctionChecker 中添加一个检查,以确保具有非 void 返回类型的功能 类型必须至少包含一个返回节点。否则将引发语义错误。 --- .../compiler/semantic/core/FunctionChecker.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 语句" + )); + } + } } } }