From 693ba6b7b7052e337eddd5e81836148a7bb8ac4c Mon Sep 17 00:00:00 2001 From: chloro <13125187405@163.com> Date: Sun, 23 Jun 2024 08:01:56 +0800 Subject: [PATCH] fix missed typecheck for TypeExpr --- include/wamon/type_checker.h | 2 +- src/type_checker.cc | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/wamon/type_checker.h b/include/wamon/type_checker.h index f1b217d..19aaca0 100644 --- a/include/wamon/type_checker.h +++ b/include/wamon/type_checker.h @@ -51,7 +51,7 @@ class TypeChecker { // 注意:全局变量和局部变量的类型合法性检测不在这个阶段进行,因为在语句合法性检测的时候所有函数结构体方法和全局变量都被解析,因此可以在语句合法性检测中检测 void CheckTypes(); - void CheckType(const std::unique_ptr& type, const std::string& context_info, bool can_be_void = false); + void CheckType(const std::unique_ptr& type, const std::string& context_info, bool can_be_void = false) const; // 检测全局变量的定义语句是否合法,全局变量的定义在包内是顺序相关的。 // 这应该是类型检测的第二个阶段(因为表达式合法性检测依赖名字查找,需要全局作用域的名字获得类型) diff --git a/src/type_checker.cc b/src/type_checker.cc index 82e5bee..9bfd3ea 100644 --- a/src/type_checker.cc +++ b/src/type_checker.cc @@ -73,7 +73,8 @@ void TypeChecker::CheckTypes() { } } -void TypeChecker::CheckType(const std::unique_ptr& type, const std::string& context_info, bool can_be_void) { +void TypeChecker::CheckType(const std::unique_ptr& type, const std::string& context_info, + bool can_be_void) const { if (IsFuncType(type)) { auto func_type = static_cast(type.get()); for (auto& param : func_type->param_type_) { @@ -708,6 +709,7 @@ std::unique_ptr TypeChecker::GetExpressionType(Expression* expr) const { return CheckParamTypeAndGetResultTypeForMethod(*this, tmp); } if (auto tmp = dynamic_cast(expr)) { + CheckType(tmp->GetType(), "check TypeExpr"); return tmp->GetType()->Clone(); } if (auto tmp = dynamic_cast(expr)) {