Skip to content

Cannot pass enum type as VAR_IN_OUT #1518

@leandrosansilva

Description

@leandrosansilva

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
As of from the latest master (75585ec), try compiling the following program:

(* program.st *)
TYPE OptResult : (
  OPT_RESULT_NONE,
  OPT_RESULT_SUCCESS,
  OPT_RESULT_FAILURE
);
END_TYPE

FUNCTION foo
VAR_IN_OUT
  result : OptResult;
END_VAR
  result := OptResult#OPT_RESULT_FAILURE;
END_FUNCTION

FUNCTION baz
VAR
  return_val : OptResult := OptResult#OPT_RESULT_NONE;
END_VAR
  foo(result := return_val); (* This binding should work, but at the moment it does not *)
END_FUNCTION

PROGRAM bar
  baz();
END_PROGRAM

You will get the following error:

error[E040]: Invalid enum value `return_val` for `OptResult`
   ┌─ /blah/program.st:20:17
   │
 2 │ TYPE OptResult : (
   │      --------- see also
   ·
20 │   foo(result := return_val); (* This binding should work, but at the moment it does not *)
   │                 ^^^^^^^^^^ Invalid enum value `return_val` for `OptResult`

Compilation aborted due to critical errors.
Hint: You can use `plc explain <ErrorCode>` for more information

Expected behavior

I would expect the compiler to understand I want to bind the variable return_val to the VAR_IN_OUT result, instead of assuming return_val to the the literal value for an enum.

Additional context
I have an existing codebase that builds well using an existing PLC industrial compiler, where such construction is widely used and working well. I am not sure on what the standard says, but such construction sounds sensible and I cannot imagine what would forbid it.

I've been hacking the rusty codebase recently and can work on a fix, but first I'd like to know whether such behaviour is expected or this is really a bug.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions