ballerina-platform / ballerina-lang

The Ballerina Programming Language
https://ballerina.io/
Apache License 2.0
3.58k stars 737 forks source link

[Bug]: Ballerina program crashes with a CCE when `self` is used as a variable #42772

Open lochana-chathura opened 4 months ago

lochana-chathura commented 4 months ago

Description

Consider the below code.

import ballerina/io;

public function main() {
    int self = 3;
    io:print(self);
}

It crashes with the following stacktrace.

stacktrace (click to expand) ``` [2024-05-17 17:36:20,554] SEVERE {b7a.log.crash} - class org.wso2.ballerinalang.compiler.semantics.model.types.BType cannot be cast to class org.wso2.ballerinalang.compiler.semantics.model.types.BObjectType (org.wso2.ballerinalang.compiler.semantics.model.types.BType and org.wso2.ballerinalang.compiler.semantics.model.types.BObjectType are in unnamed module of loader 'app') java.lang.ClassCastException: class org.wso2.ballerinalang.compiler.semantics.model.types.BType cannot be cast to class org.wso2.ballerinalang.compiler.semantics.model.types.BObjectType (org.wso2.ballerinalang.compiler.semantics.model.types.BType and org.wso2.ballerinalang.compiler.semantics.model.types.BObjectType are in unnamed module of loader 'app') at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.isFieldsInitializedForSelfInvocation(DataflowAnalyzer.java:1862) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.visit(DataflowAnalyzer.java:1664) at org.wso2.ballerinalang.compiler.tree.expressions.BLangInvocation.accept(BLangInvocation.java:128) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyzeNode(DataflowAnalyzer.java:2545) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.visit(DataflowAnalyzer.java:2128) at org.wso2.ballerinalang.compiler.tree.statements.BLangExpressionStmt.accept(BLangExpressionStmt.java:51) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyzeNode(DataflowAnalyzer.java:2545) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.visit(DataflowAnalyzer.java:474) at org.wso2.ballerinalang.compiler.tree.BLangBlockFunctionBody.accept(BLangBlockFunctionBody.java:60) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyzeNode(DataflowAnalyzer.java:2545) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyzeBranch(DataflowAnalyzer.java:2513) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.visit(DataflowAnalyzer.java:431) at org.wso2.ballerinalang.compiler.tree.BLangFunction.accept(BLangFunction.java:77) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyzeNode(DataflowAnalyzer.java:2545) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.visit(DataflowAnalyzer.java:346) at org.wso2.ballerinalang.compiler.tree.BLangPackage.accept(BLangPackage.java:167) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyzeNode(DataflowAnalyzer.java:2545) at org.wso2.ballerinalang.compiler.semantics.analyzer.DataflowAnalyzer.analyze(DataflowAnalyzer.java:316) at io.ballerina.projects.internal.CompilerPhaseRunner.dataflowAnalyze(CompilerPhaseRunner.java:196) at io.ballerina.projects.internal.CompilerPhaseRunner.performTypeCheckPhases(CompilerPhaseRunner.java:120) at io.ballerina.projects.ModuleContext.compileInternal(ModuleContext.java:435) at io.ballerina.projects.ModuleCompilationState$1.compile(ModuleCompilationState.java:45) at io.ballerina.projects.ModuleContext.compile(ModuleContext.java:383) at io.ballerina.projects.PackageCompilation.compileModulesInternal(PackageCompilation.java:211) at io.ballerina.projects.PackageCompilation.compileModules(PackageCompilation.java:195) at io.ballerina.projects.PackageCompilation.compile(PackageCompilation.java:102) at io.ballerina.projects.PackageCompilation.from(PackageCompilation.java:97) at io.ballerina.projects.PackageContext.getPackageCompilation(PackageContext.java:244) at io.ballerina.projects.Package.getCompilation(Package.java:150) at io.ballerina.projects.Package.runCodeGeneratorPlugins(Package.java:323) at io.ballerina.cli.task.CompileTask.execute(CompileTask.java:153) at io.ballerina.cli.TaskExecutor.executeTasks(TaskExecutor.java:40) at io.ballerina.cli.cmd.RunCommand.execute(RunCommand.java:258) at java.base/java.util.Optional.ifPresent(Optional.java:178) at io.ballerina.cli.launcher.Main.main(Main.java:58) ```

Affected Version(s)

2201.8.5 at least

dulajdilshan commented 4 months ago

This behaviour is the same when we use 'self (quoted 'self`)

import ballerina/io;

public function main() {
    int 'self = 3;
    io:print('self);
}