已开启
[BUG - STS Beta 测试] if-else/match 表达式条件分支普遍误报 unreachable 警告 #3074
小枫溪创建于  3月16日
小枫溪
小枫溪
3月16日 创建

🎉 感谢您参与仓颉编程语言 STS 1.1.0 Beta 测试活动!

📋 提交前必读

在提交 Bug 报告之前,请先确认:

  • 🔍 我已经搜索过现有的 Issues,确信这是一个新问题
  • ✅ 我正在使用 STS 1.1.0-Beta.23 版本
  • 📖 我已经阅读了 STS 版本说明说明书
  • 🔧 我已经准备好提供详细的复现步骤和环境信息


[x] 我正在使用 STS 1.1.0-Beta.23 版本

[x] 我已经搜索过现有的 Issues,确信这是一个新问题

[x] 我已经阅读了 STS 版本说明

[x] 我能够提供详细的复现步骤和代码示例

Bug 严重程度

🟢 低级(UI 显示、提示文本等)

Bug 分类

编译器(Compiler)相关

Bug 描述

编译器的控制流可达性分析存在严重缺陷,在以下两种常见场景中错误地报告"不可达代码"警告:

  1. if-else 链中的 else if 分支被误报为不可达

    • 官方文档明确支持 if-else 链(参见《开发指南》if 表达式章节)
    • 编译器却报告"unreachable block in 'if' expression"
    • 代码实际执行时该分支被正确执行
  2. match 表达式中的分支被误报为不可达

    • 编译器报告"unreachable block in '' expression"
    • 代码实际执行时该分支被正确匹配和执行

影响:

  • 产生大量误导性警告
  • 严重影响开发者体验
  • 降低代码质量评估的准确性
  • 可能掩盖真正的问题

复现步骤

  1. 创建一个新的仓颉项目
  2. 在 src/main.cj 中添加以下代码
  3. 执行 cjpm build
  4. 观察编译器输出中的警告信息

最小代码示例

### 示例 1: if-else 链误报

```cj
main() {
    let x = 15
    if (x > 20) {
        println("x > 20")
    } else if (x > 10) {
        println("x > 10")
    } else if (x > 0) {
        println("x > 0")
    } else {
        println("x <= 0")
    }
}

示例 2: match 表达式误报

main() {
    let grade = 85
    let label = match (grade) {
        case g where g >= 90 => "A"
        case g where g >= 80 => "B"
        case g where g >= 70 => "C"
        case _ => "D"
    }
    println("${label}")
}
### 期望行为
            
1. **编译应该成功通过**,不产生任何"unreachable"警告
2. **代码应该正确执行**:
   - 示例 1 应该输出:`x > 10`
   - 示例 2 应该输出:`B`
3. **编译器应该正确分析控制流**,只在真正不可达的代码处报告警告
### 实际行为
            
```shell
### 编译器警告输出
warning: unreachable block in 'if' expression
  ==> src/main.cj:89:17:
   | 
89 |       if (x > 20) {
   |  _________________^
90 | |         println("  x > 20")
91 | |     } else if (x > 10) {
   | |_____^ unreachable block in 'if' expression

warning: unreachable block in '' expression
   ==> src/main.cj:135:14:
    | 
135 |         case g where g >= 70 => "C"
    |              ^ unreachable block in '' expression

实际执行结果

x > 10  ✅ 正确执行
B       ✅ 正确执行

矛盾:编译器警告说代码不可达,但代码实际被正确执行了。

### 完整错误日志
            
```shell
```shell
$ cjpm build
cjpm build success

warning: unreachable block in 'if' expression
  ==> D:\cangjie\sts_beta\src\main.cj:89:17:
   | 
89 |       if (x > 20) {
   |  _________________^
90 | |         println("  x > 20")
91 | |     } else if (x > 10) {
   | |_____^ unreachable block in 'if' expression

warning: unreachable block in 'if' expression
  ==> D:\cangjie\sts_beta\src\main.cj:89:23:
   | 
89 |       if (x > 20) {
   |  _______________________^
90 | |         println("  x > 20")
91 | |     } else if (x > 10) {
   | |_____^ unreachable block in 'if' expression

warning: unreachable block in 'if' expression
  ==> D:\cangjie\sts_beta\src\main.cj:93:12:
   | 
93 |       } else if (x > 0) {
   |  ____________^
94 | |         println("  x > 0")
95 | |     } else {
   | |_____^ unreachable block in 'if' expression

warning: unreachable block in 'if' expression
  ==> D:\cangjie\sts_beta\src\main.cj:93:23:
   | 
93 |       } else if (x > 0) {
   |  _______________________^
94 | |         println("  x > 0")
95 | |     } else {
   | |_____^ unreachable block in 'if' expression

warning: unreachable block in 'if' expression
  ==> D:\cangjie\sts_beta\src\main.cj:95:12:
   | 
95 |       } else {
   |  ____________^
96 | |         println("  x <= 0")
97 | |     }
   | |_____^ unreachable block in 'if' expression

warning: unreachable block in '' expression
   ==> D:\cangjie\sts_beta\src\main.cj:135:14:
    | 
135 |         case g where g >= 70 => "C"
    |              ^ unreachable block in '' expression

warning: unreachable block in '' expression
   ==> D:\cangjie\sts_beta\src\main.cj:136:14:
    | 
136 |         case _ => "D"
    |              ^ unreachable block in '' expression

8 warnings generated, 8 warnings printed.

操作系统版本

Windows 11

开发环境

代码编辑器(无插件)

补充信息

贡献意愿


[x] 我愿意尝试修复这个 Bug 并提交 PR

[x] 我希望参与讨论修复方案

[ ] 我仅提供 Bug 报告,不参与开发

likedislike
小枫溪小枫溪
3月16日 添加了label:1.1.0-beta.23STS捉虫
Cangjie-ZhaoDanrongCangjie-ZhaoDanrong管理员
3月17日 将 zichexuelan 设为负责人
小枫溪小枫溪
3月17日 修改了issue 的描述
小枫溪小枫溪
3月17日 修改了issue 的描述
Cangjie-Sundaiyue
Cangjie-Sundaiyue管理员
3月19日 评论:

感谢反馈,当前已确认是问题。之前我们已经修复了部分场景的unreachable问题,目前排查仍有部分场景遗漏,我们计划重构相关代码,后续有新进展将在此issue下回复。

likedislike
Cangjie-SundaiyueCangjie-Sundaiyue管理员
7月24日 关联了pull request:fix(chir): refine unreachable warning diagnostics
Cangjie-SundaiyueCangjie-Sundaiyue管理员
7月24日 关联了pull request:test(chir): cover unreachable warning regressions
Cangjie-SundaiyueCangjie-Sundaiyue管理员
8月13日 关联了pull request:feat(chir): refine unreachable warning diagnostics
Cangjie-SundaiyueCangjie-Sundaiyue管理员
9月2日 关联了pull request:feat(chir): improve constant reachability analysis
Cangjie-SundaiyueCangjie-Sundaiyue管理员
9月2日 关联了pull request:test(chir): cover constant reachability